changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "properties": {
+ "checked_at": {
+ "description": "When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.",
+ "format": "date-time",
+ "type": "string"
+ },
+ "coin": {
+ "description": "Coin the evidence is scoped to; null means too few coin-level samples, so the numbers are strategy-wide.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "disclaimer": {
+ "description": "Our product boundary, verbatim in every paid advice response: market intelligence only, no execution, no custody, no position sizing, and opportunity_score is a heuristic rather than a calibrated win probability.",
+ "type": "string"
+ },
+ "measured_since": {
+ "description": "Unix seconds — start of the measurement window.",
+ "type": "integer"
+ },
+ "metrics": {
+ "additionalProperties": {
+ "type": [
+ "number",
+ "string",
+ "null"
+ ]
+ },
+ "description": "Measured over completed outcomes only (WIN + LOSS + TIME). Anything the source cannot compute is null — never fabricated.",
+ "properties": {
+ "avg_net_return_maker_pct": {
+ "description": "Mean net return assuming passive maker fills; optimistic, because a maker fill is never guaranteed.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "avg_net_return_pct": {
+ "description": "Mean net return per completed outcome in percent, after taker costs. Can be negative.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "completed_sample_count": {
+ "description": "Sample size behind every metric below; small samples mean wide Wilson bounds — read them.",
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "distinct_coins": {
+ "description": "Distinct coins contributing completed outcomes; low values mean the sample is concentrated in one market.",
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "distinct_days": {
+ "description": "Distinct calendar days contributing completed outcomes; low values mean the sample is clustered in time.",
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "median_net_return_pct": {
+ "description": "Median net return per completed outcome in percent; less outlier-sensitive than the mean.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "total_net_return_pct": {
+ "description": "Sum of net returns over all completed outcomes in percent — not a compounded account return.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "wilson_high_pct": {
+ "description": "Upper bound of the 95% Wilson score interval around win_rate_pct.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "wilson_low_pct": {
+ "description": "Lower bound of the 95% Wilson score interval around win_rate_pct; the conservative read.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "win_definition": {
+ "description": "How a win is counted; currently always 'net_return_gt_0' — net return after costs above zero, so a profitable TIME exit counts as a win even though it is not in populations.wins.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "win_rate_pct": {
+ "description": "Percentage of COMPLETED outcomes that were profitable; denominator is completed (WIN+LOSS+TIME), never detected or published.",
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "ml_models": {
+ "description": "Machine-learning models used by this strategy and how far their own validation has come.",
+ "items": {
+ "properties": {
+ "evidence_status": {
+ "description": "How far out-of-sample validation has come. UNVALIDATED = no measured outcomes yet, EARLY_EVIDENCE = too few to lean on, VALIDATED = enough measured evidence, REJECTED = measured and found not to work.",
+ "enum": [
+ "UNVALIDATED",
+ "EARLY_EVIDENCE",
+ "VALIDATED",
+ "REJECTED"
+ ],
+ "type": "string"
+ },
+ "model_version": {
+ "description": "Identifier of the model, e.g. 'gbdt-intraday-v1-1h'.",
+ "type": "string"
+ },
+ "sample_count": {
+ "description": "Measured outcomes behind this evidence_status; 0 means nothing has been validated yet.",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "note": {
+ "description": "Verbatim upstream note on how populations and metrics relate; states that win rate and returns use completed outcomes only.",
+ "type": "string"
+ },
+ "populations": {
+ "additionalProperties": {
+ "type": "integer"
+ },
+ "description": "Disjoint counts over the window, reported apart from the metrics so selection effects stay visible. blocked and expired_without_entry are EXCLUDED from every metric denominator.",
+ "properties": {
+ "blocked": {
+ "description": "Candidates blocked internally upstream (never traded); excluded from all metric denominators.",
+ "type": "integer"
+ },
+ "completed": {
+ "description": "Entered positions with a finished outcome (WIN, LOSS or TIME); the denominator of win_rate_pct and the return metrics.",
+ "type": "integer"
+ },
+ "detected": {
+ "description": "Candidates the strategy detected, before internal filtering.",
+ "type": "integer"
+ },
+ "expired_without_entry": {
+ "description": "Published candidates whose entry window closed without a fill; excluded from all metric denominators.",
+ "type": "integer"
+ },
+ "losses": {
+ "description": "Exit-status count of positions that exited on their stop.",
+ "type": "integer"
+ },
+ "pending": {
+ "description": "Entered positions still open; no outcome yet, so counted nowhere in metrics.",
+ "type": "integer"
+ },
+ "published": {
+ "description": "Candidates published externally as advice.",
+ "type": "integer"
+ },
+ "time_exits": {
+ "description": "Exit-status count of positions closed because the holding horizon ran out; a profitable one still counts as a win in win_rate_pct.",
+ "type": "integer"
+ },
+ "wins": {
+ "description": "Exit-status count of positions that exited on their target — a count of exit REASON, not of profitability (see metrics.win_definition).",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "query": {
+ "description": "The validated input echoed back, i.e. the signal_id you asked for.",
+ "properties": {
+ "signal_id": {
+ "description": "Stable id of the opportunity across versions; the input for every other call in the chain.",
+ "pattern": "^sig_[0-9a-f]{12}$",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "recommended_next_call": {
+ "description": "Machine-readable next step in the chain (scan → signal → validate → evidence → check), so you can follow the workflow without documentation. null means there is explicitly nothing useful to call now; next_check_after then says when to come back.",
+ "properties": {
+ "arguments": {
+ "description": "Arguments to pass verbatim, e.g. {\"signal_id\":\"sig_a1b2c3d4e5f6\"}, plus known_version for check_crypto_signal.",
+ "type": "object"
+ },
+ "reason": {
+ "description": "Why this is the useful next step, in plain language.",
+ "type": "string"
+ },
+ "tool": {
+ "description": "Name of the MCP tool to call next.",
+ "enum": [
+ "get_crypto_signal",
+ "validate_crypto_signal",
+ "get_crypto_evidence",
+ "check_crypto_signal"
+ ],
+ "type": "string"
+ }
+ },
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "source_as_of": {
+ "description": "Unix seconds — freshness of the upstream advice system's answer.",
+ "type": "integer"
+ },
+ "source_disclaimer": {
+ "description": "Verbatim disclaimer of the upstream advice system, passed through unedited.",
+ "type": "string"
+ },
+ "strategy": {
+ "description": "Strategy version the evidence is scoped to, e.g. 'momentum-breakout-v1'.",
+ "type": "string"
+ },
+ "strategy_evidence_status": {
+ "description": "How far out-of-sample validation has come. UNVALIDATED = no measured outcomes yet, EARLY_EVIDENCE = too few to lean on, VALIDATED = enough measured evidence, REJECTED = measured and found not to work.",
+ "enum": [
+ "UNVALIDATED",
+ "EARLY_EVIDENCE",
+ "VALIDATED",
+ "REJECTED"
+ ],
+ "type": "string"
+ },
+ "window_days": {
+ "description": "Length of the measurement window in days.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "query",
+ "checked_at",
+ "source_as_of",
+ "strategy",
+ "coin",
+ "ml_models",
+ "recommended_next_call",
+ "disclaimer"
+ ],
+ "type": "object"
+}