- The backtest replays the current config at the selected cadence — at each point the setup is
- rebuilt using only data up to that day (no lookahead) and the following ~30 trading days decide
- its outcome — then simulates one capital-constrained book against the S&P 500. Sentiment and
- fundamentals are held neutral (no point-in-time history). ~6 months is roughly one market regime,
- so read it as directional.
-
-
- Live GTL is the exact target path the scanner and the
- scheduled backtest use; Structural S/R is a comparison
- arm sourcing targets from chart structure. Weekly steps
- five sessions at a time and is what the server runs; Daily
- {' '}is roughly 5× the replay work.
-
-
+ {/* Run status and the controls that start a new run, on one line. The
+ explainer sits BELOW this row rather than beside it — sharing a flex
+ row meant expanding it shoved every control down the page. */}
+
{/* flex-wrap is load-bearing: two dropdowns plus the button overflow a
narrow viewport otherwise. */}
@@ -112,11 +119,30 @@ export function BacktestPanel() {
/>
+
+
+
+ The backtest replays the current config at the selected cadence — at each point the setup is
+ rebuilt using only data up to that day (no lookahead) and the following ~30 trading days decide
+ its outcome — then simulates one capital-constrained book against the S&P 500. Sentiment and
+ fundamentals are held neutral (no point-in-time history). ~6 months is roughly one market regime,
+ so read it as directional.
+
+
+ Live GTL is the exact target path the scanner and the
+ scheduled backtest use; Structural S/R is a comparison
+ arm sourcing targets from chart structure. Weekly steps
+ five sessions at a time and is what the server runs; Daily
+ {' '}is roughly 5× the replay work.
+
+
+
+
{/* Only surfaced for non-default choices — zero noise on the common path,
but a non-production selection still announces itself, which is what
the old always-amber cards were really for. */}
@@ -142,19 +168,6 @@ export function BacktestPanel() {
{report && (
<>
-
)}
+ {/* The config description, demoted: it says what the strategy IS, which
+ is context for the findings above rather than a finding itself. */}
+ {recommendation.headline && (
+
+
Configuration under test
+
{recommendation.headline}
+
+ )}
+
{recommendation.note && (
{recommendation.note}
)}
@@ -77,12 +117,10 @@ export function BacktestRecommendationCard({
{/* Outside the card body on purpose: Disclosure renders its own glass-sm
panel, so nesting it inside the bordered card double-frames it. */}
{secondary.length > 0 && (
-
-
+
+
{secondary.map((item) => (
-
- {item.text}
-
+
))}
diff --git a/frontend/src/components/signals/PortfolioMonitorPanel.tsx b/frontend/src/components/signals/PortfolioMonitorPanel.tsx
index 29d296e..091ba3b 100644
--- a/frontend/src/components/signals/PortfolioMonitorPanel.tsx
+++ b/frontend/src/components/signals/PortfolioMonitorPanel.tsx
@@ -70,7 +70,10 @@ export function PortfolioMonitorPanel({
onChange={onStrategyChange}
options={monitor.strategies.map((s) => ({
value: s.strategy,
- label: `${s.is_production ? 'Production: ' : ''}${s.label}`,
+ // "Production: " prefix dropped — a bullet costs one character
+ // instead of twelve, and the full config is spelled out under
+ // the chart anyway.
+ label: `${s.is_production ? '● ' : ''}${s.label}`,
}))}
/>
@@ -97,7 +100,12 @@ export function PortfolioMonitorPanel({
/>
-
+
@@ -109,39 +117,49 @@ export function PortfolioMonitorPanel({
) : (
-
Risk-adjusted quality
+
+
Risk-adjusted quality
+
+ Bands are set stricter than textbook ranges — this universe is today's
+ survivors replayed backward, which flatters every ratio.
+
+
+
-
)}
diff --git a/frontend/src/components/ui/Dropdown.tsx b/frontend/src/components/ui/Dropdown.tsx
index 3a5f742..4d02ccf 100644
--- a/frontend/src/components/ui/Dropdown.tsx
+++ b/frontend/src/components/ui/Dropdown.tsx
@@ -86,7 +86,12 @@ export function Dropdown({
onClick={() => setOpen((v) => !v)}
className="input-glass flex w-full items-center justify-between gap-2 px-3 py-1.5 text-left text-sm"
>
-
+ {/* truncate, not wrap: a long option name used to push the trigger to
+ three lines and shove the whole control row out of alignment. */}
+
{selected ? selected.label : placeholder}