| analysis.evidence_count | integer | Number of historical analogs found for this symbol at this lookback. A first-class signal for how much weight to give the output. |
| analysis.match_quality | object | Median shape similarity score, median overall score (1–5), and a quality_tag. Tells you how structurally close the analogs are — not just that matches exist, but how good they are. |
| forward_outcome.{N}.returns | object | For each forward window (3, 5, 10, 15d): positive_return_rate, median_return, average_return, worst_return, best_return, percentiles (P05–P95). |
| forward_outcome.{N}.returns.max_adverse_excursion | float | Worst intraday drawdown observed across all historical analog cases for this forward window. More meaningful than endpoint-only worst return for position sizing. |
| forward_outcome.{N}.returns.max_favourable_excursion | float | Best intraday gain observed across all historical analog cases. Useful for target calibration. |
| forward_outcome.{N}.returns.percentiles | object | P05, P25, P50, P75, P95 return distribution across all analog outcomes. The full distribution, not just endpoints. |
| forward_outcome.{N}.tags | object | Categorical signals: direction, consistency, reliability, risk, outlier. Machine-readable — use them to filter or sort programmatically. e.g. direction: "bullish_moderate" · risk: "high_tail" · reliability: "moderate" |
| analysis.seasonality | object | Same-month vs. other-months return split across all forward windows. Useful for isolating whether the historical skew is seasonally concentrated. |
| benchmark.context.{N} | object | The current symbol's feature vector at each lookback window: volatility, normalized_slope, close_position_range, log_volume_zscore, max_drawdown. The exact inputs the engine matched against. |