fix(ui): don't show misleading 0% AI bar on off-topic Trump posts
Most Trump posts aren't crypto-related, so the entry filter / AI marks them relevant=false with ai_confidence=0 and no reasoning (never AI-scored). The post card still rendered 'AI confidence 0%' with an empty progress bar, which reads as 'AI looked and was 0% confident' rather than the truth: 'skipped as not crypto-relevant'. Added an aiScored guard (ai_confidence > 0 || ai_reasoning present): - collapsed row: shows AI '—' instead of '0%' for unscored posts - expanded detail: shows 'Not crypto-relevant — skipped AI scoring' instead of an empty 0% confidence bar Scored posts (the ~80 with confidence>0 in test data, and all real signals once live) are unchanged — full bar + reasoning shown. tsc + build clean. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -102,6 +102,15 @@ const PostRow = memo(function PostRow({ post, selected, onClick }: PostRowProps)
|
|||||||
onClick?.()
|
onClick?.()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Did this post actually get an AI score, or was it filtered as off-topic
|
||||||
|
// noise before any AI call? Trump posts mostly aren't crypto-related, so the
|
||||||
|
// entry filter / AI marks them relevant=false with confidence 0 and no
|
||||||
|
// reasoning. Showing "AI confidence 0%" + an empty bar for those is
|
||||||
|
// misleading — it reads as "AI looked and had zero confidence" when really
|
||||||
|
// "this was skipped as not crypto-relevant". Treat a post as AI-scored only
|
||||||
|
// when it has a real confidence or reasoning.
|
||||||
|
const aiScored = post.ai_confidence > 0 || !!post.ai_reasoning
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={`post-row ${selected ? 'selected' : ''}`}
|
className={`post-row ${selected ? 'selected' : ''}`}
|
||||||
@@ -157,7 +166,9 @@ const PostRow = memo(function PostRow({ post, selected, onClick }: PostRowProps)
|
|||||||
</div>
|
</div>
|
||||||
<div className="row gap-s" style={{ fontSize: 11, color: 'var(--ink-3)' }}>
|
<div className="row gap-s" style={{ fontSize: 11, color: 'var(--ink-3)' }}>
|
||||||
<span>AI</span>
|
<span>AI</span>
|
||||||
<span className="mono" style={{ color: 'var(--ink-2)', fontWeight: 500 }}>{post.ai_confidence}%</span>
|
<span className="mono" style={{ color: 'var(--ink-2)', fontWeight: 500 }}>
|
||||||
|
{aiScored ? `${post.ai_confidence}%` : '—'}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -168,7 +179,10 @@ const PostRow = memo(function PostRow({ post, selected, onClick }: PostRowProps)
|
|||||||
className="post-row-detail"
|
className="post-row-detail"
|
||||||
onClick={e => e.stopPropagation()}
|
onClick={e => e.stopPropagation()}
|
||||||
>
|
>
|
||||||
{/* AI confidence bar */}
|
{/* AI confidence bar — only when the post was actually AI-scored.
|
||||||
|
Off-topic/noise posts (relevant=false, conf 0, no reasoning) show
|
||||||
|
a neutral note instead of a misleading empty 0% bar. */}
|
||||||
|
{aiScored ? (
|
||||||
<div>
|
<div>
|
||||||
<div className="ai-metric-head">
|
<div className="ai-metric-head">
|
||||||
<span>AI confidence</span>
|
<span>AI confidence</span>
|
||||||
@@ -178,6 +192,11 @@ const PostRow = memo(function PostRow({ post, selected, onClick }: PostRowProps)
|
|||||||
<div style={{ width: post.ai_confidence + '%' }} />
|
<div style={{ width: post.ai_confidence + '%' }} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
) : (
|
||||||
|
<div style={{ fontSize: 12, color: 'var(--ink-3)', padding: '4px 0' }}>
|
||||||
|
Not crypto-relevant — skipped AI scoring.
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Trade routing — target asset + expected move */}
|
{/* Trade routing — target asset + expected move */}
|
||||||
{post.target_asset && (post.signal === 'buy' || post.signal === 'short') && (
|
{post.target_asset && (post.signal === 'buy' || post.signal === 'short') && (
|
||||||
|
|||||||
Reference in New Issue
Block a user