+ {failed ? 'This run is not usable' : 'This run is incomplete'} +
++ {quality.evaluated} of {quality.expected} tickers evaluated + {quality.loaded !== quality.evaluated && <> · {quality.loaded} loaded>} + {quality.short_history > 0 && ( + <> · {quality.short_history} too short to trade> + )} + {' · '} + {benchmark.momentum_basis === 'residual' ? ( + <> + {benchmark.symbol} {benchmark.sessions} sessions + {benchmark.first && benchmark.last && ( + <> ({benchmark.first} → {benchmark.last})> + )} + > + ) : ( + <>no {benchmark.symbol} benchmark — momentum ran raw, not residual> + )} +
+ {failed && ( ++ Performance figures are hidden for this run. Re-run the backtest once the + underlying data is readable. +
+ )} + {/* Says what the check covers, so a clean run isn't read as a price audit. */} ++ Processing and coverage checks only — this does not verify that the underlying + prices are correct. +
+ {quality.failures.length > 0 && ( ++ Showing the first {quality.failures.length} of {quality.failed} — the + rest are in the run log. +
+ )} +Last run
{report ? (
- {timeAgo(report.generated_at)} · {report.tickers} tickers ·{' '}
- {report.candidates} setups ({report.qualified} qualified) ·{' '}
+ {timeAgo(report.generated_at)} ·{' '}
+ {/* Evaluated over expected, not the universe size: "506 tickers"
+ on a run that evaluated none was the misleading part. */}
+
+ {quality
+ ? `${quality.evaluated}/${quality.expected} tickers`
+ : `${report.tickers} tickers`}
+ {' '}
+ · {report.candidates} setups ({report.qualified} qualified) ·{' '}
{report.params.entry_cadence ?? 'weekly'},{' '}
{report.params.horizon_days}d horizon
{report.params.cost_per_side_pct != null && (
@@ -177,7 +187,20 @@ export function BacktestPanel() {
)}
- {report && (
+ {/* Completeness gates the headline. `failed` replaces the tiles rather
+ than warning above them — a banner over ordinary-looking numbers is
+ exactly how a zero-candidate run reads as a quiet week. */}
+ {report && quality && quality.status !== 'ok' && (
+
+ Completeness was not recorded for this run — it predates the check. +
+ )} + + {report && !runIsUnusable && ( <>