Fix manual refresh dropping qualified ranks and clarify trade UI.
Deploy / lint (push) Successful in 9s
Deploy / test (push) Successful in 1m20s
Deploy / deploy (push) Successful in 39s

Single-ticker fetch now attaches residual-momentum ranks so setups do not silently fail the activation gate. Exit plan is a timeline, chart labels move left of the price scale, and missing ranks surface explicitly.
This commit is contained in:
2026-07-14 10:10:30 +02:00
parent cd7dc7973c
commit 8db535b889
10 changed files with 468 additions and 94 deletions
+22 -15
View File
@@ -171,21 +171,28 @@ function FocusCard({ setup, name, badge, badgeTone, footNote, onReset }: {
R:R and reach probability are gate inputs computed from a GTL
proposal the trade never exits at — they get quiet treatment. */}
<div className="flex items-start gap-10 text-right">
{setup.momentum_percentile != null && (
<div title="Residual 12-1 month momentum percentile across the universe. This is why the ticker was selected.">
<p className="section-index">residual momentum</p>
<p className="font-display mt-1 text-3xl font-semibold text-gray-100">
top {Math.max(1, Math.round(100 - setup.momentum_percentile))}
<span className="text-lg text-gray-400">%</span>
</p>
<div className="ml-auto mt-2 h-1 w-28 rounded-full bg-blue-500/20">
<span
className="block h-full rounded-full bg-blue-500"
style={{ width: `${Math.min(100, Math.round(setup.momentum_percentile))}%` }}
/>
</div>
</div>
)}
<div title="Residual 12-1 month momentum percentile across the universe. This is why the ticker was selected.">
<p className="section-index">residual momentum</p>
{setup.momentum_percentile != null ? (
<>
<p className="font-display mt-1 text-3xl font-semibold text-gray-100">
top {Math.max(1, Math.round(100 - setup.momentum_percentile))}
<span className="text-lg text-gray-400">%</span>
</p>
<div className="ml-auto mt-2 h-1 w-28 rounded-full bg-blue-500/20">
<span
className="block h-full rounded-full bg-blue-500"
style={{ width: `${Math.min(100, Math.round(setup.momentum_percentile))}%` }}
/>
</div>
</>
) : (
<>
<p className="font-display mt-1 text-2xl font-semibold text-amber-200">missing</p>
<p className="mt-1 text-[11px] text-gray-500">no residual rank · cannot qualify</p>
</>
)}
</div>
<div
className="max-w-[13rem]"
title="Gate metrics. The reward/risk and reach probability of the headline Gate Target Ladder proposal are what admitted this setup. The trade does NOT exit there — it exits on the trailing stop."