Skip to main content
Glama

NoiseFloor

MCP Badge

What changed, what is repeated, and what can the evidence support?

A modular, offline toolkit for research desks, monitoring systems and AI agents. Python 3.9+, MIT, zero runtime dependencies. The same pure functions work through Python, JSON CLI, REST and MCP.

NoiseFloor checks market observations, groups repeated headlines, exposes data gaps and grades forecasts. It does not fetch feeds, call a model, retain your portfolio or execute trades.

Start with your research task

Your task

First step

What stays with the result

Inspect shared-factor concentration

Open the correlation workbench and run a labeled synthetic example

Alignment, source restrictions, gaps and reference assumptions

Review changing market observations

Follow the market input guide with your permitted observations

Observation clocks, visibility gaps and descriptive review priorities

Reduce repeated headlines

Run the self-contained Python example below

Original events, changed quantities and conflicting reports

Connect an API or MCP client

Open the client kit

The same bounded input contract across transports

Use Python or the CLI locally for private observations. The browser workbench submits the selected example only when you run it; its bundled examples are synthetic. Public financial-source retrieval is a separate workflow in the Financial Evidence connection guide.

Release 0.4.0 introduced correlation spectra, shared-factor concentration, an experimental correlation-cleaning candidate and rolling diagnostics, plus a separate synthetic Dyson Brownian-motion simulator. See the product applications and methods.

Try the live correlation and Dyson workbench with explicitly synthetic examples for LiquiLens, Seiche, Undertow, Riptide, Palimpsest and trading-agent research. The API client kit includes OpenAPI, Postman, Bruno, HTTP and local Python workflows. Browser requests go to the public service only when you run them; use Python locally for private panels.

Related MCP server: backtest-reality-check

Get your first result

Install the package; no repository checkout, API key or model is required:

python3 -m pip install --upgrade noisefloor
noisefloor capabilities

Run this Python example with two explicitly synthetic headlines. The fixed observation clock makes the result reproducible:

import json
from pathlib import Path
from noisefloor import narrative

primary = {
    "id": "synthetic-filing",
    "title": "Example Bank reports deposit growth of 5 percent",
    "published_at": "2026-10-08T10:00:00Z",
    "entities": ["EXAMPLE-BANK"],
    "source": {"id": "synthetic-issuer", "kind": "primary"},
}
copy = {
    **primary,
    "id": "synthetic-headline",
    "source": {"id": "synthetic-wire", "kind": "reporting"},
}
request = {
    "events": [primary, copy],
    "as_of": "2026-10-08T12:00:00Z",
    "focus": ["EXAMPLE-BANK"],
}
report = narrative.triage(**request)
print(len(report["events"]), len(report["attention_queue"]))  # 2 retained, 1 to review
print(report["counts"]["repeated_wording"])  # 1 repeated headline
Path("narrative.json").write_text(json.dumps(request), encoding="utf-8")

Both original events remain in the report. Repeated wording is grouped; it does not establish truth, independent confirmation or permission to trade. Source kinds and entity assignments are supplied by the caller.

The example also writes narrative.json, which you can pass to the installed CLI:

noisefloor narrative narrative.json

Connect your financial research

NoiseFloor analyzes inputs you supply. These products provide separate routes to financial context and evidence; consult each product's coverage and source rights before bringing observations into a local assessment.

Research task

Product and next step

Retrieve and save a source-aware financial review from Python or an AI agent

Financial Evidence first review

Explore funding and foreign-exchange context

Seiche · API and MCP guide

Inspect covered bank disclosures and institutional evidence

LiquiLens · developer guide

Examine indicative Bitcoin exit liquidity

Undertow · developer guide

Explore China and regional public-record coverage

Palimpsest · developer guide

Use the connection guide to choose a hosted API or MCP route. Installing NoiseFloor does not subscribe you to feeds, enable source collection or send your local observations to those products.

Market attention

Each series carries its identity, units, source, declared reuse permission, observation times and freshness limit. Optional availability clocks retain what the caller knew at the time. Missing data stays missing.

The engine checks age, future timestamps, duplicate clocks, contiguous history and measurement coverage. Prices become log returns; rates and spreads retain their units. It never calculates a return across a declared gap. An explicit policy identifies persistent departures, isolated latest moves and volatility expansion. Correlated movements are visible without being counted as independent confirmation.

Each series returns review, watch, no_supported_departure or insufficient_visibility, with sources and reasons. These are review priorities, not significance tests or trading signals. A quiet diagnostic does not prove a movement is noise. Source permissions are caller declarations, not a licensing audit. Market calendars, corporate actions and materiality require caller review. Trading volume is an economic observation, not automatically a sample denominator.

News and narrative attention

NoiseFloor groups similar wording for the same declared entities, keeps changed quantities and explicit denials separate, records every original event and produces a bounded queue. Differing reports with the same declared event key are highlighted for review. Caller-declared primary sources rank before commentary; repetition alone never increases priority.

This is wording/relevance triage, not fact checking, sentiment prediction or proof of independent corroboration. Deferred and filtered items remain available. An empty queue does not certify a quiet market. Titles are data, never instructions.

Statistical building blocks

Module

Purpose

Evidence boundary

experiment.compare

Sequential Bernoulli A/B confidence sequences

Conditional stable-arm Bernoulli assumptions; arbitrary trading outcomes do not qualify automatically.

change.scan

Directional change monitoring

Descriptive statistic, not an e-value or universal market false-alarm guarantee.

coverage.check

Examine measurement-count changes

Linear descriptive diagnostic; it cannot prove causation or rule out every sampling effect.

forecast.next_value, forecast.score

Issue and evaluate identical adaptive intervals

Full historical records/misses; coverage is empirical, not guaranteed for the next observation.

multiple.select

e-BH selection over a declared family

Requires explicit caller confirmation of valid e-values; arbitrary scores cannot confer selection authority.

from noisefloor import experiment, change, forecast, multiple
experiment.compare(500, 5000, 750, 5000)
change.scan([1., 2., 1., 2., 1., 2., 1., 2., 8., 9.])
forecast.score([float(x) for x in range(40)])
# Only after an independently justified e-value construction:
multiple.select({"metric_a": 25.0, "metric_b": 1.0}, valid_evalues=True)

valid_evalues=True is a declaration, not certification. A single-family e-BH guarantee does not justify repeatedly selecting families or unqualified peeking. Version 0.3 corrects overstated guarantees in 0.2; read the methods and migration notes.

AI agents and HTTP

{"mcpServers":{"noisefloor":{"command":"uvx","args":["--from","noisefloor","noisefloor-mcp"]}}}

Ten MCP tools: market_assessment, narrative_triage, ab_test, did_it_change, real_or_sampling, forecast_next, score_forecasts, which_metrics_matter, spectral_assessment, dyson_reference. Results include structured JSON. The spectral assessment is descriptive research; the Dyson reference is a synthetic simulation, not a fitted market model.

noisefloor-mcp-http --host 127.0.0.1 --port 8792

In another terminal, use the narrative.json written by the Python example:

curl http://127.0.0.1:8792/v1/capabilities
curl -H 'Content-Type: application/json' --data-binary @narrative.json http://127.0.0.1:8792/v1/narrative/triage

REST: POST /v1/market/assess, POST /v1/narrative/triage, POST /v1/spectral/assess, POST /v1/research/dyson. The hosted API base is https://api.seiche.info/noisefloor; the hosted MCP endpoint is https://api.seiche.info/noisefloor/mcp. Research routes: POST /v1/spectral/assess, POST /v1/research/dyson. Discovery: GET /v1/capabilities, GET /openapi.json; MCP: POST /mcp. Self-host behind your TLS/authentication and quota layer. HTTP logs bounded operation/outcome labels, not submitted observations, titles or request targets.

Hosted MCP: https://api.seiche.info/noisefloor/mcp. Check its health/version and tool list before assuming a package release is deployed there. Package, registry and host acceptance are separate states.

mcp-name: io.github.beepboop2025/noisefloor

Modular by design

Bring permitted data through the offline adapters. The Financial Evidence adapter preserves institution, metric, unit, source, rights and knowledge clocks without importing its SDK. LiquiLens institution evidence, Seiche funding, Undertow liquidity and Palimpsest coverage can remain separate while using common diagnostics. This does not imply those products already run this release.

Request/policy SHA-256 digests support identity checks and replay; they are not signatures or proof of source truth. No runtime network, model, database or paid API dependency is required.

Verification

For contributors working from a source checkout:

pip install -e '.[dev]'
pytest -q

Tests cover issued/scored forecast parity, invalid statistical composition, stale/future/missing observations, transforms, coverage shifts, repeated and conflicting wording, privacy and Python/CLI/REST/MCP parity. Synthetic calibration checks do not establish live-market accuracy, profitability or failure prediction.

Origin and licence

Built from measurement-quality work for Palimpsest. MIT. Source and methods are inspectable; results retain their assumptions.

Available Tools

10 tools
ab_testPeek-safe A/B verdictA
Read-onlyIdempotent
Inspect

Compare two cumulative binary-outcome experiment arms to decide whether either success rate is higher. Use for conversions or other Bernoulli outcomes with constant conditional success probabilities; use did_it_change for an ordered numeric metric, not these counts. The beta-binomial confidence sequences split alpha across arms, allowing repeated looks under the stated sampling assumptions. Do not substitute selected windows, continuous returns or changing-probability outcomes. Returns decided, winner (label or null), reading, and each label's successes/n/rate/interval; rates and bounds are fractions in [0,1]. Zero totals are allowed and leave the test undecided. No winner means overlapping intervals, not equal rates. Invalid counts (including successes > total) or duplicate/reserved labels return a tool error. Example: {"a_successes":40,"a_total":100,"b_successes":55,"b_total":100}.

ParametersJSON Schema
NameRequiredDescriptionDefault
alphaNoTotal error budget shared by both confidence sequences; default 0.05 means 5%, split equally between arms. Must be strictly between 0 and 1.
a_labelNoArm A's output key and possible winner label; default A. Must differ from b_label and not replace result keys such as decided, winner or reading.A
a_totalYesCumulative trials in arm A, including successes and failures. Zero is valid and returns an undecided result.
b_labelNoArm B's output key and possible winner label; default B. Must differ from a_label and not replace result keys such as alpha, method or validity.B
b_totalYesCumulative trials in arm B, including successes and failures. Counts must use the same pre-defined experiment and outcome as arm A.
a_successesYesCumulative successful binary outcomes in arm A, an integer from 0 through a_total; do not supply a percentage.
b_successesYesCumulative successful binary outcomes in arm B, an integer from 0 through b_total; do not supply a percentage.

Output Schema

ParametersJSON Schema
NameRequiredDescription
alphaNoTotal error budget split across the arms, as a fraction.
errorNoA string on tool error, or a successful arm object when the caller labels that arm error; inspect MCP isError.
methodNoConfidence-sequence method and reference.
winnerNoWinning caller-supplied arm label; null when undecided. Null means unavailable or not applicable, never zero.
decidedNoWhether the two confidence sequences are disjoint.
readingNoInterpretation of the current comparison.
validityNoGuarantees are conditional on the Bernoulli sampling model.
guaranteeNoConditional confidence-sequence guarantee; not a market-performance claim.
assumptionsNoOrdered statements or identifiers.
safe_to_peekNoRepeated looks are allowed only under the stated Bernoulli assumptions.
what_would_decide_itNoQualitative guidance for an undecided comparison with data in both arms.
observed_difference_ppNoB's observed success rate minus A's, in percentage points; present only for undecided nonempty arms.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say this is a safe read; the description goes well beyond that by disclosing the statistical method and its assumption (beta-binomial confidence sequences splitting alpha across arms, peek-safe under stated sampling assumptions), the error contract (invalid counts, successes > total, duplicate/reserved labels raise a tool error), and the interpretation caveat that 'no winner' means overlapping intervals rather than equal rates. The one redundancy — listing returned fields — is covered by the output schema, but the rest is genuinely additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense but front-loaded paragraph: purpose first, then routing, assumptions, return shape, edge cases, and an example. Nearly every sentence earns its place, though the return-field enumeration partly duplicates the output schema and adds length without new routing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, full schema coverage, an output schema, and read-only/idempotent annotations, the description still covers the things structured fields cannot: sampling assumptions, error conditions, zero-total behavior, and how to read an undecided verdict. An agent has everything needed to call this correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 a concrete worked example ({"a_successes":40,"a_total":100,"b_successes":55,"b_total":100}) that pins down the expected integer-count form and reinforces 'do not supply a percentage'. It adds little beyond the schema on alpha and labels, so it stays below a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compare two cumulative binary-outcome experiment arms to decide whether either success rate is higher') and immediately names the sibling it is not ('use did_it_change for an ordered numeric metric'). An agent can route between ab_test and did_it_change without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('conversions or other Bernoulli outcomes with constant conditional success probabilities'), an explicit alternative with its selecting condition ('did_it_change for an ordered numeric metric'), and explicit exclusions ('do not substitute selected windows, continuous returns or changing-probability outcomes'). Nothing 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.

did_it_changeDescribe a metric changeA
Read-onlyIdempotent
Inspect

Scan one chronological numeric metric for departures from its own preceding observations, using a descriptive rank-based Shiryaev-Roberts monitor. Use this for a change-review queue; choose real_or_sampling when a measurement denominator may explain the movement, market_assessment when source/freshness gates matter, or spectral_assessment for a multi-series correlation panel. The first eight readings warm up the reference; comparison starts at reading nine. An alarm resets the reference and starts warmup again. Returns state (warming_up, steady, watch, changed), monitoring_statistic, direction, zero-based change_points and effect (delta in input units, robust_z, percentile from 0 to 100). The evidence field is a compatibility alias, not a calibrated e-value or p-value; never use it to assert valid_evalues in which_metrics_matter. No alarm does not establish stability. Example: {"values":[10,11,9,10,12,10,9,11,20]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesOne to 2048 finite readings in chronological order, oldest first, with consistent units and cadence. The last entry is the current reading; no dates or missing values are inferred.
half_lifeNoOptional positive half-life measured in prior observations, not seconds. A reading this many positions older receives half the rank weight. Omit for equal weights; weighting remains descriptive, not calibrated.
two_sidedNoDefault true monitors upward and downward departures, with watch/changed thresholds 200/1000. False monitors upward only, with thresholds 100/500; thresholds are descriptive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nNoNumber of supplied observations.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
stateNoCurrent descriptive monitor state.
effectNoLatest reading compared with the current post-reset reference.
methodNoMonitor construction and one-sided/two-sided mode.
readingNoInterpretation, including remaining warmup requirements.
evidenceNoCompatibility alias of monitoring_statistic; not an e-value.
validityNoDescriptive assessment, not a probability or statistical certificate.
watch_atNoDescriptive watch threshold.
weightedNoWhether half-life weighting was requested.
directionNoDirection driving the positive monitor statistic. Null means unavailable or not applicable, never zero.
guaranteeNoNo statistical or market-performance guarantee is made.
changed_atNoDescriptive alarm threshold.
is_e_valueNoThe statistic is not a calibrated e-value.
assumptionsNoOrdered statements or identifiers.
change_pointsNoHistorical alarm indices.
interpretationNoLimits on interpreting a threshold crossing.
statistic_typeNoMonitor family.
monitoring_statisticNoDescriptive Shiryaev-Roberts statistic.
effect_reference_sizeNoPreceding observations in the current reference.
readings_since_changeNoObservations after the most recent alarm. Null means unavailable or not applicable, never zero.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as read-only, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: an eight-reading warmup, alarm-triggered reference reset, the caveat that the evidence field is a compatibility alias rather than a calibrated e-value, and that no alarm does not establish stability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and the routing guidance before the mechanics and return values. Dense but each sentence carries load; only the enumerated output-field dump and the JSON example feel slightly padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete given the complexity: routing, warmup semantics, state values, output fields, a caveat about the evidence alias, and a runnable example. Even though an output schema exists, the prose explains semantics an agent needs to interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 values, half_life, and two_sided thresholds, matching the baseline of 3. The description restates the warmup/threshold behavior in prose but adds no parameter syntax or format detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource (scan a chronological numeric metric for departures) and distinguishes itself from siblings by naming real_or_sampling, market_assessment, and spectral_assessment with the conditions that select each. An agent can route between tools 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool (change-review queue) and, critically, when to use each alternative instead. It also adds a negative usage rule: do not use the evidence field to assert valid_evalues in which_metrics_matter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dyson_referenceSimulate synthetic eigenvalue repulsionA
Read-onlyIdempotent
Inspect

Generate a seeded synthetic real-symmetric Brownian-matrix path to illustrate eigenvalue repulsion (beta=1). Use for reproducible numerical education or research references; choose spectral_assessment to analyze observed market panels. No market data is accepted or fetched. All arguments are optional: defaults are dimension=6, steps=40, dt=0.05 and seed=0. Returns status=synthetic, parameters, beta, normalization and path with steps+1 snapshots; each snapshot contains synthetic time and ordered eigenvalues, starting from all zeros. Negative eigenvalues are valid because this is not a covariance matrix. There is no mean reversion, market calibration or factor identity tracking. Reuse seed with the recorded runtime and implementation fingerprint for replay. Out-of-range or noninteger size/step/seed inputs return a tool error. Example: {"dimension":3,"steps":5,"dt":0.05,"seed":7}.

ParametersJSON Schema
NameRequiredDescriptionDefault
dtNoSynthetic time increment; default 0.05. This is not seconds or a market horizon. Off-diagonal increment variance is dt/N; diagonal variance is 2*dt/N.
seedNoInteger random seed for deterministic replay in a recorded Python runtime; default 0. Record the implementation fingerprint and runtime with results.
stepsNoNumber of Brownian increments; default 40. The returned path contains steps + 1 snapshots, including the initial zero matrix.
dimensionNoSize N of the synthetic real-symmetric N-by-N matrix and number of eigenvalues per step; default 6.

Output Schema

ParametersJSON Schema
NameRequiredDescription
betaNoReal-symmetric reference beta.
pathNoInitial zero spectrum followed by every simulated step.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
limitsNoOrdered statements or identifiers.
schemaNoResult contract identifier.
statusNoSynthetic output.
maturityNoResearch maturity.
validityNoSynthetic reference only.
guaranteeNoNo statistical or market-performance guarantee is made.
parametersNoFully applied parameters.
normalizationNoIncrement variance convention.
mean_reversionNoUnconfined Brownian reference.
request_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
initial_conditionNoInitial matrix.
market_calibratedNoNot calibrated to markets.
execution_authorityNoNo trading authority.
is_covariance_modelNoNegative eigenvalues are possible; not a covariance model.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds substantial behavior beyond them: the returned status/parameters/beta/normalization/path shape, that negative eigenvalues are valid and why, the absence of mean reversion/calibration/factor identity, that out-of-range or noninteger inputs produce a tool error, and the seed-plus-runtime-fingerprint replay caveat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with purpose and the routing decision before the return/behavioral detail, and every paragraph carries information. Minor redundancy in restating the four defaults that the schema already declares, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter synthetic generator with an output schema already present, the description still supplies the behavioral constraints an agent needs: what is returned, what it is not (not a covariance matrix, no market calibration), error conditions, and replay reproducibility. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 four parameters including ranges, defaults, and variance semantics. The description largely restates the defaults and the steps+1 snapshot relation rather than adding new parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Generate a seeded synthetic real-symmetric Brownian-matrix path') plus the purpose (illustrate eigenvalue repulsion, beta=1). It explicitly names the sibling it is not — 'choose spectral_assessment to analyze observed market panels' — so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use it ('reproducible numerical education or research references'), names the alternative tool for the adjacent use case (spectral_assessment for observed market panels), and states the exclusion clearly ('No market data is accepted or fetched'). Nothing 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.

forecast_nextEmpirical next-value intervalA
Read-onlyIdempotent
Inspect

Estimate the next observation of one numeric series using the last value as a point forecast and adaptive historical absolute-error quantiles for an empirical interval. Use for a one-step baseline or uncertainty display; choose score_forecasts to check this same method on historical prefixes before relying on it. At least 11 chronological readings are required; shorter valid histories return ok=false with reading. Successful results contain ok=true, forecast, interval [lower, upper], nominal_coverage, adaptive_alpha and error_history_size. Forecast and bounds use the input's units; the horizon is one supplied observation, not a timestamp or market session. Coverage is a target, not a next-step or changing-market guarantee. This does not fetch prices or train a custom model. Example: {"values":[10,11,10,12,11,13,12,13,14,13,15],"nominal":0.8}.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesOne to 2048 finite chronological observations, oldest first, in consistent units and cadence. At least 11 readings are needed for ten prior one-step errors; no missing values, date interpolation or resampling.
nominalNoTarget empirical interval coverage as a fraction strictly between 0 and 1; default 0.80 means 80%, not 80. The adaptive feedback does not guarantee the next observation is covered.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoFalse denotes insufficient history; forecast or scoring fields are then absent.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
methodNoShared forecast issuance and scoring method.
caveatsNoOrdered statements or identifiers.
readingNoResult interpretation or minimum-history requirement.
forecastNoOne-step random-walk point forecast in input units.
intervalNoLower and upper bounds, in that order.
validityNoCoverage is empirical only.
guaranteeNoNo statistical or market-performance guarantee is made.
adaptive_alphaNoClipped adaptive miscoverage parameter as a fraction.
nominal_coverageNoRequested target coverage as a fraction, not a guarantee.
error_history_sizeNoHistorical absolute errors used before issuing this forecast.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: the 11-reading minimum, the ok=false failure path, the fields returned on success, and the caveat that coverage is a target rather than a guarantee. This is solid added value, though the return-field listing overlaps the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose before requirements, results and caveats, and the example anchors the call. It is on the long side and repeats some schema content (the 11-reading rule, the coverage caveat), which costs a point but every clause remains informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, alternatives, prerequisites, failure behavior and interpretation caveats for a two-parameter tool, and an output schema exists so return values need no further explanation. Nothing an agent needs 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented (chronological ordering, unit consistency, the 11-reading rationale, and the 0-1 fraction semantics of nominal). The description largely restates these ('At least 11 chronological readings are required') and adds only the nuance that the horizon is one supplied observation, not a timestamp. Baseline 3 is appropriate when the schema carries the detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Estimate the next observation of one numeric series') and explains the method (last value as point forecast, adaptive historical absolute-error quantiles). It explicitly distinguishes itself from the sibling score_forecasts, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('one-step baseline or uncertainty display') and names the alternative with the condition that selects it ('choose score_forecasts to check this same method on historical prefixes before relying on it'). It also states when-not-to-use by ruling out fetching prices and training custom models.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

market_assessmentReview market noise and evidence qualityA
Read-onlyIdempotent
Inspect

Build a source-aware review queue for caller-supplied market series at an explicit UTC as_of cutoff, checking moves, volatility, missing data and measurement coverage. Use when provenance and freshness matter; use did_it_change for an unannotated numeric history or spectral_assessment for correlation structure across an aligned panel. Prices become log returns; other kinds retain their supplied values and units. Defaults require 30 baseline + 3 recent derived points (34 contiguous price observations, 33 for other kinds). Returns status (assessed, partial or insufficient_visibility), per-series status/reasons/diagnostics, attention_queue, visibility_gaps, related_movements and coverage. Nonpermitted rights, stale/future observations or inadequate history remain explicit gaps; no sources are fetched or filled. Duplicate ids, unordered timestamps and nonpositive prices are errors. Read limits and source clocks before interpreting a departure: review priority is neither a trading signal nor a calibrated probability.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofYesUTC decision-time cutoff for source freshness and availability checks; for example 2026-01-01T12:00:00Z. Future observations are not silently included.
policyNoOptional review thresholds; omitted fields use the documented defaults. Policies do not create statistical or trading guarantees.
seriesYesUp to 32 caller-supplied series to assess independently, with unique ids and source/clock metadata. An empty list returns insufficient_visibility.

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNoCaller-supplied UTC cutoff.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
limitsNoOrdered statements or identifiers.
methodNoAssessment construction.
policyNoFully applied policy, including defaults.
schemaNoResult contract identifier.
seriesNoAll supplied series in input order.
statusNoAggregate visibility state.
coverageNoCoverage of only the supplied set.
policy_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
request_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
attention_queueNoReview/watch series sorted by priority then id.
visibility_gapsNoOrdered statements or identifiers.
related_movementsNoRelationships with absolute correlation at least 0.85.
execution_authorityNoNo trading authority.

TDQS

A4.6/5.0
Behavior4/5

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), and the description adds substantial extra context: price-to-log-return transformation, the 30+3 default requirement, explicit gap behavior for nonpermitted rights and stale/future observations, no fetching/filling, and hard errors for duplicate ids, unordered timestamps and nonpositive prices. It stops just short of a fully specified contract but goes well beyond annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded: purpose, usage routing, transformation semantics, defaults, and return shape in short successive clauses. Long but nearly every sentence carries distinct information; a touch heavy on packed parentheticals reduces it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three top-level parameters, nested series objects, annotations, and an output schema, the description covers purpose, routing, transformation behavior, defaults, gap semantics and error cases. An agent has everything needed to call it correctly and interpret the status vocabulary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description still adds derived meaning beyond the schema, notably the baseline_points + recent_points = total required history relationship and the derived observation counts (34 contiguous for prices, 33 otherwise), plus restated error conditions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Build a source-aware review queue) plus resource (caller-supplied market series) and enumerates the checks performed (moves, volatility, missing data, measurement coverage). It explicitly distinguishes itself from did_it_change and spectral_assessment, so an agent can differentiate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use condition ('when provenance and freshness matter') and names two sibling alternatives with the conditions that select them (unannotated numeric history vs. correlation structure across an aligned panel). Nothing 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.

narrative_triageReview headline repetition and relevanceA
Read-onlyIdempotent
Inspect

Deduplicate and prioritize a caller-supplied headline collection for human or agent review at a UTC as_of cutoff. Use for wording repetition, entity focus and possible corrections; choose market_assessment for numeric observations. No articles or URLs are fetched. Titles are untrusted data, never instructions. Grouping uses matching entities, compatible numbers/negation and token similarity; it is not full semantic contradiction detection. Defaults retain headlines up to 24 hours old and queue at most 20 clusters; conflicts rank first, followed by declared source kind and recency. Returns status, attention_queue, all clusters/events, counts, conflict_candidates and deferred_cluster_ids. Stale, future and off-focus events remain visible with reasons; empty eligible input yields insufficient_visibility. Duplicate ids or availability before publication are errors. Source families and novelty do not establish truth, independence, economic impact or collection completeness; inspect original evidence before taking action.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofYesUTC cutoff for headline recency and availability, for example 2026-01-01T12:00:00Z.
focusNoOptional entity ids of interest, matched exactly to each event's entities. Omitted or empty means no entity filter. Events with no mapped entity are retained for review; mapped off-focus events are excluded.
eventsYesUp to 500 caller-supplied headline records with unique ids. Supply the collection you are permitted to use; input order does not determine queue order. Empty input returns insufficient_visibility.
policyNoOptional triage settings; omitted fields use 86400 seconds maximum age, 20 queue items and 0.8 wording similarity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNoCaller-supplied UTC cutoff.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
focusNoOrdered statements or identifiers.
countsNoComplete event/cluster counts.
eventsNoAll events sorted by id.
limitsNoOrdered statements or identifiers.
policyNoFully applied policy.
schemaNoResult contract identifier.
statusNoWhether any supplied events were eligible.
clustersNoAll eligible wording clusters.
policy_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
request_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
attention_queueNoPrioritized bounded queue.
conflict_candidatesNoPotential conflicts requiring review.
execution_authorityNoNo trading authority.
deferred_cluster_idsNoOrdered statements or identifiers.
source_universe_completeNoCollection completeness is unknown.

TDQS

A4.6/5.0
Behavior5/5

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), yet the description adds substantial context: default retention window and queue cap, cluster ranking order, enumerated return fields, conditions that produce insufficient_visibility, error triggers (duplicate ids, availability before publication), and an explicit statement about the limits of grouping (not full semantic contradiction detection). It also flags untrusted-title handling, which is not expressible in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and routing, then defaults, ranking, return shape and caveats. Information-dense and mostly waste-free, though the closing caveat chain ('Source families and novelty do not establish truth...') runs long and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-object, 4-parameter tool with an output schema, the description covers purpose, routing, defaults, ranking, error states, degraded outcomes and trust caveats. Even though return values are documented in the output schema, the description still names the key fields, leaving nothing an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both required and optional parameters are already fully documented in the schema. The description restates a few defaults and the ranking order but adds no parameter syntax or format meaning beyond what the schema supplies, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair and resource ('Deduplicate and prioritize a caller-supplied headline collection') with the review context, and explicitly distinguishes itself from a named sibling ('choose market_assessment for numeric observations'). An agent can differentiate it from siblings 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit use cases (wording repetition, entity focus, possible corrections), names the alternative tool to use instead for numeric observations, and rules out a common expectation ('No articles or URLs are fetched'). This is genuine when-to-use versus when-to-use-something-else guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

real_or_samplingMetric and sample-size movementA
Read-onlyIdempotent
Inspect

Review whether the latest numeric metric departure persists after accounting for its historical linear association with measurement sample size. Use when both a dashboard metric and its coverage denominator are available; choose did_it_change when no denominator is known. Requires at least ten aligned pairs; shorter valid arrays return NOT_ENOUGH_HISTORY. The latest pair is excluded from the historical fit. Returns verdict, assessment, reading and, when estimable, metric_delta in input units, standardized departures, sample_size_change_pct as a percent of the historical median, fit and departure_after_conditioning. Prefer assessment/validity over legacy REAL or SAMPLING_ARTIFACT labels: linear association neither proves a sampling cause nor excludes confounding. Constant or weakly related histories can return UNCLEAR and null standardized values. Unequal array lengths or nonpositive sample sizes return a tool error.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesChronological metric readings in consistent units, one per sample_sizes entry. At least 10 aligned pairs are needed; all earlier pairs form the reference for the latest reading.
sample_sizesYesPositive measurement denominators aligned one-for-one with values. Equal array length is required. Zero coverage is missing data, not a valid denominator; economic trading volume is not measurement coverage.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fitNoHistorical linear association, when estimable.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
methodNoDescriptive denominator-conditioning method.
caveatsNoOrdered statements or identifiers.
n_pairsNoNumber of aligned metric/measurement-denominator pairs.
readingNoExplanation and limits of the result.
verdictNoLegacy descriptive result code.
validityNoDescriptive assessment, not a probability or statistical certificate.
guaranteeNoNo statistical or market-performance guarantee is made.
is_causalNoAssociation does not establish causality.
assessmentNoPreferred interpretation of the legacy verdict.
metric_nowNoLatest metric in input units.
metric_deltaNoLatest metric minus historical median, in input units.
sample_size_nowNoLatest declared measurement denominator.
metric_departureNoRobust standardized latest metric departure. Null means unavailable or not applicable, never zero.
sample_size_departureNoRobust standardized denominator departure. Null means unavailable or not applicable, never zero.
zero_reference_spreadNoHistorical metric MAD is zero.
sample_size_change_pctNoDenominator change as percent of its historical median.
denominator_extrapolationNoLatest denominator falls outside the historical range.
departure_after_conditioningNoRobust standardized latest residual after linear conditioning. Null means unavailable or not applicable, never zero.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only establish that this is a safe, idempotent read. The description goes well beyond that: the latest pair is excluded from the fit, short valid arrays return NOT_ENOUGH_HISTORY, constant or weakly related histories can return UNCLEAR with null standardized values, and unequal lengths or nonpositive sample sizes raise a tool error. These are exactly the failure modes an agent needs to anticipate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and usage are front-loaded, then behavior, then return fields, then edge cases, in a logical order with no filler sentences. It is dense and long for a two-parameter tool, and the return-value sentence partially duplicates the output schema, which costs it a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers preconditions, the excluded observation, error and degenerate-result semantics, interpretation caveats, and the sibling alternative. With an output schema present the description need not explain return values, yet its brief list does no harm and the definition is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents chronology, one-for-one alignment, positivity and the trading-volume caveat. The description reinforces the ten-pair minimum and the equal-length requirement but adds little parameter-level meaning the schema does not already carry, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific operation (test whether the latest metric departure survives conditioning on sample size) with the exact resource, and the second sentence explicitly contrasts it with the sibling did_it_change. An agent can distinguish it from did_it_change, forecast_next and which_metrics_matter 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the selection condition directly: use when both a metric and its coverage denominator exist, otherwise use did_it_change. It also adds a hard precondition (at least ten aligned pairs) and a preference note on interpreting assessment/validity over the legacy REAL or SAMPLING_ARTIFACT labels, so both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_forecastsReplay forecast performanceA
Read-onlyIdempotent
Inspect

Backtest NoiseFloor's own one-step forecast on chronological historical prefixes, issuing before observing and then updating without hindsight. Use to evaluate forecast_next's coverage and misses; this tool does not accept externally supplied predictions. At least 20 readings are required; shorter valid histories return ok=false. Successful results contain n_forecasts, empirical_coverage, nominal_coverage, score, baseline_score, beats_baseline, records, misses and worst_misses. Scores are mean weighted interval scores in input units (lower is better), compared with fixed historical-error quantiles. Records use zero-based input indices and retain actual, forecast, interval and missed_by. within_coverage_tolerance and its calibrated alias mean observed coverage is within 0.05 of target; they are descriptive, not a certification or significance test. Coverage and favorable scores do not establish future market performance or profitability.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesOne to 2048 chronological realized observations with consistent units/cadence; at least 20 to score. Predictions begin after ten one-step errors, so the first scored record has zero-based index 11.
nominalNoTarget interval coverage fraction, default 0.80. Use the same value passed to forecast_next for like-for-like replay; not a confidence level for the backtest result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNoFalse denotes insufficient history; forecast or scoring fields are then absent.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
scoreNoMean adaptive weighted interval score.
methodNoShared forecast issuance and scoring method.
missesNoEvery uncovered observation.
caveatsNoOrdered statements or identifiers.
readingNoResult interpretation or minimum-history requirement.
recordsNoEvery scored observation.
n_missesNoNumber of uncovered observations.
validityNoCoverage is empirical only.
guaranteeNoNo statistical or market-performance guarantee is made.
calibratedNoCompatibility alias of within_coverage_tolerance; descriptive only.
n_forecastsNoNumber of issued forecasts scored.
worst_missesNoAt most five misses sorted by distance outside the interval.
baseline_scoreNoMean baseline weighted interval score.
beats_baselineNoAdaptive mean score is strictly below baseline.
nominal_coverageNoTarget coverage fraction.
records_completeNoAll scored observations are included.
skill_vs_baselineNoOne minus adaptive/baseline score; null when baseline score is zero. Null means unavailable or not applicable, never zero.
empirical_coverageNoObserved covered fraction.
calibration_criterionNoDescriptive tolerance rule, not a significance test.
within_coverage_toleranceNoObserved coverage is within 0.05 of the target.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false), but the description goes well beyond them: it discloses the ≥20-reading threshold and the ok=false failure mode, explains the scoring direction (mean weighted interval scores, lower is better, compared against fixed historical-error quantiles), and warns that coverage flags are descriptive rather than a significance test and do not imply future performance. That is substantial behavioral context for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and exclusions are front-loaded in the first two sentences, and the caveats about tolerance flags and future performance are valuable. The enumeration of return fields (n_forecasts, empirical_coverage, score, ...) is somewhat redundant given an output schema exists, making it slightly longer than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the analytical complexity, the description covers prerequisites, failure behavior, scoring semantics, index conventions, and interpretation caveats, while the output schema handles return structure. An agent has everything needed to decide to call it and to interpret the result responsibly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description's parameter-related details (values needing at least 20 readings, first scored record at index 11, nominal needing the same value passed to forecast_next) largely restate what the schema already documents. Baseline 3 is appropriate when the schema does the heavy lifting and the description adds little new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (backtest/replay) on a specific resource (NoiseFloor's own one-step forecast) and immediately distinguishes itself from forecast_next by declaring it will not accept externally supplied predictions. An agent can tell exactly what this tool does 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the intended use case ('Use to evaluate forecast_next's coverage and misses'), states a hard exclusion ('does not accept externally supplied predictions'), and gives a prerequisite ('at least 20 readings are required; shorter valid histories return ok=false'). The when-to-use and when-not-to-use conditions are both present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spectral_assessmentReview shared factors and correlation noiseA
Read-onlyIdempotent
Inspect

Analyze shared correlation structure and rolling concentration in a caller-defined comparable panel. Use for research on shared movements across at least two series; choose market_assessment for individual move/freshness review, or dyson_reference for a wholly synthetic illustration. Prices become log returns, returns stay returns, other kinds become first differences. Both interval endpoints must align; no interpolation or silent removal of rejected series occurs. Default windows need 60 aligned intervals (at least 61 original readings per series), and window_points must exceed the series count. Returns status, reasons, source/coverage records, alignment, windows, latest and dynamics. Assessed windows contain dimensionless correlation/eigenvalues, leading_variance_share (fraction), effective_rank, iid reference edges and an experimental shrinkage candidate. Stale, restricted, gapped or constant panels can return insufficient_visibility; invalid ids/timestamps are errors. Reference outliers are review candidates, not certified factors, significance, alpha or a covariance forecast.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofYesUTC cutoff for freshness and availability, for example 2026-01-01T12:00:00Z. Caller timestamps do not certify historical as-published vintages.
policyNoOptional rolling-window sizes; omitted fields default to 60 intervals, 20-interval steps and at most 4 windows.
seriesYesCaller-defined comparable panel, normally 2–32 series with unique ids. All members must pass source and clock gates. Both endpoints of each interval must align; rejected members are never silently removed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNoCaller cutoff.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
latestNoWindow with all metrics absent when a series is constant or numerically unresolved. Null means unavailable or not applicable, never zero.
limitsNoOrdered statements or identifiers.
policyNoFully applied rolling policy.
schemaNoResult contract identifier.
seriesNoAll requested series sorted by id.
statusNoWindow/visibility result.
reasonsNoOrdered statements or identifiers.
windowsNoComplete recent windows in chronological order.
coverageNoSupplied-panel coverage only.
dynamicsNoOnly pairs of assessed windows are compared.
maturityNoResearch maturity.
validityNoDescriptive assessment, not a probability or statistical certificate.
alignmentNoAlignment diagnostics; mismatch counts are absent when early gates stop alignment.
guaranteeNoNo statistical or market-performance guarantee is made.
is_e_valueNoNo calibrated e-value.
policy_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
request_sha256NoSHA-256 of the canonicalized submitted request or applied policy.
execution_authorityNoNo trading authority.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=idempotent=non-destructive and closed-world, and the description adds substantial extra context: kind-specific transforms (price→log returns, others first-differenced), mandatory endpoint alignment, no interpolation or silent rejection, minimum 61 readings per series, window_points > series count, and insufficient_visibility/error semantics. However, much of this is duplicated in the schema's own field descriptions rather than adding new behavioral disclosure, so it lands at solid-but-not-exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and alternative routing are front-loaded in the first three sentences, which is good structure. The remainder is long and packs transformation, gating, and output-inventory detail tightly, but each sentence carries information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested, 32-series panel tool with a published output schema, the description covers the transform pipeline, alignment/gap rules, failure classes (insufficient_visibility vs. error) and interpretation caveats ('review candidates, not certified factors'). Nothing an agent needs to call or interpret it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 as_of, policy fields and every series sub-field in depth. The description restates transform rules per kind and the window prerequisite but adds no syntax or format the schema lacks, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Analyze shared correlation structure and rolling concentration in a caller-defined comparable panel.' It then explicitly distinguishes itself from two siblings (market_assessment for individual move/freshness, dyson_reference for synthetic illustration), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit activation condition ('shared movements across at least two series') plus named alternatives for the two adjacent use cases. This is genuine when-to-use / when-not-to-use guidance rather than implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

which_metrics_matterReview multiple metricsA
Read-onlyIdempotent
Inspect

Rank a named board of nonnegative evidence scores for review. By default valid_evalues=false: arbitrary nonnegative scores are ranked descriptively and selected stays empty. Set valid_evalues=true only when every input has a justified null expectation at most one; then e-Benjamini-Hochberg (e-BH) controls this family's expected false-discovery proportion at alpha, provided the supplied e-values are valid. The server cannot certify that assertion. Raw returns, z-scores, model confidence and did_it_change's monitoring statistic do not qualify as valid e-values. Use this after constructing evidence, not to detect a change from a time series. Returns ranked (metric/evidence pairs, descending score), selected, k, n_watched, threshold, descriptive_mean, validity, assumptions and guarantee. Threshold and board_evidence are null without e-value confirmation. Repeated boards are not automatically controlled. Example descriptive call: {"evidence":{"latency":12,"errors":3},"valid_evalues":false}.

ParametersJSON Schema
NameRequiredDescriptionDefault
alphaNoTarget expected false-discovery proportion for this supplied family, default 0.10 (10%), strictly between 0 and 1. Only controls selection conditionally when valid_evalues=true; it is not a per-metric probability.
evidenceYesMap 1–128 nonempty metric names (up to 128 characters) to finite nonnegative scores; larger scores rank first, ties use metric name. Valid e-values are dimensionless; unverified scores receive descriptive ranking only.
valid_evaluesNoCaller assertion that every score is a valid e-value with defined null, sampling/selection procedure and observation window. Default false performs ranking only. True enables conditional e-BH; it does not validate provenance or the statistical construction.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kNoNumber selected.
noteNoSelection requests review, not trading.
alphaNoRequested expected false-discovery proportion bound, conditional on valid e-values.
errorNoValidation or computation failure message; inspect MCP isError or the HTTP status.
methodNoConditional e-BH or descriptive ranking.
rankedNoInputs sorted by decreasing value then name.
readingNoSelection interpretation.
selectedNoNames selected only when the caller attests valid e-values.
validityNoSelection contract.
guaranteeNoConditional e-BH statement; null for unverified inputs. Null means unavailable or not applicable, never zero.
n_watchedNoNumber of supplied metrics.
thresholdNoe-BH threshold; null without the caller's validity attestation. Null means unavailable or not applicable, never zero.
assumptionsNoOrdered statements or identifiers.
valid_evaluesNoCaller attestation, not a server certification.
board_evidenceNoMean supplied valid e-values; null without attestation. Null means unavailable or not applicable, never zero.
descriptive_meanNoMean supplied values, without certifying their statistical construction.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent/non-destructive annotations: it discloses that the server cannot certify e-value validity, that threshold and board_evidence are null without confirmation, that repeated boards are not automatically controlled, and that raw returns, z-scores, model confidence and did_it_change's statistic do not qualify. That is exactly the destructive/validity context an agent needs for a mutation-free but statistically conditional operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and default, and every sentence is load-bearing (validity caveats, disqualifying inputs, null returns). It is dense and somewhat long, and a few clauses restate schema facts, but there is no filler or marketing padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with nested objects, an output schema, and conditional statistical behavior, the description is complete: it covers the default vs asserted path, what is returned, what is null under each path, and the scope limit on repeated boards. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema cannot express: alpha only controls conditionally when valid_evalues=true and is not a per-metric probability, and the interaction between valid_evalues and what gets populated (threshold, board_evidence, selection). The evidence map is adequately covered by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: rank a named board of nonnegative evidence scores for review. It distinguishes itself from siblings by naming did_it_change's monitoring statistic as non-qualifying and stating it is not for detecting change from a time series, so an agent can tell it apart from did_it_change or ab_test without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use conditions (set valid_evalues=true only when every input has a justified null expectation at most one), the default behavior (false gives descriptive ranking, selected stays empty), and a when-not-to-use exclusion (not to detect a change from a time series; use after constructing evidence). Alternatives are named by exclusion, which is decisive guidance.

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.

  1. 10 tool updatesv0.4.3
    • Changedab_test4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {
        +      "additionalProperties": false,
        +      "description": "One experiment arm, stored under its caller-supplied label.",
        +      "properties": {
        +        "interval": {
        +          "description": "Lower and upper confidence-sequence bounds.",
        +          "items": {
        +            "description": "Success-probability bound as a fraction.",
        +            "type": "number"
        +          },
        +          "maxItems": 2,
        +          "minItems": 2,
        +          "type": "array"
        +        },
        +        "n": {
        +          "description": "Cumulative trials, including failures.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "rate": {
        +          "anyOf": [
        +            {
        +              "description": "Observed success fraction; null when n is zero.",
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Observed success fraction; null when n is zero. Null means unavailable or not applicable, never zero."
        +        },
        +        "successes": {
        +          "description": "Cumulative successful binary outcomes.",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "successes",
        +        "n",
        +        "rate",
        +        "interval"
        +      ],
        +      "type": "object"
        +    },
        +    "properties": {
        +      "alpha": {},
        +      "assumptions": {},
        +      "decided": {},
        +      "guarantee": {},
        +      "method": {},
        +      "observed_difference_pp": {},
        +      "reading": {},
        +      "safe_to_peek": {},
        +      "validity": {},
        +      "what_would_decide_it": {},
        +      "winner": {}
        +    },
        +    "required": [
        +      "decided",
        +      "winner",
        +      "reading",
        +      "alpha",
        +      "safe_to_peek",
        +      "validity",
        +      "guarantee",
        +      "assumptions",
        +      "method"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Two dynamically named arm objects plus comparison metadata. A and B are defaults, not fixed output keys. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "alpha": {
        +    "description": "Total error budget split across the arms, as a fraction.",
        +    "type": "number"
        +  },
        +  "assumptions": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "decided": {
        +    "description": "Whether the two confidence sequences are disjoint.",
        +    "type": "boolean"
        +  },
        +  "error": {
        +    "anyOf": [
        +      {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      },
        +      {
        +        "additionalProperties": false,
        +        "description": "One experiment arm, stored under its caller-supplied label.",
        +        "properties": {
        +          "interval": {
        +            "description": "Lower and upper confidence-sequence bounds.",
        +            "items": {
        +              "description": "Success-probability bound as a fraction.",
        +              "type": "number"
        +            },
        +            "maxItems": 2,
        +            "minItems": 2,
        +            "type": "array"
        +          },
        +          "n": {
        +            "description": "Cumulative trials, including failures.",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "rate": {
        +            "anyOf": [
        +              {
        +                "description": "Observed success fraction; null when n is zero.",
        +                "type": "number"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Observed success fraction; null when n is zero. Null means unavailable or not applicable, never zero."
        +          },
        +          "successes": {
        +            "description": "Cumulative successful binary outcomes.",
        +            "minimum": 0,
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "successes",
        +          "n",
        +          "rate",
        +          "interval"
        +        ],
        +        "type": "object"
        +      }
        +    ],
        +    "description": "A string on tool error, or a successful arm object when the caller labels that arm error; inspect MCP isError."
        +  },
        +  "guarantee": {
        +    "description": "Conditional confidence-sequence guarantee; not a market-performance claim.",
        +    "type": "string"
        +  },
        +  "method": {
        +    "description": "Confidence-sequence method and reference.",
        +    "type": "string"
        +  },
        +  "observed_difference_pp": {
        +    "description": "B's observed success rate minus A's, in percentage points; present only for undecided nonempty arms.",
        +    "type": "number"
        +  },
        +  "reading": {
        +    "description": "Interpretation of the current comparison.",
        +    "type": "string"
        +  },
        +  "safe_to_peek": {
        +    "const": true,
        +    "description": "Repeated looks are allowed only under the stated Bernoulli assumptions.",
        +    "type": "boolean"
        +  },
        +  "validity": {
        +    "const": "conditional_on_bernoulli_model",
        +    "description": "Guarantees are conditional on the Bernoulli sampling model.",
        +    "type": "string"
        +  },
        +  "what_would_decide_it": {
        +    "description": "Qualitative guidance for an undecided comparison with data in both arms.",
        +    "type": "string"
        +  },
        +  "winner": {
        +    "anyOf": [
        +      {
        +        "description": "Winning caller-supplied arm label; null when undecided.",
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Winning caller-supplied arm label; null when undecided. Null means unavailable or not applicable, never zero."
        +  }
        +}
    • Changeddid_it_change4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "assumptions": {},
        +      "change_points": {},
        +      "changed_at": {},
        +      "direction": {},
        +      "effect": {},
        +      "effect_reference_size": {},
        +      "evidence": {},
        +      "guarantee": {},
        +      "interpretation": {},
        +      "is_e_value": {},
        +      "method": {},
        +      "monitoring_statistic": {},
        +      "n": {},
        +      "reading": {},
        +      "readings_since_change": {},
        +      "state": {},
        +      "statistic_type": {},
        +      "validity": {},
        +      "watch_at": {},
        +      "weighted": {}
        +    },
        +    "required": [
        +      "n",
        +      "state",
        +      "evidence",
        +      "monitoring_statistic",
        +      "statistic_type",
        +      "is_e_value",
        +      "validity",
        +      "weighted",
        +      "assumptions",
        +      "direction",
        +      "effect",
        +      "effect_reference_size",
        +      "change_points",
        +      "watch_at",
        +      "changed_at",
        +      "readings_since_change",
        +      "reading",
        +      "guarantee",
        +      "interpretation",
        +      "method"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"MCP change result; full per-reading states and evidence_series are deliberately omitted by this tool. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "assumptions": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "change_points": {
        +    "description": "Historical alarm indices.",
        +    "items": {
        +      "description": "Zero-based observation index.",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  },
        +  "changed_at": {
        +    "description": "Descriptive alarm threshold.",
        +    "type": "number"
        +  },
        +  "direction": {
        +    "anyOf": [
        +      {
        +        "description": "Direction driving the positive monitor statistic.",
        +        "enum": [
        +          "up",
        +          "down"
        +        ],
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Direction driving the positive monitor statistic. Null means unavailable or not applicable, never zero."
        +  },
        +  "effect": {
        +    "additionalProperties": false,
        +    "description": "Latest reading compared with the current post-reset reference.",
        +    "properties": {
        +      "delta": {
        +        "anyOf": [
        +          {
        +            "description": "Latest reading minus reference median, in input units.",
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Latest reading minus reference median, in input units. Null means unavailable or not applicable, never zero."
        +      },
        +      "direction": {
        +        "description": "Direction relative to the preceding reference median.",
        +        "enum": [
        +          "up",
        +          "down",
        +          "flat"
        +        ],
        +        "type": "string"
        +      },
        +      "percentile": {
        +        "anyOf": [
        +          {
        +            "description": "Percentage of reference readings strictly below the current value.",
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Percentage of reference readings strictly below the current value. Null means unavailable or not applicable, never zero."
        +      },
        +      "robust_z": {
        +        "anyOf": [
        +          {
        +            "description": "Departure divided by 1.4826 times reference MAD; unavailable at zero spread.",
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Departure divided by 1.4826 times reference MAD; unavailable at zero spread. Null means unavailable or not applicable, never zero."
        +      }
        +    },
        +    "required": [
        +      "direction",
        +      "delta",
        +      "robust_z",
        +      "percentile"
        +    ],
        +    "type": "object"
        +  },
        +  "effect_reference_size": {
        +    "description": "Preceding observations in the current reference.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "evidence": {
        +    "description": "Compatibility alias of monitoring_statistic; not an e-value.",
        +    "type": "number"
        +  },
        +  "guarantee": {
        +    "description": "No statistical or market-performance guarantee is made.",
        +    "type": "null"
        +  },
        +  "interpretation": {
        +    "description": "Limits on interpreting a threshold crossing.",
        +    "type": "string"
        +  },
        +  "is_e_value": {
        +    "const": false,
        +    "description": "The statistic is not a calibrated e-value.",
        +    "type": "boolean"
        +  },
        +  "method": {
        +    "description": "Monitor construction and one-sided/two-sided mode.",
        +    "type": "string"
        +  },
        +  "monitoring_statistic": {
        +    "description": "Descriptive Shiryaev-Roberts statistic.",
        +    "type": "number"
        +  },
        +  "n": {
        +    "description": "Number of supplied observations.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "reading": {
        +    "description": "Interpretation, including remaining warmup requirements.",
        +    "type": "string"
        +  },
        +  "readings_since_change": {
        +    "anyOf": [
        +      {
        +        "description": "Observations after the most recent alarm.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Observations after the most recent alarm. Null means unavailable or not applicable, never zero."
        +  },
        +  "state": {
        +    "description": "Current descriptive monitor state.",
        +    "enum": [
        +      "warming_up",
        +      "steady",
        +      "watch",
        +      "changed"
        +    ],
        +    "type": "string"
        +  },
        +  "statistic_type": {
        +    "const": "shiryaev_roberts",
        +    "description": "Monitor family.",
        +    "type": "string"
        +  },
        +  "validity": {
        +    "const": "descriptive",
        +    "description": "Descriptive assessment, not a probability or statistical certificate.",
        +    "type": "string"
        +  },
        +  "watch_at": {
        +    "description": "Descriptive watch threshold.",
        +    "type": "number"
        +  },
        +  "weighted": {
        +    "description": "Whether half-life weighting was requested.",
        +    "type": "boolean"
        +  }
        +}
    • Changeddyson_reference4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "beta": {},
        +      "execution_authority": {},
        +      "guarantee": {},
        +      "initial_condition": {},
        +      "is_covariance_model": {},
        +      "limits": {},
        +      "market_calibrated": {},
        +      "maturity": {},
        +      "mean_reversion": {},
        +      "normalization": {},
        +      "parameters": {},
        +      "path": {},
        +      "request_sha256": {},
        +      "schema": {},
        +      "status": {},
        +      "validity": {}
        +    },
        +    "required": [
        +      "schema",
        +      "status",
        +      "maturity",
        +      "validity",
        +      "guarantee",
        +      "parameters",
        +      "beta",
        +      "path",
        +      "initial_condition",
        +      "mean_reversion",
        +      "normalization",
        +      "market_calibrated",
        +      "is_covariance_model",
        +      "execution_authority",
        +      "request_sha256",
        +      "limits"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Seeded synthetic eigenvalue path, never market observations or a covariance forecast. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "beta": {
        +    "const": 1,
        +    "description": "Real-symmetric reference beta.",
        +    "type": "integer"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "execution_authority": {
        +    "const": false,
        +    "description": "No trading authority.",
        +    "type": "boolean"
        +  },
        +  "guarantee": {
        +    "description": "No statistical or market-performance guarantee is made.",
        +    "type": "null"
        +  },
        +  "initial_condition": {
        +    "const": "zero_matrix",
        +    "description": "Initial matrix.",
        +    "type": "string"
        +  },
        +  "is_covariance_model": {
        +    "const": false,
        +    "description": "Negative eigenvalues are possible; not a covariance model.",
        +    "type": "boolean"
        +  },
        +  "limits": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "market_calibrated": {
        +    "const": false,
        +    "description": "Not calibrated to markets.",
        +    "type": "boolean"
        +  },
        +  "maturity": {
        +    "const": "research",
        +    "description": "Research maturity.",
        +    "type": "string"
        +  },
        +  "mean_reversion": {
        +    "const": false,
        +    "description": "Unconfined Brownian reference.",
        +    "type": "boolean"
        +  },
        +  "normalization": {
        +    "description": "Increment variance convention.",
        +    "type": "string"
        +  },
        +  "parameters": {
        +    "additionalProperties": false,
        +    "description": "Fully applied parameters.",
        +    "properties": {
        +      "dimension": {
        +        "description": "Matrix dimension N.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "dt": {
        +        "description": "Synthetic time step, not seconds.",
        +        "type": "number"
        +      },
        +      "seed": {
        +        "description": "Replay seed for this Python runtime.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "steps": {
        +        "description": "Number of increments.",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "dimension",
        +      "steps",
        +      "dt",
        +      "seed"
        +    ],
        +    "type": "object"
        +  },
        +  "path": {
        +    "description": "Initial zero spectrum followed by every simulated step.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Ordered spectrum at one synthetic time.",
        +      "properties": {
        +        "eigenvalues": {
        +          "description": "Numeric values in the documented order.",
        +          "items": {
        +            "description": "One finite numeric value.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "time": {
        +          "description": "Synthetic elapsed time.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "time",
        +        "eigenvalues"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "request_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "schema": {
        +    "const": "noisefloor.dyson-reference.v1",
        +    "description": "Result contract identifier.",
        +    "type": "string"
        +  },
        +  "status": {
        +    "const": "synthetic",
        +    "description": "Synthetic output.",
        +    "type": "string"
        +  },
        +  "validity": {
        +    "const": "synthetic_reference",
        +    "description": "Synthetic reference only.",
        +    "type": "string"
        +  }
        +}
    • Changedforecast_next4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "allOf": [
        +      {
        +        "if": {
        +          "properties": {
        +            "ok": {
        +              "const": true
        +            }
        +          }
        +        },
        +        "then": {
        +          "required": [
        +            "forecast",
        +            "interval",
        +            "nominal_coverage",
        +            "adaptive_alpha",
        +            "error_history_size"
        +          ]
        +        }
        +      }
        +    ],
        +    "properties": {
        +      "adaptive_alpha": {},
        +      "caveats": {},
        +      "error_history_size": {},
        +      "forecast": {},
        +      "guarantee": {},
        +      "interval": {},
        +      "method": {},
        +      "nominal_coverage": {},
        +      "ok": {},
        +      "reading": {},
        +      "validity": {}
        +    },
        +    "required": [
        +      "ok",
        +      "validity",
        +      "guarantee",
        +      "method",
        +      "caveats",
        +      "reading"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"One-step empirical forecast or insufficient-history result. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "adaptive_alpha": {
        +    "description": "Clipped adaptive miscoverage parameter as a fraction.",
        +    "type": "number"
        +  },
        +  "caveats": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "error_history_size": {
        +    "description": "Historical absolute errors used before issuing this forecast.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "forecast": {
        +    "description": "One-step random-walk point forecast in input units.",
        +    "type": "number"
        +  },
        +  "guarantee": {
        +    "description": "No statistical or market-performance guarantee is made.",
        +    "type": "null"
        +  },
        +  "interval": {
        +    "description": "Lower and upper bounds, in that order.",
        +    "items": {
        +      "description": "Bound in the original input units.",
        +      "type": "number"
        +    },
        +    "maxItems": 2,
        +    "minItems": 2,
        +    "type": "array"
        +  },
        +  "method": {
        +    "description": "Shared forecast issuance and scoring method.",
        +    "type": "string"
        +  },
        +  "nominal_coverage": {
        +    "description": "Requested target coverage as a fraction, not a guarantee.",
        +    "type": "number"
        +  },
        +  "ok": {
        +    "description": "False denotes insufficient history; forecast or scoring fields are then absent.",
        +    "type": "boolean"
        +  },
        +  "reading": {
        +    "description": "Result interpretation or minimum-history requirement.",
        +    "type": "string"
        +  },
        +  "validity": {
        +    "const": "empirical_only",
        +    "description": "Coverage is empirical only.",
        +    "type": "string"
        +  }
        +}
    • Changedmarket_assessment4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "as_of": {},
        +      "attention_queue": {},
        +      "coverage": {},
        +      "execution_authority": {},
        +      "limits": {},
        +      "method": {},
        +      "policy": {},
        +      "policy_sha256": {},
        +      "related_movements": {},
        +      "request_sha256": {},
        +      "schema": {},
        +      "series": {},
        +      "status": {},
        +      "visibility_gaps": {}
        +    },
        +    "required": [
        +      "schema",
        +      "as_of",
        +      "status",
        +      "policy",
        +      "series",
        +      "attention_queue",
        +      "visibility_gaps",
        +      "related_movements",
        +      "coverage",
        +      "method",
        +      "limits",
        +      "execution_authority",
        +      "request_sha256",
        +      "policy_sha256"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Market attention and explicit source/coverage gaps; no absent evidence is replaced by zero. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "as_of": {
        +    "description": "Caller-supplied UTC cutoff.",
        +    "type": "string"
        +  },
        +  "attention_queue": {
        +    "description": "Review/watch series sorted by priority then id.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One prioritized series.",
        +      "properties": {
        +        "group": {
        +          "description": "Declared group.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Series id.",
        +          "type": "string"
        +        },
        +        "reasons": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "status": {
        +          "description": "Review priority state.",
        +          "enum": [
        +            "review",
        +            "watch"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "status",
        +        "reasons",
        +        "group"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "coverage": {
        +    "additionalProperties": false,
        +    "description": "Coverage of only the supplied set.",
        +    "properties": {
        +      "assessed_series": {
        +        "description": "Series passing visibility gates.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "complete_for_supplied_series": {
        +        "description": "Nonempty supplied set with no visibility gaps.",
        +        "type": "boolean"
        +      },
        +      "market_universe_complete": {
        +        "const": false,
        +        "description": "Market collection completeness is unknown.",
        +        "type": "boolean"
        +      },
        +      "requested_series": {
        +        "description": "Supplied series.",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "requested_series",
        +      "assessed_series",
        +      "complete_for_supplied_series",
        +      "market_universe_complete"
        +    ],
        +    "type": "object"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "execution_authority": {
        +    "const": false,
        +    "description": "No trading authority.",
        +    "type": "boolean"
        +  },
        +  "limits": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "method": {
        +    "description": "Assessment construction.",
        +    "type": "string"
        +  },
        +  "policy": {
        +    "additionalProperties": false,
        +    "description": "Fully applied policy, including defaults.",
        +    "properties": {
        +      "baseline_points": {
        +        "description": "Earlier transformed readings.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "coverage_drop_fraction": {
        +        "description": "Absolute measurement-coverage change fraction.",
        +        "type": "number"
        +      },
        +      "move_threshold": {
        +        "description": "Robust-spread units.",
        +        "type": "number"
        +      },
        +      "recent_points": {
        +        "description": "Latest transformed readings.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "volatility_ratio": {
        +        "description": "Recent/baseline spread ratio.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "baseline_points",
        +      "recent_points",
        +      "move_threshold",
        +      "volatility_ratio",
        +      "coverage_drop_fraction"
        +    ],
        +    "type": "object"
        +  },
        +  "policy_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "related_movements": {
        +    "description": "Relationships with absolute correlation at least 0.85.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Strong aligned relationship.",
        +      "properties": {
        +        "aligned_points": {
        +          "description": "Shared timestamps.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "correlation": {
        +          "description": "Aligned Pearson correlation.",
        +          "type": "number"
        +        },
        +        "independent_confirmation": {
        +          "const": false,
        +          "description": "Correlation is not independent corroboration.",
        +          "type": "boolean"
        +        },
        +        "series": {
        +          "description": "Pair of series ids.",
        +          "items": {
        +            "description": "Series id.",
        +            "type": "string"
        +          },
        +          "maxItems": 2,
        +          "minItems": 2,
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "series",
        +        "correlation",
        +        "aligned_points",
        +        "independent_confirmation"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "request_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "schema": {
        +    "const": "noisefloor.market-assessment.v1",
        +    "description": "Result contract identifier.",
        +    "type": "string"
        +  },
        +  "series": {
        +    "description": "All supplied series in input order.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Every supplied series is retained, including rejected sources and missing histories.",
        +      "properties": {
        +        "age_seconds": {
        +          "anyOf": [
        +            {
        +              "description": "Cutoff minus last observation timestamp in seconds; may be negative for future data.",
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Cutoff minus last observation timestamp in seconds; may be negative for future data. Null means unavailable or not applicable, never zero."
        +        },
        +        "analyzed_points": {
        +          "description": "Points actually used; omitted for insufficient visibility.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "analyzed_unit": {
        +          "description": "log_return for prices, otherwise the declared unit.",
        +          "type": "string"
        +        },
        +        "as_published_history_verified": {
        +          "const": false,
        +          "description": "Caller timestamps do not verify historical availability.",
        +          "type": "boolean"
        +        },
        +        "availability_timestamps_complete": {
        +          "description": "Every supplied observation declares availability and the series is nonempty.",
        +          "type": "boolean"
        +        },
        +        "available_at": {
        +          "anyOf": [
        +            {
        +              "description": "Last supplied availability timestamp, if present.",
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Last supplied availability timestamp, if present. Null means unavailable or not applicable, never zero."
        +        },
        +        "contiguous_points": {
        +          "description": "Usable transformed tail points.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "diagnostics": {
        +          "anyOf": [
        +            {
        +              "additionalProperties": false,
        +              "description": "Computed only for source-eligible series with sufficient contiguous history.",
        +              "properties": {
        +                "baseline_median": {
        +                  "description": "Baseline center in analyzed units.",
        +                  "type": "number"
        +                },
        +                "baseline_robust_spread": {
        +                  "description": "Baseline MAD times 1.4826 in analyzed units.",
        +                  "type": "number"
        +                },
        +                "coverage": {
        +                  "additionalProperties": false,
        +                  "description": "Measurement coverage, not trading volume.",
        +                  "properties": {
        +                    "relative_change": {
        +                      "anyOf": [
        +                        {
        +                          "description": "Recent minus baseline median denominator divided by baseline.",
        +                          "type": "number"
        +                        },
        +                        {
        +                          "type": "null"
        +                        }
        +                      ],
        +                      "description": "Recent minus baseline median denominator divided by baseline. Null means unavailable or not applicable, never zero."
        +                    },
        +                    "status": {
        +                      "description": "Measurement-denominator availability or change.",
        +                      "enum": [
        +                        "not_supplied",
        +                        "incomplete",
        +                        "changed",
        +                        "stable"
        +                      ],
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "status",
        +                    "relative_change"
        +                  ],
        +                  "type": "object"
        +                },
        +                "lag_one_correlation": {
        +                  "anyOf": [
        +                    {
        +                      "description": "Lag-one correlation, when estimable.",
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ],
        +                  "description": "Lag-one correlation, when estimable. Null means unavailable or not applicable, never zero."
        +                },
        +                "latest_change": {
        +                  "description": "Latest minus baseline median in analyzed units.",
        +                  "type": "number"
        +                },
        +                "latest_robust_departure": {
        +                  "anyOf": [
        +                    {
        +                      "description": "Latest change in baseline robust-spread units.",
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ],
        +                  "description": "Latest change in baseline robust-spread units. Null means unavailable or not applicable, never zero."
        +                },
        +                "median_change": {
        +                  "description": "Recent minus baseline median in analyzed units.",
        +                  "type": "number"
        +                },
        +                "monitor": {
        +                  "additionalProperties": false,
        +                  "description": "Descriptive monitor of the analyzed window.",
        +                  "properties": {
        +                    "change_points": {
        +                      "description": "Alarm positions in the analyzed window.",
        +                      "items": {
        +                        "description": "Zero-based window position.",
        +                        "minimum": 0,
        +                        "type": "integer"
        +                      },
        +                      "type": "array"
        +                    },
        +                    "guarantee": {
        +                      "description": "No statistical or market-performance guarantee is made.",
        +                      "type": "null"
        +                    },
        +                    "is_e_value": {
        +                      "const": false,
        +                      "description": "Not a calibrated e-value.",
        +                      "type": "boolean"
        +                    },
        +                    "state": {
        +                      "description": "Descriptive monitor state.",
        +                      "type": "string"
        +                    },
        +                    "statistic": {
        +                      "description": "Raw monitoring statistic, not an e-value.",
        +                      "type": "number"
        +                    },
        +                    "statistic_type": {
        +                      "const": "shiryaev_roberts",
        +                      "description": "Monitor family.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "state",
        +                    "statistic",
        +                    "statistic_type",
        +                    "is_e_value",
        +                    "change_points",
        +                    "guarantee"
        +                  ],
        +                  "type": "object"
        +                },
        +                "persistence_points": {
        +                  "description": "Recent readings with a supported same-direction departure.",
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "recent_median": {
        +                  "description": "Recent center in analyzed units.",
        +                  "type": "number"
        +                },
        +                "recent_robust_spread": {
        +                  "description": "Recent MAD times 1.4826 in analyzed units.",
        +                  "type": "number"
        +                },
        +                "representation_tolerance": {
        +                  "description": "Log-price arithmetic tolerance in analyzed units, zero for direct measurements.",
        +                  "type": "number"
        +                },
        +                "representation_tolerance_basis": {
        +                  "description": "Arithmetic source of the tolerance.",
        +                  "type": "string"
        +                },
        +                "robust_departure": {
        +                  "anyOf": [
        +                    {
        +                      "description": "Median change in baseline robust-spread units.",
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ],
        +                  "description": "Median change in baseline robust-spread units. Null means unavailable or not applicable, never zero."
        +                },
        +                "volatility_ratio": {
        +                  "anyOf": [
        +                    {
        +                      "description": "Recent/baseline robust spread; null at zero baseline spread.",
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ],
        +                  "description": "Recent/baseline robust spread; null at zero baseline spread. Null means unavailable or not applicable, never zero."
        +                },
        +                "window_end": {
        +                  "description": "Last analyzed observation timestamp.",
        +                  "type": "string"
        +                },
        +                "window_start": {
        +                  "description": "First analyzed observation timestamp.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "baseline_median",
        +                "recent_median",
        +                "median_change",
        +                "latest_change",
        +                "baseline_robust_spread",
        +                "recent_robust_spread",
        +                "representation_tolerance",
        +                "robust_departure",
        +                "latest_robust_departure",
        +                "volatility_ratio",
        +                "persistence_points",
        +                "representation_tolerance_basis",
        +                "lag_one_correlation",
        +                "coverage",
        +                "monitor",
        +                "window_start",
        +                "window_end"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Computed only for source-eligible series with sufficient contiguous history. Null means unavailable or not applicable, never zero."
        +        },
        +        "gap_indices": {
        +          "description": "Declared-calendar gap positions.",
        +          "items": {
        +            "description": "Zero-based observation index.",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "type": "array"
        +        },
        +        "group": {
        +          "description": "Declared group, defaulting to series id.",
        +          "type": "string"
        +        },
        +        "guarantee": {
        +          "description": "No statistical or market-performance guarantee is made.",
        +          "type": "null"
        +        },
        +        "id": {
        +          "description": "Caller-supplied series identifier.",
        +          "type": "string"
        +        },
        +        "is_e_value": {
        +          "const": false,
        +          "description": "No calibrated e-value.",
        +          "type": "boolean"
        +        },
        +        "kind": {
        +          "description": "Caller-declared measurement kind.",
        +          "type": "string"
        +        },
        +        "missing_points": {
        +          "description": "Null-valued observations.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "observation_count": {
        +          "description": "Supplied observation count.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "observed_at": {
        +          "anyOf": [
        +            {
        +              "description": "Last supplied observation timestamp; null for no observations.",
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Last supplied observation timestamp; null for no observations. Null means unavailable or not applicable, never zero."
        +        },
        +        "priority": {
        +          "anyOf": [
        +            {
        +              "description": "Review=2, watch=1, no supported departure=0; null when ineligible.",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Review=2, watch=1, no supported departure=0; null when ineligible. Null means unavailable or not applicable, never zero."
        +        },
        +        "reading": {
        +          "description": "Interpretation or visibility-gap explanation.",
        +          "type": "string"
        +        },
        +        "reasons": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "required_points": {
        +          "description": "Baseline plus recent point requirement.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "source": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "description": "Caller-defined source identifier retained in results, for example synthetic-demo or a licensed provider name.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "rights": {
        +              "description": "Caller's source-use declaration. Only permitted permits numerical assessment; unknown and restricted remain explicit visibility gaps. The server does not grant or verify rights.",
        +              "enum": [
        +                "permitted",
        +                "unknown",
        +                "restricted"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "Optional source or evidence URL retained for attribution; no URL is fetched or independently verified.",
        +              "maxLength": 2048,
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "rights"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "Per-series assessment state.",
        +          "enum": [
        +            "insufficient_visibility",
        +            "review",
        +            "watch",
        +            "no_supported_departure"
        +          ],
        +          "type": "string"
        +        },
        +        "transform": {
        +          "description": "price becomes log_return; all other kinds use identity.",
        +          "enum": [
        +            "log_return",
        +            "identity"
        +          ],
        +          "type": "string"
        +        },
        +        "unit": {
        +          "description": "Caller-declared input unit.",
        +          "type": "string"
        +        },
        +        "validity": {
        +          "const": "descriptive",
        +          "description": "Descriptive assessment, not a probability or statistical certificate.",
        +          "type": "string"
        +        },
        +        "warnings": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "kind",
        +        "unit",
        +        "source",
        +        "group",
        +        "reasons",
        +        "warnings",
        +        "observed_at",
        +        "available_at",
        +        "age_seconds",
        +        "gap_indices",
        +        "missing_points",
        +        "availability_timestamps_complete",
        +        "as_published_history_verified",
        +        "status",
        +        "observation_count",
        +        "contiguous_points",
        +        "required_points",
        +        "transform",
        +        "analyzed_unit",
        +        "diagnostics",
        +        "priority",
        +        "is_e_value",
        +        "validity",
        +        "guarantee",
        +        "reading"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "status": {
        +    "description": "Aggregate visibility state.",
        +    "enum": [
        +      "insufficient_visibility",
        +      "partial",
        +      "assessed"
        +    ],
        +    "type": "string"
        +  },
        +  "visibility_gaps": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
    • Changednarrative_triage4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "as_of": {},
        +      "attention_queue": {},
        +      "clusters": {},
        +      "conflict_candidates": {},
        +      "counts": {},
        +      "deferred_cluster_ids": {},
        +      "events": {},
        +      "execution_authority": {},
        +      "focus": {},
        +      "limits": {},
        +      "policy": {},
        +      "policy_sha256": {},
        +      "request_sha256": {},
        +      "schema": {},
        +      "source_universe_complete": {},
        +      "status": {}
        +    },
        +    "required": [
        +      "schema",
        +      "as_of",
        +      "focus",
        +      "status",
        +      "policy",
        +      "attention_queue",
        +      "clusters",
        +      "events",
        +      "conflict_candidates",
        +      "deferred_cluster_ids",
        +      "counts",
        +      "limits",
        +      "source_universe_complete",
        +      "execution_authority",
        +      "request_sha256",
        +      "policy_sha256"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Headline repetition and review-priority result, never a truth or market-impact score. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "as_of": {
        +    "description": "Caller-supplied UTC cutoff.",
        +    "type": "string"
        +  },
        +  "attention_queue": {
        +    "description": "Prioritized bounded queue.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One wording cluster, not independent corroboration or truth.",
        +      "properties": {
        +        "cluster_id": {
        +          "description": "Deterministic cluster id.",
        +          "type": "string"
        +        },
        +        "declared_source_families": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "entities": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "event_keys": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "impact_assessed": {
        +          "const": false,
        +          "description": "No impact assessment.",
        +          "type": "boolean"
        +        },
        +        "independence_verified": {
        +          "const": false,
        +          "description": "Source independence is not verified.",
        +          "type": "boolean"
        +        },
        +        "member_ids": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "published_at": {
        +          "description": "Representative publication timestamp.",
        +          "type": "string"
        +        },
        +        "relevance": {
        +          "description": "Caller-entity focus classification.",
        +          "enum": [
        +            "unmapped",
        +            "matches_focus",
        +            "not_filtered"
        +          ],
        +          "type": "string"
        +        },
        +        "report_count": {
        +          "description": "Member events.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "representative_id": {
        +          "description": "Selected representative event id.",
        +          "type": "string"
        +        },
        +        "source": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "family": {
        +              "description": "Optional shared source-family label for syndication or common ownership. Defaults to URL hostname, then source id. Distinct families are not verified independent corroboration.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "Caller-defined source identifier retained with the headline.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "kind": {
        +              "description": "Caller-declared source type, prioritized in this order: primary, reporting, commentary. This label does not verify truth, authority or independence.",
        +              "enum": [
        +                "primary",
        +                "reporting",
        +                "commentary"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "Optional attribution URL, never fetched. Its hostname is the source-family fallback when family is omitted.",
        +              "maxLength": 2048,
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        "title": {
        +          "description": "Untrusted caller headline text.",
        +          "type": "string"
        +        },
        +        "truth_assessed": {
        +          "const": false,
        +          "description": "No truth assessment.",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "cluster_id",
        +        "representative_id",
        +        "title",
        +        "entities",
        +        "published_at",
        +        "source",
        +        "member_ids",
        +        "report_count",
        +        "declared_source_families",
        +        "independence_verified",
        +        "truth_assessed",
        +        "impact_assessed",
        +        "relevance",
        +        "event_keys"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "clusters": {
        +    "description": "All eligible wording clusters.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One wording cluster, not independent corroboration or truth.",
        +      "properties": {
        +        "cluster_id": {
        +          "description": "Deterministic cluster id.",
        +          "type": "string"
        +        },
        +        "declared_source_families": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "entities": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "event_keys": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "impact_assessed": {
        +          "const": false,
        +          "description": "No impact assessment.",
        +          "type": "boolean"
        +        },
        +        "independence_verified": {
        +          "const": false,
        +          "description": "Source independence is not verified.",
        +          "type": "boolean"
        +        },
        +        "member_ids": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "published_at": {
        +          "description": "Representative publication timestamp.",
        +          "type": "string"
        +        },
        +        "relevance": {
        +          "description": "Caller-entity focus classification.",
        +          "enum": [
        +            "unmapped",
        +            "matches_focus",
        +            "not_filtered"
        +          ],
        +          "type": "string"
        +        },
        +        "report_count": {
        +          "description": "Member events.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "representative_id": {
        +          "description": "Selected representative event id.",
        +          "type": "string"
        +        },
        +        "source": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "family": {
        +              "description": "Optional shared source-family label for syndication or common ownership. Defaults to URL hostname, then source id. Distinct families are not verified independent corroboration.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "Caller-defined source identifier retained with the headline.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "kind": {
        +              "description": "Caller-declared source type, prioritized in this order: primary, reporting, commentary. This label does not verify truth, authority or independence.",
        +              "enum": [
        +                "primary",
        +                "reporting",
        +                "commentary"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "Optional attribution URL, never fetched. Its hostname is the source-family fallback when family is omitted.",
        +              "maxLength": 2048,
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        "title": {
        +          "description": "Untrusted caller headline text.",
        +          "type": "string"
        +        },
        +        "truth_assessed": {
        +          "const": false,
        +          "description": "No truth assessment.",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "cluster_id",
        +        "representative_id",
        +        "title",
        +        "entities",
        +        "published_at",
        +        "source",
        +        "member_ids",
        +        "report_count",
        +        "declared_source_families",
        +        "independence_verified",
        +        "truth_assessed",
        +        "impact_assessed",
        +        "relevance",
        +        "event_keys"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "conflict_candidates": {
        +    "description": "Potential conflicts requiring review.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Distinct wording sharing an event key.",
        +      "properties": {
        +        "cluster_ids": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "event_key": {
        +          "description": "Shared caller-defined event identity.",
        +          "type": "string"
        +        },
        +        "reason": {
        +          "const": "different_wording_or_quantities_requires_review",
        +          "description": "Review reason.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "event_key",
        +        "cluster_ids",
        +        "reason"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "counts": {
        +    "additionalProperties": false,
        +    "description": "Complete event/cluster counts.",
        +    "properties": {
        +      "deferred": {
        +        "description": "Clusters beyond queue capacity.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "distinct_wording_clusters": {
        +        "description": "Clusters.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "eligible_for_triage": {
        +        "description": "Eligible events.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "queued": {
        +        "description": "Queued clusters.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "repeated_wording": {
        +        "description": "Eligible events minus clusters.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "supplied": {
        +        "description": "Input events.",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "supplied",
        +      "eligible_for_triage",
        +      "distinct_wording_clusters",
        +      "repeated_wording",
        +      "queued",
        +      "deferred"
        +    ],
        +    "type": "object"
        +  },
        +  "deferred_cluster_ids": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "events": {
        +    "description": "All events sorted by id.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Every supplied event remains visible with a disposition.",
        +      "properties": {
        +        "available_at": {
        +          "anyOf": [
        +            {
        +              "description": "Supplied availability timestamp, if present.",
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Supplied availability timestamp, if present. Null means unavailable or not applicable, never zero."
        +        },
        +        "cluster_id": {
        +          "anyOf": [
        +            {
        +              "description": "Assigned cluster id; null for excluded events.",
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Assigned cluster id; null for excluded events. Null means unavailable or not applicable, never zero."
        +        },
        +        "entities": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "id": {
        +          "description": "Caller event id.",
        +          "type": "string"
        +        },
        +        "published_at": {
        +          "description": "Supplied publication timestamp.",
        +          "type": "string"
        +        },
        +        "source": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "family": {
        +              "description": "Optional shared source-family label for syndication or common ownership. Defaults to URL hostname, then source id. Distinct families are not verified independent corroboration.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "Caller-defined source identifier retained with the headline.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "kind": {
        +              "description": "Caller-declared source type, prioritized in this order: primary, reporting, commentary. This label does not verify truth, authority or independence.",
        +              "enum": [
        +                "primary",
        +                "reporting",
        +                "commentary"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "Optional attribution URL, never fetched. Its hostname is the source-family fallback when family is omitted.",
        +              "maxLength": 2048,
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "Retained event disposition.",
        +          "enum": [
        +            "not_yet_available",
        +            "stale",
        +            "outside_focus",
        +            "unmapped_entity",
        +            "representative",
        +            "repeated_wording"
        +          ],
        +          "type": "string"
        +        },
        +        "title": {
        +          "description": "Untrusted caller headline.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "status",
        +        "cluster_id",
        +        "published_at",
        +        "available_at",
        +        "source",
        +        "entities",
        +        "title"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "execution_authority": {
        +    "const": false,
        +    "description": "No trading authority.",
        +    "type": "boolean"
        +  },
        +  "focus": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "limits": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "policy": {
        +    "additionalProperties": false,
        +    "description": "Fully applied policy.",
        +    "properties": {
        +      "max_age_seconds": {
        +        "description": "Maximum event age in seconds.",
        +        "type": "number"
        +      },
        +      "max_items": {
        +        "description": "Maximum queue length.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "similarity_threshold": {
        +        "description": "Token-set similarity threshold.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "max_age_seconds",
        +      "max_items",
        +      "similarity_threshold"
        +    ],
        +    "type": "object"
        +  },
        +  "policy_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "request_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "schema": {
        +    "const": "noisefloor.narrative-triage.v1",
        +    "description": "Result contract identifier.",
        +    "type": "string"
        +  },
        +  "source_universe_complete": {
        +    "const": false,
        +    "description": "Collection completeness is unknown.",
        +    "type": "boolean"
        +  },
        +  "status": {
        +    "description": "Whether any supplied events were eligible.",
        +    "enum": [
        +      "triaged",
        +      "insufficient_visibility"
        +    ],
        +    "type": "string"
        +  }
        +}
    • Changedreal_or_sampling4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "assessment": {},
        +      "caveats": {},
        +      "denominator_extrapolation": {},
        +      "departure_after_conditioning": {},
        +      "fit": {},
        +      "guarantee": {},
        +      "is_causal": {},
        +      "method": {},
        +      "metric_delta": {},
        +      "metric_departure": {},
        +      "metric_now": {},
        +      "n_pairs": {},
        +      "reading": {},
        +      "sample_size_change_pct": {},
        +      "sample_size_departure": {},
        +      "sample_size_now": {},
        +      "validity": {},
        +      "verdict": {},
        +      "zero_reference_spread": {}
        +    },
        +    "required": [
        +      "n_pairs",
        +      "validity",
        +      "guarantee",
        +      "is_causal",
        +      "method",
        +      "caveats",
        +      "verdict",
        +      "assessment",
        +      "reading"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Short histories omit departure/fit fields; later branches retain only quantities that were computed. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "assessment": {
        +    "description": "Preferred interpretation of the legacy verdict.",
        +    "enum": [
        +      "insufficient_history",
        +      "no_supported_departure",
        +      "departure_from_zero_spread",
        +      "denominator_explanation_unidentified",
        +      "weak_linear_association",
        +      "consistent_with_denominator_association",
        +      "departure_survives_linear_conditioning"
        +    ],
        +    "type": "string"
        +  },
        +  "caveats": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "denominator_extrapolation": {
        +    "description": "Latest denominator falls outside the historical range.",
        +    "type": "boolean"
        +  },
        +  "departure_after_conditioning": {
        +    "anyOf": [
        +      {
        +        "description": "Robust standardized latest residual after linear conditioning.",
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Robust standardized latest residual after linear conditioning. Null means unavailable or not applicable, never zero."
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "fit": {
        +    "additionalProperties": false,
        +    "description": "Historical linear association, when estimable.",
        +    "properties": {
        +      "correlation": {
        +        "description": "Historical linear correlation, rounded to three decimals.",
        +        "type": "number"
        +      },
        +      "intercept": {
        +        "description": "Metric units.",
        +        "type": "number"
        +      },
        +      "slope": {
        +        "description": "Metric units per denominator unit.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "slope",
        +      "intercept",
        +      "correlation"
        +    ],
        +    "type": "object"
        +  },
        +  "guarantee": {
        +    "description": "No statistical or market-performance guarantee is made.",
        +    "type": "null"
        +  },
        +  "is_causal": {
        +    "const": false,
        +    "description": "Association does not establish causality.",
        +    "type": "boolean"
        +  },
        +  "method": {
        +    "description": "Descriptive denominator-conditioning method.",
        +    "type": "string"
        +  },
        +  "metric_delta": {
        +    "description": "Latest metric minus historical median, in input units.",
        +    "type": "number"
        +  },
        +  "metric_departure": {
        +    "anyOf": [
        +      {
        +        "description": "Robust standardized latest metric departure.",
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Robust standardized latest metric departure. Null means unavailable or not applicable, never zero."
        +  },
        +  "metric_now": {
        +    "description": "Latest metric in input units.",
        +    "type": "number"
        +  },
        +  "n_pairs": {
        +    "description": "Number of aligned metric/measurement-denominator pairs.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "reading": {
        +    "description": "Explanation and limits of the result.",
        +    "type": "string"
        +  },
        +  "sample_size_change_pct": {
        +    "description": "Denominator change as percent of its historical median.",
        +    "type": "number"
        +  },
        +  "sample_size_departure": {
        +    "anyOf": [
        +      {
        +        "description": "Robust standardized denominator departure.",
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Robust standardized denominator departure. Null means unavailable or not applicable, never zero."
        +  },
        +  "sample_size_now": {
        +    "description": "Latest declared measurement denominator.",
        +    "type": "number"
        +  },
        +  "validity": {
        +    "const": "descriptive",
        +    "description": "Descriptive assessment, not a probability or statistical certificate.",
        +    "type": "string"
        +  },
        +  "verdict": {
        +    "description": "Legacy descriptive result code.",
        +    "enum": [
        +      "NOT_ENOUGH_HISTORY",
        +      "NO_MOVE",
        +      "UNCLEAR",
        +      "SAMPLING_ARTIFACT",
        +      "REAL"
        +    ],
        +    "type": "string"
        +  },
        +  "zero_reference_spread": {
        +    "description": "Historical metric MAD is zero.",
        +    "type": "boolean"
        +  }
        +}
    • Changedscore_forecasts4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "allOf": [
        +      {
        +        "if": {
        +          "properties": {
        +            "ok": {
        +              "const": true
        +            }
        +          }
        +        },
        +        "then": {
        +          "required": [
        +            "n_forecasts",
        +            "nominal_coverage",
        +            "empirical_coverage",
        +            "calibrated",
        +            "within_coverage_tolerance",
        +            "calibration_criterion",
        +            "score",
        +            "baseline_score",
        +            "beats_baseline",
        +            "skill_vs_baseline",
        +            "n_misses",
        +            "records",
        +            "misses",
        +            "worst_misses",
        +            "records_complete"
        +          ]
        +        }
        +      }
        +    ],
        +    "properties": {
        +      "baseline_score": {},
        +      "beats_baseline": {},
        +      "calibrated": {},
        +      "calibration_criterion": {},
        +      "caveats": {},
        +      "empirical_coverage": {},
        +      "guarantee": {},
        +      "method": {},
        +      "misses": {},
        +      "n_forecasts": {},
        +      "n_misses": {},
        +      "nominal_coverage": {},
        +      "ok": {},
        +      "reading": {},
        +      "records": {},
        +      "records_complete": {},
        +      "score": {},
        +      "skill_vs_baseline": {},
        +      "validity": {},
        +      "within_coverage_tolerance": {},
        +      "worst_misses": {}
        +    },
        +    "required": [
        +      "ok",
        +      "validity",
        +      "guarantee",
        +      "method",
        +      "caveats",
        +      "reading"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Forecast replay scores or insufficient-history result. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "baseline_score": {
        +    "description": "Mean baseline weighted interval score.",
        +    "type": "number"
        +  },
        +  "beats_baseline": {
        +    "description": "Adaptive mean score is strictly below baseline.",
        +    "type": "boolean"
        +  },
        +  "calibrated": {
        +    "description": "Compatibility alias of within_coverage_tolerance; descriptive only.",
        +    "type": "boolean"
        +  },
        +  "calibration_criterion": {
        +    "description": "Descriptive tolerance rule, not a significance test.",
        +    "type": "string"
        +  },
        +  "caveats": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "empirical_coverage": {
        +    "description": "Observed covered fraction.",
        +    "type": "number"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "guarantee": {
        +    "description": "No statistical or market-performance guarantee is made.",
        +    "type": "null"
        +  },
        +  "method": {
        +    "description": "Shared forecast issuance and scoring method.",
        +    "type": "string"
        +  },
        +  "misses": {
        +    "description": "Every uncovered observation.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One prequential issue/observe/score record; future observations do not alter it.",
        +      "properties": {
        +        "actual": {
        +          "description": "Observed value in input units.",
        +          "type": "number"
        +        },
        +        "adaptive_alpha": {
        +          "description": "Clipped adaptive miscoverage parameter as a fraction.",
        +          "type": "number"
        +        },
        +        "baseline_score": {
        +          "description": "Historical-quantile baseline weighted interval score in input units.",
        +          "type": "number"
        +        },
        +        "covered": {
        +          "description": "Actual value lies inside the issued interval.",
        +          "type": "boolean"
        +        },
        +        "error_history_size": {
        +          "description": "Historical absolute errors used before issuing this forecast.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "forecast": {
        +          "description": "One-step random-walk point forecast in input units.",
        +          "type": "number"
        +        },
        +        "index": {
        +          "description": "Zero-based index of the observation scored after forecast issuance.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "interval": {
        +          "description": "Lower and upper bounds, in that order.",
        +          "items": {
        +            "description": "Bound in the original input units.",
        +            "type": "number"
        +          },
        +          "maxItems": 2,
        +          "minItems": 2,
        +          "type": "array"
        +        },
        +        "missed_by": {
        +          "description": "Distance outside the interval in input units, zero when covered.",
        +          "type": "number"
        +        },
        +        "nominal_coverage": {
        +          "description": "Requested target coverage as a fraction, not a guarantee.",
        +          "type": "number"
        +        },
        +        "score": {
        +          "description": "Adaptive weighted interval score in input units; lower is better.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "index",
        +        "forecast",
        +        "interval",
        +        "nominal_coverage",
        +        "adaptive_alpha",
        +        "error_history_size",
        +        "actual",
        +        "covered",
        +        "missed_by",
        +        "score",
        +        "baseline_score"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "n_forecasts": {
        +    "description": "Number of issued forecasts scored.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "n_misses": {
        +    "description": "Number of uncovered observations.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "nominal_coverage": {
        +    "description": "Target coverage fraction.",
        +    "type": "number"
        +  },
        +  "ok": {
        +    "description": "False denotes insufficient history; forecast or scoring fields are then absent.",
        +    "type": "boolean"
        +  },
        +  "reading": {
        +    "description": "Result interpretation or minimum-history requirement.",
        +    "type": "string"
        +  },
        +  "records": {
        +    "description": "Every scored observation.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One prequential issue/observe/score record; future observations do not alter it.",
        +      "properties": {
        +        "actual": {
        +          "description": "Observed value in input units.",
        +          "type": "number"
        +        },
        +        "adaptive_alpha": {
        +          "description": "Clipped adaptive miscoverage parameter as a fraction.",
        +          "type": "number"
        +        },
        +        "baseline_score": {
        +          "description": "Historical-quantile baseline weighted interval score in input units.",
        +          "type": "number"
        +        },
        +        "covered": {
        +          "description": "Actual value lies inside the issued interval.",
        +          "type": "boolean"
        +        },
        +        "error_history_size": {
        +          "description": "Historical absolute errors used before issuing this forecast.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "forecast": {
        +          "description": "One-step random-walk point forecast in input units.",
        +          "type": "number"
        +        },
        +        "index": {
        +          "description": "Zero-based index of the observation scored after forecast issuance.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "interval": {
        +          "description": "Lower and upper bounds, in that order.",
        +          "items": {
        +            "description": "Bound in the original input units.",
        +            "type": "number"
        +          },
        +          "maxItems": 2,
        +          "minItems": 2,
        +          "type": "array"
        +        },
        +        "missed_by": {
        +          "description": "Distance outside the interval in input units, zero when covered.",
        +          "type": "number"
        +        },
        +        "nominal_coverage": {
        +          "description": "Requested target coverage as a fraction, not a guarantee.",
        +          "type": "number"
        +        },
        +        "score": {
        +          "description": "Adaptive weighted interval score in input units; lower is better.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "index",
        +        "forecast",
        +        "interval",
        +        "nominal_coverage",
        +        "adaptive_alpha",
        +        "error_history_size",
        +        "actual",
        +        "covered",
        +        "missed_by",
        +        "score",
        +        "baseline_score"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "records_complete": {
        +    "const": true,
        +    "description": "All scored observations are included.",
        +    "type": "boolean"
        +  },
        +  "score": {
        +    "description": "Mean adaptive weighted interval score.",
        +    "type": "number"
        +  },
        +  "skill_vs_baseline": {
        +    "anyOf": [
        +      {
        +        "description": "One minus adaptive/baseline score; null when baseline score is zero.",
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "One minus adaptive/baseline score; null when baseline score is zero. Null means unavailable or not applicable, never zero."
        +  },
        +  "validity": {
        +    "const": "empirical_only",
        +    "description": "Coverage is empirical only.",
        +    "type": "string"
        +  },
        +  "within_coverage_tolerance": {
        +    "description": "Observed coverage is within 0.05 of the target.",
        +    "type": "boolean"
        +  },
        +  "worst_misses": {
        +    "description": "At most five misses sorted by distance outside the interval.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One prequential issue/observe/score record; future observations do not alter it.",
        +      "properties": {
        +        "actual": {
        +          "description": "Observed value in input units.",
        +          "type": "number"
        +        },
        +        "adaptive_alpha": {
        +          "description": "Clipped adaptive miscoverage parameter as a fraction.",
        +          "type": "number"
        +        },
        +        "baseline_score": {
        +          "description": "Historical-quantile baseline weighted interval score in input units.",
        +          "type": "number"
        +        },
        +        "covered": {
        +          "description": "Actual value lies inside the issued interval.",
        +          "type": "boolean"
        +        },
        +        "error_history_size": {
        +          "description": "Historical absolute errors used before issuing this forecast.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "forecast": {
        +          "description": "One-step random-walk point forecast in input units.",
        +          "type": "number"
        +        },
        +        "index": {
        +          "description": "Zero-based index of the observation scored after forecast issuance.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "interval": {
        +          "description": "Lower and upper bounds, in that order.",
        +          "items": {
        +            "description": "Bound in the original input units.",
        +            "type": "number"
        +          },
        +          "maxItems": 2,
        +          "minItems": 2,
        +          "type": "array"
        +        },
        +        "missed_by": {
        +          "description": "Distance outside the interval in input units, zero when covered.",
        +          "type": "number"
        +        },
        +        "nominal_coverage": {
        +          "description": "Requested target coverage as a fraction, not a guarantee.",
        +          "type": "number"
        +        },
        +        "score": {
        +          "description": "Adaptive weighted interval score in input units; lower is better.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "index",
        +        "forecast",
        +        "interval",
        +        "nominal_coverage",
        +        "adaptive_alpha",
        +        "error_history_size",
        +        "actual",
        +        "covered",
        +        "missed_by",
        +        "score",
        +        "baseline_score"
        +      ],
        +      "type": "object"
        +    },
        +    "maxItems": 5,
        +    "type": "array"
        +  }
        +}
    • Changedspectral_assessment4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alignment": {},
        +      "as_of": {},
        +      "coverage": {},
        +      "dynamics": {},
        +      "execution_authority": {},
        +      "guarantee": {},
        +      "is_e_value": {},
        +      "latest": {},
        +      "limits": {},
        +      "maturity": {},
        +      "policy": {},
        +      "policy_sha256": {},
        +      "reasons": {},
        +      "request_sha256": {},
        +      "schema": {},
        +      "series": {},
        +      "status": {},
        +      "validity": {},
        +      "windows": {}
        +    },
        +    "required": [
        +      "schema",
        +      "as_of",
        +      "status",
        +      "maturity",
        +      "validity",
        +      "guarantee",
        +      "is_e_value",
        +      "policy",
        +      "series",
        +      "reasons",
        +      "windows",
        +      "latest",
        +      "dynamics",
        +      "alignment",
        +      "coverage",
        +      "limits",
        +      "execution_authority",
        +      "request_sha256",
        +      "policy_sha256"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"Source-gated spectral research, with explicit unresolved and partial windows. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "alignment": {
        +    "additionalProperties": false,
        +    "description": "Alignment diagnostics; mismatch counts are absent when early gates stop alignment.",
        +    "properties": {
        +      "aligned_points": {
        +        "description": "Aligned contiguous intervals.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "discarded_common_intervals": {
        +        "description": "Common intervals before the last mismatch.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "filled_points": {
        +        "description": "Always zero; data are never filled.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "first_observation_sets_interval_start": {
        +        "const": true,
        +        "description": "First observation sets the first interval start.",
        +        "type": "boolean"
        +      },
        +      "method": {
        +        "const": "common_contiguous_interval_suffix",
        +        "description": "Alignment method.",
        +        "type": "string"
        +      },
        +      "unmatched_intervals": {
        +        "description": "Union intervals absent from at least one member.",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "method",
        +      "aligned_points",
        +      "first_observation_sets_interval_start",
        +      "filled_points"
        +    ],
        +    "type": "object"
        +  },
        +  "as_of": {
        +    "description": "Caller cutoff.",
        +    "type": "string"
        +  },
        +  "coverage": {
        +    "additionalProperties": false,
        +    "description": "Supplied-panel coverage only.",
        +    "properties": {
        +      "complete_for_supplied_series": {
        +        "description": "All returned windows assessed for the entire supplied panel.",
        +        "type": "boolean"
        +      },
        +      "market_universe_complete": {
        +        "const": false,
        +        "description": "No claim of market-wide completeness.",
        +        "type": "boolean"
        +      },
        +      "requested_series": {
        +        "description": "Requested panel members.",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "requested_series",
        +      "complete_for_supplied_series",
        +      "market_universe_complete"
        +    ],
        +    "type": "object"
        +  },
        +  "dynamics": {
        +    "description": "Only pairs of assessed windows are compared.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Adjacent assessed-window comparison.",
        +      "properties": {
        +        "calibrated_regime_change": {
        +          "const": false,
        +          "description": "No calibrated change decision.",
        +          "type": "boolean"
        +        },
        +        "correlation_rms_change": {
        +          "description": "RMS matrix-entry difference.",
        +          "type": "number"
        +        },
        +        "eigenvalue_rms_change": {
        +          "description": "RMS eigenvalue difference.",
        +          "type": "number"
        +        },
        +        "from": {
        +          "description": "Previous window-end timestamp.",
        +          "type": "string"
        +        },
        +        "leading_variance_share_change": {
        +          "description": "Current minus previous leading variance share.",
        +          "type": "number"
        +        },
        +        "leading_vector_comparison": {
        +          "description": "Whether vector overlap is resolved.",
        +          "enum": [
        +            "descriptive",
        +            "unresolved_degenerate_mode"
        +          ],
        +          "type": "string"
        +        },
        +        "leading_vector_squared_overlap": {
        +          "anyOf": [
        +            {
        +              "description": "Squared overlap; null when the leading mode is degenerate.",
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Squared overlap; null when the leading mode is degenerate. Null means unavailable or not applicable, never zero."
        +        },
        +        "to": {
        +          "description": "Current window-end timestamp.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "from",
        +        "to",
        +        "leading_variance_share_change",
        +        "eigenvalue_rms_change",
        +        "correlation_rms_change",
        +        "leading_vector_squared_overlap",
        +        "leading_vector_comparison",
        +        "calibrated_regime_change"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "execution_authority": {
        +    "const": false,
        +    "description": "No trading authority.",
        +    "type": "boolean"
        +  },
        +  "guarantee": {
        +    "description": "No statistical or market-performance guarantee is made.",
        +    "type": "null"
        +  },
        +  "is_e_value": {
        +    "const": false,
        +    "description": "No calibrated e-value.",
        +    "type": "boolean"
        +  },
        +  "latest": {
        +    "anyOf": [
        +      {
        +        "additionalProperties": false,
        +        "allOf": [
        +          {
        +            "if": {
        +              "properties": {
        +                "status": {
        +                  "const": "assessed"
        +                }
        +              }
        +            },
        +            "then": {
        +              "required": [
        +                "correlation",
        +                "eigenvalues",
        +                "leading_variance_share",
        +                "participation_ratio",
        +                "effective_rank",
        +                "numerical_rank",
        +                "leading_eigengap",
        +                "leading_loadings",
        +                "lag_one_correlations",
        +                "reference",
        +                "shrinkage_candidate"
        +              ]
        +            }
        +          }
        +        ],
        +        "description": "Window with all metrics absent when a series is constant or numerically unresolved.",
        +        "properties": {
        +          "correlation": {
        +            "description": "Rows of a matrix in the declared series order.",
        +            "items": {
        +              "description": "Numeric values in the documented order.",
        +              "items": {
        +                "description": "One finite numeric value.",
        +                "type": "number"
        +              },
        +              "type": "array"
        +            },
        +            "type": "array"
        +          },
        +          "effective_rank": {
        +            "description": "Exponential entropy of normalized positive eigenvalues.",
        +            "type": "number"
        +          },
        +          "eigenvalues": {
        +            "description": "Numeric values in the documented order.",
        +            "items": {
        +              "description": "One finite numeric value.",
        +              "type": "number"
        +            },
        +            "type": "array"
        +          },
        +          "lag_one_correlations": {
        +            "description": "Lag diagnostics in series order.",
        +            "items": {
        +              "additionalProperties": false,
        +              "description": "One series lag diagnostic.",
        +              "properties": {
        +                "correlation": {
        +                  "anyOf": [
        +                    {
        +                      "description": "Lag-one correlation, when estimable.",
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ],
        +                  "description": "Lag-one correlation, when estimable. Null means unavailable or not applicable, never zero."
        +                },
        +                "id": {
        +                  "description": "Series id.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "correlation"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "leading_eigengap": {
        +            "description": "First minus second eigenvalue.",
        +            "type": "number"
        +          },
        +          "leading_loadings": {
        +            "additionalProperties": {
        +              "description": "Eigenvector component.",
        +              "type": "number"
        +            },
        +            "description": "Leading eigenvector components keyed by caller series ids; sign is normalized, not an economic factor label.",
        +            "type": "object"
        +          },
        +          "leading_variance_share": {
        +            "description": "Largest eigenvalue divided by trace.",
        +            "type": "number"
        +          },
        +          "numerical_rank": {
        +            "description": "Eigenvalues above 1e-10.",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "observations": {
        +            "description": "Aligned intervals in this window.",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "participation_ratio": {
        +            "description": "Squared trace divided by sum of squared eigenvalues.",
        +            "type": "number"
        +          },
        +          "reasons": {
        +            "description": "Ordered statements or identifiers.",
        +            "items": {
        +              "description": "One retained statement or identifier.",
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "reference": {
        +            "additionalProperties": false,
        +            "description": "Idealized reference, not evidence of alpha or certified factors.",
        +            "properties": {
        +              "above_upper_count": {
        +                "description": "Eigenvalues above upper edge.",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "below_lower_count": {
        +                "description": "Eigenvalues below lower edge.",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "finite_sample_calibrated": {
        +                "const": false,
        +                "description": "Not a finite-sample significance test.",
        +                "type": "boolean"
        +              },
        +              "in_band_count": {
        +                "description": "Eigenvalues inside the reference band.",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "is_e_value": {
        +                "const": false,
        +                "description": "Not an e-value.",
        +                "type": "boolean"
        +              },
        +              "lower_edge": {
        +                "description": "Asymptotic lower reference edge.",
        +                "type": "number"
        +              },
        +              "name": {
        +                "const": "marchenko_pastur_iid_unit_variance",
        +                "description": "Reference model.",
        +                "type": "string"
        +              },
        +              "p_value": {
        +                "description": "No calibrated p-value.",
        +                "type": "null"
        +              },
        +              "q": {
        +                "description": "Series count divided by sample degrees of freedom.",
        +                "type": "number"
        +              },
        +              "sample_degrees_of_freedom": {
        +                "description": "Window observations minus one.",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "upper_edge": {
        +                "description": "Asymptotic upper reference edge.",
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "name",
        +              "q",
        +              "sample_degrees_of_freedom",
        +              "lower_edge",
        +              "upper_edge",
        +              "above_upper_count",
        +              "below_lower_count",
        +              "in_band_count",
        +              "finite_sample_calibrated",
        +              "p_value",
        +              "is_e_value"
        +            ],
        +            "type": "object"
        +          },
        +          "series_ids": {
        +            "description": "Ordered statements or identifiers.",
        +            "items": {
        +              "description": "One retained statement or identifier.",
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "shrinkage_candidate": {
        +            "additionalProperties": false,
        +            "description": "Experimental correlation candidate, not a validated risk model.",
        +            "properties": {
        +              "correlation": {
        +                "description": "Rows of a matrix in the declared series order.",
        +                "items": {
        +                  "description": "Numeric values in the documented order.",
        +                  "items": {
        +                    "description": "One finite numeric value.",
        +                    "type": "number"
        +                  },
        +                  "type": "array"
        +                },
        +                "type": "array"
        +              },
        +              "low_and_high_outliers_preserved_before_diagonal_normalization": {
        +                "const": true,
        +                "description": "Outliers retained before diagonal normalization.",
        +                "type": "boolean"
        +              },
        +              "method": {
        +                "const": "equalize_in_band_eigenvalues_then_restore_unit_diagonal",
        +                "description": "Construction.",
        +                "type": "string"
        +              },
        +              "out_of_sample_validated": {
        +                "const": false,
        +                "description": "No held-out validation.",
        +                "type": "boolean"
        +              },
        +              "positive_definite_guaranteed": {
        +                "const": false,
        +                "description": "Singular candidates remain possible.",
        +                "type": "boolean"
        +              },
        +              "status": {
        +                "const": "experimental",
        +                "description": "Candidate maturity.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "status",
        +              "correlation",
        +              "method",
        +              "low_and_high_outliers_preserved_before_diagonal_normalization",
        +              "positive_definite_guaranteed",
        +              "out_of_sample_validated"
        +            ],
        +            "type": "object"
        +          },
        +          "status": {
        +            "description": "Window assessment state.",
        +            "enum": [
        +              "assessed",
        +              "insufficient_visibility"
        +            ],
        +            "type": "string"
        +          },
        +          "window_end": {
        +            "description": "Last interval end in UTC.",
        +            "type": "string"
        +          },
        +          "window_start": {
        +            "description": "First interval start in UTC.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "window_start",
        +          "window_end",
        +          "observations",
        +          "series_ids",
        +          "status",
        +          "reasons"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Window with all metrics absent when a series is constant or numerically unresolved. Null means unavailable or not applicable, never zero."
        +  },
        +  "limits": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "maturity": {
        +    "const": "research",
        +    "description": "Research maturity.",
        +    "type": "string"
        +  },
        +  "policy": {
        +    "additionalProperties": false,
        +    "description": "Fully applied rolling policy.",
        +    "properties": {
        +      "max_windows": {
        +        "description": "Maximum returned windows.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "step_points": {
        +        "description": "Intervals between window ends.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "window_points": {
        +        "description": "Aligned intervals per window.",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "window_points",
        +      "step_points",
        +      "max_windows"
        +    ],
        +    "type": "object"
        +  },
        +  "policy_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "reasons": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "request_sha256": {
        +    "description": "SHA-256 of the canonicalized submitted request or applied policy.",
        +    "pattern": "^[0-9a-f]{64}$",
        +    "type": "string"
        +  },
        +  "schema": {
        +    "const": "noisefloor.spectral-assessment.v1",
        +    "description": "Result contract identifier.",
        +    "type": "string"
        +  },
        +  "series": {
        +    "description": "All requested series sorted by id.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "Panel member retained even when its source or history is ineligible.",
        +      "properties": {
        +        "age_seconds": {
        +          "anyOf": [
        +            {
        +              "description": "Cutoff minus last observation timestamp in seconds; may be negative for future data.",
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Cutoff minus last observation timestamp in seconds; may be negative for future data. Null means unavailable or not applicable, never zero."
        +        },
        +        "as_published_history_verified": {
        +          "const": false,
        +          "description": "Caller timestamps do not verify historical availability.",
        +          "type": "boolean"
        +        },
        +        "availability_timestamps_complete": {
        +          "description": "Every supplied observation declares availability and the series is nonempty.",
        +          "type": "boolean"
        +        },
        +        "available_at": {
        +          "anyOf": [
        +            {
        +              "description": "Last supplied availability timestamp, if present.",
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Last supplied availability timestamp, if present. Null means unavailable or not applicable, never zero."
        +        },
        +        "contiguous_intervals": {
        +          "description": "Transformed eligible intervals; zero when source gates fail.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "gap_indices": {
        +          "description": "Declared-calendar gap positions.",
        +          "items": {
        +            "description": "Zero-based observation index.",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "type": "array"
        +        },
        +        "group": {
        +          "description": "Declared group, defaulting to series id.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Caller-supplied series identifier.",
        +          "type": "string"
        +        },
        +        "kind": {
        +          "description": "Caller-declared measurement kind.",
        +          "type": "string"
        +        },
        +        "measurement_coverage": {
        +          "additionalProperties": false,
        +          "description": "Caller-declared measurement coverage.",
        +          "properties": {
        +            "declared_points": {
        +              "description": "Non-null declared denominators.",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "maximum": {
        +              "anyOf": [
        +                {
        +                  "description": "Maximum declared denominator.",
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Maximum declared denominator. Null means unavailable or not applicable, never zero."
        +            },
        +            "minimum": {
        +              "anyOf": [
        +                {
        +                  "description": "Minimum declared denominator.",
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Minimum declared denominator. Null means unavailable or not applicable, never zero."
        +            },
        +            "sampling_adjustment_applied": {
        +              "const": false,
        +              "description": "No adjustment is made.",
        +              "type": "boolean"
        +            },
        +            "status": {
        +              "description": "Declared denominator state.",
        +              "enum": [
        +                "not_supplied",
        +                "incomplete",
        +                "variable",
        +                "constant_declared_count"
        +              ],
        +              "type": "string"
        +            },
        +            "tail_points": {
        +              "description": "Contiguous tail observations.",
        +              "minimum": 0,
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "declared_points",
        +            "tail_points",
        +            "minimum",
        +            "maximum",
        +            "sampling_adjustment_applied"
        +          ],
        +          "type": "object"
        +        },
        +        "missing_points": {
        +          "description": "Null-valued observations.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "observed_at": {
        +          "anyOf": [
        +            {
        +              "description": "Last supplied observation timestamp; null for no observations.",
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Last supplied observation timestamp; null for no observations. Null means unavailable or not applicable, never zero."
        +        },
        +        "reasons": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "source": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "description": "Caller-defined source identifier retained in results, for example synthetic-demo or a licensed provider name.",
        +              "maxLength": 128,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "rights": {
        +              "description": "Caller's source-use declaration. Only permitted permits numerical assessment; unknown and restricted remain explicit visibility gaps. The server does not grant or verify rights.",
        +              "enum": [
        +                "permitted",
        +                "unknown",
        +                "restricted"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "Optional source or evidence URL retained for attribution; no URL is fetched or independently verified.",
        +              "maxLength": 2048,
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "rights"
        +          ],
        +          "type": "object"
        +        },
        +        "transform": {
        +          "description": "Transformation applied to the contiguous tail.",
        +          "enum": [
        +            "log_return",
        +            "identity_return",
        +            "first_difference"
        +          ],
        +          "type": "string"
        +        },
        +        "unit": {
        +          "description": "Caller-declared input unit.",
        +          "type": "string"
        +        },
        +        "warnings": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "kind",
        +        "unit",
        +        "source",
        +        "group",
        +        "reasons",
        +        "warnings",
        +        "observed_at",
        +        "available_at",
        +        "age_seconds",
        +        "gap_indices",
        +        "missing_points",
        +        "availability_timestamps_complete",
        +        "as_published_history_verified",
        +        "transform",
        +        "measurement_coverage",
        +        "contiguous_intervals"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "status": {
        +    "description": "Window/visibility result.",
        +    "enum": [
        +      "insufficient_visibility",
        +      "assessed",
        +      "partial"
        +    ],
        +    "type": "string"
        +  },
        +  "validity": {
        +    "const": "descriptive",
        +    "description": "Descriptive assessment, not a probability or statistical certificate.",
        +    "type": "string"
        +  },
        +  "windows": {
        +    "description": "Complete recent windows in chronological order.",
        +    "items": {
        +      "additionalProperties": false,
        +      "allOf": [
        +        {
        +          "if": {
        +            "properties": {
        +              "status": {
        +                "const": "assessed"
        +              }
        +            }
        +          },
        +          "then": {
        +            "required": [
        +              "correlation",
        +              "eigenvalues",
        +              "leading_variance_share",
        +              "participation_ratio",
        +              "effective_rank",
        +              "numerical_rank",
        +              "leading_eigengap",
        +              "leading_loadings",
        +              "lag_one_correlations",
        +              "reference",
        +              "shrinkage_candidate"
        +            ]
        +          }
        +        }
        +      ],
        +      "description": "Window with all metrics absent when a series is constant or numerically unresolved.",
        +      "properties": {
        +        "correlation": {
        +          "description": "Rows of a matrix in the declared series order.",
        +          "items": {
        +            "description": "Numeric values in the documented order.",
        +            "items": {
        +              "description": "One finite numeric value.",
        +              "type": "number"
        +            },
        +            "type": "array"
        +          },
        +          "type": "array"
        +        },
        +        "effective_rank": {
        +          "description": "Exponential entropy of normalized positive eigenvalues.",
        +          "type": "number"
        +        },
        +        "eigenvalues": {
        +          "description": "Numeric values in the documented order.",
        +          "items": {
        +            "description": "One finite numeric value.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "lag_one_correlations": {
        +          "description": "Lag diagnostics in series order.",
        +          "items": {
        +            "additionalProperties": false,
        +            "description": "One series lag diagnostic.",
        +            "properties": {
        +              "correlation": {
        +                "anyOf": [
        +                  {
        +                    "description": "Lag-one correlation, when estimable.",
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ],
        +                "description": "Lag-one correlation, when estimable. Null means unavailable or not applicable, never zero."
        +              },
        +              "id": {
        +                "description": "Series id.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "correlation"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "leading_eigengap": {
        +          "description": "First minus second eigenvalue.",
        +          "type": "number"
        +        },
        +        "leading_loadings": {
        +          "additionalProperties": {
        +            "description": "Eigenvector component.",
        +            "type": "number"
        +          },
        +          "description": "Leading eigenvector components keyed by caller series ids; sign is normalized, not an economic factor label.",
        +          "type": "object"
        +        },
        +        "leading_variance_share": {
        +          "description": "Largest eigenvalue divided by trace.",
        +          "type": "number"
        +        },
        +        "numerical_rank": {
        +          "description": "Eigenvalues above 1e-10.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "observations": {
        +          "description": "Aligned intervals in this window.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "participation_ratio": {
        +          "description": "Squared trace divided by sum of squared eigenvalues.",
        +          "type": "number"
        +        },
        +        "reasons": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "reference": {
        +          "additionalProperties": false,
        +          "description": "Idealized reference, not evidence of alpha or certified factors.",
        +          "properties": {
        +            "above_upper_count": {
        +              "description": "Eigenvalues above upper edge.",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "below_lower_count": {
        +              "description": "Eigenvalues below lower edge.",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "finite_sample_calibrated": {
        +              "const": false,
        +              "description": "Not a finite-sample significance test.",
        +              "type": "boolean"
        +            },
        +            "in_band_count": {
        +              "description": "Eigenvalues inside the reference band.",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "is_e_value": {
        +              "const": false,
        +              "description": "Not an e-value.",
        +              "type": "boolean"
        +            },
        +            "lower_edge": {
        +              "description": "Asymptotic lower reference edge.",
        +              "type": "number"
        +            },
        +            "name": {
        +              "const": "marchenko_pastur_iid_unit_variance",
        +              "description": "Reference model.",
        +              "type": "string"
        +            },
        +            "p_value": {
        +              "description": "No calibrated p-value.",
        +              "type": "null"
        +            },
        +            "q": {
        +              "description": "Series count divided by sample degrees of freedom.",
        +              "type": "number"
        +            },
        +            "sample_degrees_of_freedom": {
        +              "description": "Window observations minus one.",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "upper_edge": {
        +              "description": "Asymptotic upper reference edge.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "q",
        +            "sample_degrees_of_freedom",
        +            "lower_edge",
        +            "upper_edge",
        +            "above_upper_count",
        +            "below_lower_count",
        +            "in_band_count",
        +            "finite_sample_calibrated",
        +            "p_value",
        +            "is_e_value"
        +          ],
        +          "type": "object"
        +        },
        +        "series_ids": {
        +          "description": "Ordered statements or identifiers.",
        +          "items": {
        +            "description": "One retained statement or identifier.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "shrinkage_candidate": {
        +          "additionalProperties": false,
        +          "description": "Experimental correlation candidate, not a validated risk model.",
        +          "properties": {
        +            "correlation": {
        +              "description": "Rows of a matrix in the declared series order.",
        +              "items": {
        +                "description": "Numeric values in the documented order.",
        +                "items": {
        +                  "description": "One finite numeric value.",
        +                  "type": "number"
        +                },
        +                "type": "array"
        +              },
        +              "type": "array"
        +            },
        +            "low_and_high_outliers_preserved_before_diagonal_normalization": {
        +              "const": true,
        +              "description": "Outliers retained before diagonal normalization.",
        +              "type": "boolean"
        +            },
        +            "method": {
        +              "const": "equalize_in_band_eigenvalues_then_restore_unit_diagonal",
        +              "description": "Construction.",
        +              "type": "string"
        +            },
        +            "out_of_sample_validated": {
        +              "const": false,
        +              "description": "No held-out validation.",
        +              "type": "boolean"
        +            },
        +            "positive_definite_guaranteed": {
        +              "const": false,
        +              "description": "Singular candidates remain possible.",
        +              "type": "boolean"
        +            },
        +            "status": {
        +              "const": "experimental",
        +              "description": "Candidate maturity.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "correlation",
        +            "method",
        +            "low_and_high_outliers_preserved_before_diagonal_normalization",
        +            "positive_definite_guaranteed",
        +            "out_of_sample_validated"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "Window assessment state.",
        +          "enum": [
        +            "assessed",
        +            "insufficient_visibility"
        +          ],
        +          "type": "string"
        +        },
        +        "window_end": {
        +          "description": "Last interval end in UTC.",
        +          "type": "string"
        +        },
        +        "window_start": {
        +          "description": "First interval start in UTC.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "window_start",
        +        "window_end",
        +        "observations",
        +        "series_ids",
        +        "status",
        +        "reasons"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
    • Changedwhich_metrics_matter4 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alpha": {},
        +      "assumptions": {},
        +      "board_evidence": {},
        +      "descriptive_mean": {},
        +      "guarantee": {},
        +      "k": {},
        +      "method": {},
        +      "n_watched": {},
        +      "note": {},
        +      "ranked": {},
        +      "reading": {},
        +      "selected": {},
        +      "threshold": {},
        +      "valid_evalues": {},
        +      "validity": {}
        +    },
        +    "required": [
        +      "selected",
        +      "alpha",
        +      "k",
        +      "n_watched",
        +      "threshold",
        +      "board_evidence",
        +      "descriptive_mean",
        +      "ranked",
        +      "valid_evalues",
        +      "validity",
        +      "guarantee",
        +      "assumptions",
        +      "reading",
        +      "method",
        +      "note"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Existing tool-error payload; no successful result fields are implied.",
        +    "properties": {
        +      "error": {
        +        "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / description
        Previous value: -"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."New value: +"A complete nonempty supplied-family result, including unverified rankings. Empty input is a tool error. Tool errors retain the separate error-message shape."
      • addedOutput schema / properties
        Added value: +{
        +  "alpha": {
        +    "description": "Requested expected false-discovery proportion bound, conditional on valid e-values.",
        +    "type": "number"
        +  },
        +  "assumptions": {
        +    "description": "Ordered statements or identifiers.",
        +    "items": {
        +      "description": "One retained statement or identifier.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "board_evidence": {
        +    "anyOf": [
        +      {
        +        "description": "Mean supplied valid e-values; null without attestation.",
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Mean supplied valid e-values; null without attestation. Null means unavailable or not applicable, never zero."
        +  },
        +  "descriptive_mean": {
        +    "description": "Mean supplied values, without certifying their statistical construction.",
        +    "type": "number"
        +  },
        +  "error": {
        +    "description": "Validation or computation failure message; inspect MCP isError or the HTTP status.",
        +    "type": "string"
        +  },
        +  "guarantee": {
        +    "anyOf": [
        +      {
        +        "description": "Conditional e-BH statement; null for unverified inputs.",
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Conditional e-BH statement; null for unverified inputs. Null means unavailable or not applicable, never zero."
        +  },
        +  "k": {
        +    "description": "Number selected.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "method": {
        +    "description": "Conditional e-BH or descriptive ranking.",
        +    "type": "string"
        +  },
        +  "n_watched": {
        +    "description": "Number of supplied metrics.",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "note": {
        +    "description": "Selection requests review, not trading.",
        +    "type": "string"
        +  },
        +  "ranked": {
        +    "description": "Inputs sorted by decreasing value then name.",
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "One ranked input.",
        +      "properties": {
        +        "evidence": {
        +          "description": "Supplied nonnegative value.",
        +          "type": "number"
        +        },
        +        "metric": {
        +          "description": "Caller-supplied name.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "metric",
        +        "evidence"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "reading": {
        +    "description": "Selection interpretation.",
        +    "type": "string"
        +  },
        +  "selected": {
        +    "description": "Names selected only when the caller attests valid e-values.",
        +    "items": {
        +      "description": "Caller-supplied metric name.",
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "threshold": {
        +    "anyOf": [
        +      {
        +        "description": "e-BH threshold; null without the caller's validity attestation.",
        +        "type": "number"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "e-BH threshold; null without the caller's validity attestation. Null means unavailable or not applicable, never zero."
        +  },
        +  "valid_evalues": {
        +    "description": "Caller attestation, not a server certification.",
        +    "type": "boolean"
        +  },
        +  "validity": {
        +    "description": "Selection contract.",
        +    "enum": [
        +      "conditional_on_valid_evalues",
        +      "unverified_inputs"
        +    ],
        +    "type": "string"
        +  }
        +}
  2. 10 tool updatesv0.4.3-glama.1
    • Changedab_test11 fields changed
      • addedInput schema / properties / a_label / default
        Added value: +"A"
      • addedInput schema / properties / a_label / description
        Added value: +"Arm A's output key and possible winner label; default A. Must differ from b_label and not replace result keys such as decided, winner or reading."
      • addedInput schema / properties / a_successes / description
        Added value: +"Cumulative successful binary outcomes in arm A, an integer from 0 through a_total; do not supply a percentage."
      • addedInput schema / properties / a_total / description
        Added value: +"Cumulative trials in arm A, including successes and failures. Zero is valid and returns an undecided result."
      • addedInput schema / properties / alpha / default
        Added value: +0.05
      • addedInput schema / properties / alpha / description
        Added value: +"Total error budget shared by both confidence sequences; default 0.05 means 5%, split equally between arms. Must be strictly between 0 and 1."
      • addedInput schema / properties / b_label / default
        Added value: +"B"
      • addedInput schema / properties / b_label / description
        Added value: +"Arm B's output key and possible winner label; default B. Must differ from a_label and not replace result keys such as alpha, method or validity."
      • addedInput schema / properties / b_successes / description
        Added value: +"Cumulative successful binary outcomes in arm B, an integer from 0 through b_total; do not supply a percentage."
      • addedInput schema / properties / b_total / description
        Added value: +"Cumulative trials in arm B, including successes and failures. Counts must use the same pre-defined experiment and outcome as arm A."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changeddid_it_change5 fields changed
      • addedInput schema / properties / half_life / description
        Added value: +"Optional positive half-life measured in prior observations, not seconds. A reading this many positions older receives half the rank weight. Omit for equal weights; weighting remains descriptive, not calibrated."
      • addedInput schema / properties / two_sided / default
        Added value: +true
      • addedInput schema / properties / two_sided / description
        Added value: +"Default true monitors upward and downward departures, with watch/changed thresholds 200/1000. False monitors upward only, with thresholds 100/500; thresholds are descriptive."
      • addedInput schema / properties / values / description
        Added value: +"One to 2048 finite readings in chronological order, oldest first, with consistent units and cadence. The last entry is the current reading; no dates or missing values are inferred."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changeddyson_reference9 fields changed
      • addedInput schema / properties / dimension / default
        Added value: +6
      • addedInput schema / properties / dimension / description
        Added value: +"Size N of the synthetic real-symmetric N-by-N matrix and number of eigenvalues per step; default 6."
      • addedInput schema / properties / dt / default
        Added value: +0.05
      • addedInput schema / properties / dt / description
        Added value: +"Synthetic time increment; default 0.05. This is not seconds or a market horizon. Off-diagonal increment variance is dt/N; diagonal variance is 2*dt/N."
      • addedInput schema / properties / seed / default
        Added value: +0
      • addedInput schema / properties / seed / description
        Added value: +"Integer random seed for deterministic replay in a recorded Python runtime; default 0. Record the implementation fingerprint and runtime with results."
      • addedInput schema / properties / steps / default
        Added value: +40
      • addedInput schema / properties / steps / description
        Added value: +"Number of Brownian increments; default 40. The returned path contains steps + 1 snapshots, including the initial zero matrix."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changedforecast_next4 fields changed
      • addedInput schema / properties / nominal / default
        Added value: +0.8
      • addedInput schema / properties / nominal / description
        Added value: +"Target empirical interval coverage as a fraction strictly between 0 and 1; default 0.80 means 80%, not 80. The adaptive feedback does not guarantee the next observation is covered."
      • addedInput schema / properties / values / description
        Added value: +"One to 2048 finite chronological observations, oldest first, in consistent units and cadence. At least 11 readings are needed for ten prior one-step errors; no missing values, date interpolation or resampling."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changedmarket_assessment29 fields changed
      • addedInput schema / properties / as_of / description
        Added value: +"UTC decision-time cutoff for source freshness and availability checks; for example 2026-01-01T12:00:00Z. Future observations are not silently included."
      • addedInput schema / properties / policy / description
        Added value: +"Optional review thresholds; omitted fields use the documented defaults. Policies do not create statistical or trading guarantees."
      • addedInput schema / properties / policy / properties / baseline_points / default
        Added value: +30
      • addedInput schema / properties / policy / properties / baseline_points / description
        Added value: +"Number of earlier transformed observations in the baseline window; default 30. Total required transformed history is baseline_points + recent_points."
      • addedInput schema / properties / policy / properties / coverage_drop_fraction / default
        Added value: +0.2
      • addedInput schema / properties / policy / properties / coverage_drop_fraction / description
        Added value: +"Absolute fractional change in median measurement coverage that prompts review, including increases; default 0.2 means 20%. Applies only to supplied sample_size values."
      • addedInput schema / properties / policy / properties / move_threshold / default
        Added value: +3
      • addedInput schema / properties / policy / properties / move_threshold / description
        Added value: +"Departure threshold in baseline robust-spread units (1.4826 times median absolute deviation); default 3.0. This is a review threshold, not a significance level."
      • addedInput schema / properties / policy / properties / recent_points / default
        Added value: +3
      • addedInput schema / properties / policy / properties / recent_points / description
        Added value: +"Number of latest transformed observations compared with the baseline; default 3. Persistence requires at least two qualifying readings, so a one-point window cannot establish persistence."
      • addedInput schema / properties / policy / properties / volatility_ratio / default
        Added value: +3
      • addedInput schema / properties / policy / properties / volatility_ratio / description
        Added value: +"Recent-to-baseline robust-spread ratio that flags volatility expansion; default 3.0. A constant baseline followed by positive spread is also flagged."
      • addedInput schema / properties / series / description
        Added value: +"Up to 32 caller-supplied series to assess independently, with unique ids and source/clock metadata. An empty list returns insufficient_visibility."
      • addedInput schema / properties / series / items / properties / group / description
        Added value: +"Optional caller-defined grouping label for review queues; defaults to this series id. It does not certify independence or comparability."
      • addedInput schema / properties / series / items / properties / id / description
        Added value: +"Unique series identifier within this request, used in results and cross-series relationships."
      • addedInput schema / properties / series / items / properties / kind / description
        Added value: +"Measurement type. Both assessment tools convert price to log returns. market_assessment keeps other values unchanged; spectral_assessment keeps return values and first-differences level, spread, rate and count."
      • addedInput schema / properties / series / items / properties / max_age_seconds / description
        Added value: +"Maximum allowed age in seconds of the last observation relative to as_of. Older data remains insufficient_visibility; choose an appropriate cadence-specific limit."
      • addedInput schema / properties / series / items / properties / max_gap_seconds / description
        Added value: +"Optional largest allowed time gap in seconds between observations. A larger gap restarts the contiguous tail. If omitted, calendar gap policy is unknown and a warning is returned."
      • addedInput schema / properties / series / items / properties / observations / description
        Added value: +"Zero to 2048 observations in strictly increasing UTC order. Empty or inadequate histories return visibility gaps; null values and declared time gaps are preserved, never interpolated."
      • addedInput schema / properties / series / items / properties / observations / items / properties / available_at / description
        Added value: +"UTC time the observation became available to the caller. A time before observed_at becomes an availability_precedes_observation visibility gap; after as_of becomes not_yet_available. Omission is retained as incomplete availability history."
      • addedInput schema / properties / series / items / properties / observations / items / properties / observed_at / description
        Added value: +"Time represented by this observation, in UTC. Timestamps within a series must be unique and strictly increasing."
      • addedInput schema / properties / series / items / properties / observations / items / properties / sample_size / description
        Added value: +"Positive measurement-coverage denominator for this observation, or null when missing. This is not trading volume. Omit if coverage is not supplied; zero is invalid."
      • addedInput schema / properties / series / items / properties / observations / items / properties / value / description
        Added value: +"Finite measurement in the declared series unit. Prices must be positive and counts nonnegative. Use null for missing data; it breaks the contiguous analysis window and is never filled."
      • addedInput schema / properties / series / items / properties / source / description
        Added value: +"Source identity, optional attribution URL and declared usage rights. All are caller-supplied, not attestations."
      • addedInput schema / properties / series / items / properties / source / properties / id / description
        Added value: +"Caller-defined source identifier retained in results, for example synthetic-demo or a licensed provider name."
      • addedInput schema / properties / series / items / properties / source / properties / rights / description
        Added value: +"Caller's source-use declaration. Only permitted permits numerical assessment; unknown and restricted remain explicit visibility gaps. The server does not grant or verify rights."
      • addedInput schema / properties / series / items / properties / source / properties / url / description
        Added value: +"Optional source or evidence URL retained for attribution; no URL is fetched or independently verified."
      • addedInput schema / properties / series / items / properties / unit / description
        Added value: +"Consistent measurement unit for all observations, for example USD, decimal_return, basis_points or count. No currency conversion, percent conversion or economic comparability is inferred."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changednarrative_triage22 fields changed
      • addedInput schema / properties / as_of / description
        Added value: +"UTC cutoff for headline recency and availability, for example 2026-01-01T12:00:00Z."
      • addedInput schema / properties / events / description
        Added value: +"Up to 500 caller-supplied headline records with unique ids. Supply the collection you are permitted to use; input order does not determine queue order. Empty input returns insufficient_visibility."
      • addedInput schema / properties / events / items / properties / available_at / description
        Added value: +"Optional UTC time the headline became available to the caller; must not precede published_at. A value after as_of excludes it as not_yet_available. Omission prevents a verified as-published history claim."
      • addedInput schema / properties / events / items / properties / entities / description
        Added value: +"Up to 64 caller-assigned entity ids, for example SYNTHETIC_CO. Matching is exact and case-sensitive. An empty list remains unmapped; entities are not inferred from title text."
      • addedInput schema / properties / events / items / properties / event_key / description
        Added value: +"Optional caller-defined event identity. Different explicit keys prevent merging; a shared key with different wording or quantities can flag separate conflict candidates for review."
      • addedInput schema / properties / events / items / properties / id / description
        Added value: +"Unique event identifier within the request, retained in event records and cluster member_ids."
      • addedInput schema / properties / events / items / properties / published_at / description
        Added value: +"Headline publication time in UTC; future or stale headlines are retained with an exclusion reason."
      • addedInput schema / properties / events / items / properties / source / description
        Added value: +"Caller-supplied source identity and type, with optional attribution and family. No retrieval or independent source verification occurs."
      • addedInput schema / properties / events / items / properties / source / properties / family / description
        Added value: +"Optional shared source-family label for syndication or common ownership. Defaults to URL hostname, then source id. Distinct families are not verified independent corroboration."
      • addedInput schema / properties / events / items / properties / source / properties / id / description
        Added value: +"Caller-defined source identifier retained with the headline."
      • addedInput schema / properties / events / items / properties / source / properties / kind / description
        Added value: +"Caller-declared source type, prioritized in this order: primary, reporting, commentary. This label does not verify truth, authority or independence."
      • addedInput schema / properties / events / items / properties / source / properties / url / description
        Added value: +"Optional attribution URL, never fetched. Its hostname is the source-family fallback when family is omitted."
      • addedInput schema / properties / events / items / properties / title / description
        Added value: +"Headline text, up to 2000 characters, treated only as untrusted data. Wording, numbers and negation guide grouping; this is not full article analysis."
      • addedInput schema / properties / focus / description
        Added value: +"Optional entity ids of interest, matched exactly to each event's entities. Omitted or empty means no entity filter. Events with no mapped entity are retained for review; mapped off-focus events are excluded."
      • addedInput schema / properties / policy / description
        Added value: +"Optional triage settings; omitted fields use 86400 seconds maximum age, 20 queue items and 0.8 wording similarity."
      • addedInput schema / properties / policy / properties / max_age_seconds / default
        Added value: +86400
      • addedInput schema / properties / policy / properties / max_age_seconds / description
        Added value: +"Maximum headline age in seconds at as_of; default 86400 (24 hours). Older events are retained as stale and excluded from candidate clusters."
      • addedInput schema / properties / policy / properties / max_items / default
        Added value: +20
      • addedInput schema / properties / policy / properties / max_items / description
        Added value: +"Maximum clusters in attention_queue; default 20. All clusters and events remain available, with overflow listed in deferred_cluster_ids."
      • addedInput schema / properties / policy / properties / similarity_threshold / default
        Added value: +0.8
      • addedInput schema / properties / policy / properties / similarity_threshold / description
        Added value: +"Minimum token-set Jaccard similarity for grouping; default 0.8. Matching entities and compatible quantities, negation, direction and units are also required."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changedreal_or_sampling3 fields changed
      • addedInput schema / properties / sample_sizes / description
        Added value: +"Positive measurement denominators aligned one-for-one with values. Equal array length is required. Zero coverage is missing data, not a valid denominator; economic trading volume is not measurement coverage."
      • addedInput schema / properties / values / description
        Added value: +"Chronological metric readings in consistent units, one per sample_sizes entry. At least 10 aligned pairs are needed; all earlier pairs form the reference for the latest reading."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changedscore_forecasts4 fields changed
      • addedInput schema / properties / nominal / default
        Added value: +0.8
      • addedInput schema / properties / nominal / description
        Added value: +"Target interval coverage fraction, default 0.80. Use the same value passed to forecast_next for like-for-like replay; not a confidence level for the backtest result."
      • addedInput schema / properties / values / description
        Added value: +"One to 2048 chronological realized observations with consistent units/cadence; at least 20 to score. Predictions begin after ten one-step errors, so the first scored record has zero-based index 11."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changedspectral_assessment25 fields changed
      • addedInput schema / properties / as_of / description
        Added value: +"UTC cutoff for freshness and availability, for example 2026-01-01T12:00:00Z. Caller timestamps do not certify historical as-published vintages."
      • addedInput schema / properties / policy / description
        Added value: +"Optional rolling-window sizes; omitted fields default to 60 intervals, 20-interval steps and at most 4 windows."
      • addedInput schema / properties / policy / properties / max_windows / default
        Added value: +4
      • addedInput schema / properties / policy / properties / max_windows / description
        Added value: +"Maximum recent complete windows returned, in chronological order; default 4. Fewer are returned when only a shorter eligible history is available."
      • addedInput schema / properties / policy / properties / step_points / default
        Added value: +20
      • addedInput schema / properties / policy / properties / step_points / description
        Added value: +"Step back in aligned intervals between window endpoints; default 20. Overlapping windows are descriptive and not independent tests."
      • addedInput schema / properties / policy / properties / window_points / default
        Added value: +60
      • addedInput schema / properties / policy / properties / window_points / description
        Added value: +"Aligned transformed intervals per correlation window; default 60. Must exceed the supplied series count; needs at least window_points + 1 original observations per series, including returns."
      • addedInput schema / properties / series / description
        Added value: +"Caller-defined comparable panel, normally 2–32 series with unique ids. All members must pass source and clock gates. Both endpoints of each interval must align; rejected members are never silently removed."
      • addedInput schema / properties / series / items / properties / group / description
        Added value: +"Optional caller-defined grouping label for review queues; defaults to this series id. It does not certify independence or comparability."
      • addedInput schema / properties / series / items / properties / id / description
        Added value: +"Unique series identifier within this request, used in results and cross-series relationships."
      • addedInput schema / properties / series / items / properties / kind / description
        Added value: +"Measurement type. Both assessment tools convert price to log returns. market_assessment keeps other values unchanged; spectral_assessment keeps return values and first-differences level, spread, rate and count."
      • addedInput schema / properties / series / items / properties / max_age_seconds / description
        Added value: +"Maximum allowed age in seconds of the last observation relative to as_of. Older data remains insufficient_visibility; choose an appropriate cadence-specific limit."
      • addedInput schema / properties / series / items / properties / max_gap_seconds / description
        Added value: +"Optional largest allowed time gap in seconds between observations. A larger gap restarts the contiguous tail. If omitted, calendar gap policy is unknown and a warning is returned."
      • addedInput schema / properties / series / items / properties / observations / description
        Added value: +"Zero to 2048 observations in strictly increasing UTC order. Empty or inadequate histories return visibility gaps; null values and declared time gaps are preserved, never interpolated."
      • addedInput schema / properties / series / items / properties / observations / items / properties / available_at / description
        Added value: +"UTC time the observation became available to the caller. A time before observed_at becomes an availability_precedes_observation visibility gap; after as_of becomes not_yet_available. Omission is retained as incomplete availability history."
      • addedInput schema / properties / series / items / properties / observations / items / properties / observed_at / description
        Added value: +"Time represented by this observation, in UTC. Timestamps within a series must be unique and strictly increasing."
      • addedInput schema / properties / series / items / properties / observations / items / properties / sample_size / description
        Added value: +"Positive measurement-coverage denominator for this observation, or null when missing. This is not trading volume. Omit if coverage is not supplied; zero is invalid."
      • addedInput schema / properties / series / items / properties / observations / items / properties / value / description
        Added value: +"Finite measurement in the declared series unit. Prices must be positive and counts nonnegative. Use null for missing data; it breaks the contiguous analysis window and is never filled."
      • addedInput schema / properties / series / items / properties / source / description
        Added value: +"Source identity, optional attribution URL and declared usage rights. All are caller-supplied, not attestations."
      • addedInput schema / properties / series / items / properties / source / properties / id / description
        Added value: +"Caller-defined source identifier retained in results, for example synthetic-demo or a licensed provider name."
      • addedInput schema / properties / series / items / properties / source / properties / rights / description
        Added value: +"Caller's source-use declaration. Only permitted permits numerical assessment; unknown and restricted remain explicit visibility gaps. The server does not grant or verify rights."
      • addedInput schema / properties / series / items / properties / source / properties / url / description
        Added value: +"Optional source or evidence URL retained for attribution; no URL is fetched or independently verified."
      • addedInput schema / properties / series / items / properties / unit / description
        Added value: +"Consistent measurement unit for all observations, for example USD, decimal_return, basis_points or count. No currency conversion, percent conversion or economic comparability is inferred."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
    • Changedwhich_metrics_matter7 fields changed
      • addedInput schema / properties / alpha / default
        Added value: +0.1
      • addedInput schema / properties / alpha / description
        Added value: +"Target expected false-discovery proportion for this supplied family, default 0.10 (10%), strictly between 0 and 1. Only controls selection conditionally when valid_evalues=true; it is not a per-metric probability."
      • addedInput schema / properties / evidence / additionalProperties / description
        Added value: +"Nonnegative evidence score for this metric; zero is allowed. Magnitude alone does not prove e-value validity."
      • addedInput schema / properties / evidence / description
        Added value: +"Map 1–128 nonempty metric names (up to 128 characters) to finite nonnegative scores; larger scores rank first, ties use metric name. Valid e-values are dimensionless; unverified scores receive descriptive ranking only."
      • addedInput schema / properties / valid_evalues / default
        Added value: +false
      • addedInput schema / properties / valid_evalues / description
        Added value: +"Caller assertion that every score is a valid e-value with defined null, sampling/selection procedure and observation window. Default false performs ranking only. True enables conditional e-BH; it does not validate provenance or the statistical construction."
      • addedOutput schema / description
        Added value: +"Tool-specific result object described in each tool's description. Check status/ok/state, reading, validity and limits before using numbers. MCP returns this object in structuredContent and JSON text; invalid input returns isError=true with an error field. No tool fetches sources or executes trades."
  3. 10 tool updatesv0.4.1
    • Changedab_test20 fields changed
      • addedInput schema / properties / a_label / maxLength
        Added value: +128
      • addedInput schema / properties / a_label / minLength
        Added value: +1
      • removedInput schema / properties / a_successes / description
        Removed value: -"conversions in arm A"
      • addedInput schema / properties / a_successes / maximum
        Added value: +1000000000000
      • addedInput schema / properties / a_successes / minimum
        Added value: +0
      • removedInput schema / properties / a_total / description
        Removed value: -"total observations in arm A"
      • addedInput schema / properties / a_total / maximum
        Added value: +1000000000000
      • addedInput schema / properties / a_total / minimum
        Added value: +0
      • removedInput schema / properties / alpha / description
        Removed value: -"error budget, default 0.05"
      • addedInput schema / properties / alpha / exclusiveMaximum
        Added value: +1
      • addedInput schema / properties / alpha / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / b_label / maxLength
        Added value: +128
      • addedInput schema / properties / b_label / minLength
        Added value: +1
      • removedInput schema / properties / b_successes / description
        Removed value: -"conversions in arm B"
      • addedInput schema / properties / b_successes / maximum
        Added value: +1000000000000
      • addedInput schema / properties / b_successes / minimum
        Added value: +0
      • removedInput schema / properties / b_total / description
        Removed value: -"total observations in arm B"
      • addedInput schema / properties / b_total / maximum
        Added value: +1000000000000
      • addedInput schema / properties / b_total / minimum
        Added value: +0
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changeddid_it_change7 fields changed
      • removedInput schema / properties / half_life / description
        Removed value: -"optional: readings after which old history counts half, for drifting metrics"
      • addedInput schema / properties / half_life / exclusiveMinimum
        Added value: +0
      • removedInput schema / properties / two_sided / description
        Removed value: -"detect drops as well as rises (default true)"
      • removedInput schema / properties / values / description
        Removed value: -"the metric's history, oldest first"
      • addedInput schema / properties / values / maxItems
        Added value: +2048
      • addedInput schema / properties / values / minItems
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Addeddyson_reference
    • Changedforecast_next7 fields changed
      • removedInput schema / properties / nominal / description
        Removed value: -"range coverage, default 0.8"
      • addedInput schema / properties / nominal / exclusiveMaximum
        Added value: +1
      • addedInput schema / properties / nominal / exclusiveMinimum
        Added value: +0
      • removedInput schema / properties / values / description
        Removed value: -"the metric's history, oldest first"
      • addedInput schema / properties / values / maxItems
        Added value: +2048
      • addedInput schema / properties / values / minItems
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Addedmarket_assessment
    • Addednarrative_triage
    • Changedreal_or_sampling8 fields changed
      • removedInput schema / properties / sample_sizes / description
        Removed value: -"the denominator behind each reading, same order and length"
      • addedInput schema / properties / sample_sizes / items / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / sample_sizes / maxItems
        Added value: +2048
      • addedInput schema / properties / sample_sizes / minItems
        Added value: +1
      • removedInput schema / properties / values / description
        Removed value: -"the metric's history, oldest first"
      • addedInput schema / properties / values / maxItems
        Added value: +2048
      • addedInput schema / properties / values / minItems
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedscore_forecasts7 fields changed
      • removedInput schema / properties / nominal / description
        Removed value: -"range coverage, default 0.8"
      • addedInput schema / properties / nominal / exclusiveMaximum
        Added value: +1
      • addedInput schema / properties / nominal / exclusiveMinimum
        Added value: +0
      • removedInput schema / properties / values / description
        Removed value: -"the metric's history, oldest first"
      • addedInput schema / properties / values / maxItems
        Added value: +2048
      • addedInput schema / properties / values / minItems
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Addedspectral_assessment
    • Changedwhich_metrics_matter9 fields changed
      • removedInput schema / properties / alpha / description
        Removed value: -"false-discovery rate, default 0.1"
      • addedInput schema / properties / alpha / exclusiveMaximum
        Added value: +1
      • addedInput schema / properties / alpha / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / evidence / additionalProperties / minimum
        Added value: +0
      • removedInput schema / properties / evidence / description
        Removed value: -"metric name -> evidence value, e.g. the 'evidence' field from did_it_change"
      • addedInput schema / properties / evidence / maxProperties
        Added value: +128
      • addedInput schema / properties / evidence / minProperties
        Added value: +1
      • addedInput schema / properties / valid_evalues
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
  4. 6 tool updatesv0.1.2
    • First observedab_test
    • First observeddid_it_change
    • First observedforecast_next
    • First observedreal_or_sampling
    • First observedscore_forecasts
    • First observedwhich_metrics_matter

TDQS

A4.4/5.0

Scored across 10 tools

Disambiguation4/5

The change-detection tools (did_it_change, real_or_sampling, market_assessment, spectral_assessment) share a review-queue theme, but descriptions explicitly state when to choose each based on input type and purpose. Other tools (ab_test, forecast_next, score_forecasts, narrative_triage, dyson_reference, which_metrics_matter) are clearly distinct. The need to carefully read the change-assessment family's conditions keeps it from a 5.

Naming Consistency4/5

All tool names use snake_case and are descriptive, which is a consistent convention. However, they mix grammatical forms: noun phrases (market_assessment, spectral_assessment), verb phrases (forecast_next, score_forecasts), and question/idiom phrases (which_metrics_matter, did_it_change). This is a minor deviation from a uniform verb_noun pattern.

Tool Count5/5

The 10 tools cover distinct analytical functions—A/B testing, change detection, sampling-artifact checks, forecasting and backtesting, market/narrative/spectral assessment, evidence ranking, and synthetic reference. Each tool earns its place with no obvious redundancy, fitting well within the 3–15 range.

Completeness4/5

The toolkit covers core signal-vs-noise workflows: change detection, artifact checks, forecasting and backtesting, market/narrative/spectral assessment, A/B testing, and evidence ranking. Minor gaps exist (e.g., no generic continuous two-sample test, no multivariate change detection for non-market series), but agents can work around them with existing tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Eval-integrity statistics for AI benchmark claims — multiple-testing correction, power/MDE for model gaps, judge-bias and leaderboard-rank checks. Catches a benchmark number that won't survive a second look.
    9
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Checks whether a trading backtest survives its own statistics: deflated Sharpe, multiple-testing correction against a best-of-N-noise benchmark, minimum track record length, and fill realism. Takes no market data and no API keys, and cannot recommend a trade — it only reports that a result is weaker than claimed or not yet provable.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Public MCP research for AI finance and trading agents: funding, bank risk and liquidity evidence. Companion SDK: persistent Python MCP sessions and Python/JS source-status streams. Setup: https://beepboop2025.github.io/financial-evidence-skills/distribution/ai-trading-tools.html. No data API key. Keep source dates, rights and gaps. No live quotes or execution.
    2
    3
    1
    MIT