fix: display story age from firstSeenAt, not updatedAt
Old stories were reading "1 hr ago" because updatedAt bumps every time the backend attaches another article to a cluster, however loosely related. firstSeenAt is when the cluster actually first appeared and is already in the API response — just wasn't decoded. Verified live: story_1a37c858235b (F1 Austria GP recap) has firstSeenAt 2026-06-16 but updatedAt 2026-07-11, freshnessScore 0.96 — looked brand new despite being 25 days old. Also confirmed the API's isStale field is unusable as a stopgap (always false regardless of age). Ranking still surfaces old stories at the top — that's server-side (signalScore/freshnessScore) and out of scope for the client per the architecture rule against re-ranking. Logged in BACKLOG #15. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -42,8 +42,15 @@ Status: 🔴 open · 🟡 mitigated client-side (real fix still pending) · 🟢
|
||||
Bafana exit" for the *same* `story_id`). **Fix: decay freshness from `firstSeenAt` (or
|
||||
the newest article whose relevance to the cluster core is verified), not from
|
||||
"last touched."** Tightening the TF-IDF threshold in #2 should also reduce how often
|
||||
unrelated articles keep a stale cluster's clock alive. *No client fix possible — the
|
||||
story object's freshness field itself is wrong before it reaches the app.*
|
||||
unrelated articles keep a stale cluster's clock alive. Also confirmed the API's own
|
||||
`isStale` field is unusable as a stopgap — it reads `false` on every story checked
|
||||
regardless of actual age, so it isn't computed from a real staleness threshold.
|
||||
*Client mitigation shipped:* age display (row meta line, hero card) now reads from
|
||||
`firstSeenAt` instead of `updatedAt`, so the UI no longer shows "1 hr ago" on stories
|
||||
that are actually weeks old. *Ranking is still wrong* — old stories still surface at
|
||||
the top of the feed, because `signalScore`/`freshnessScore` (used for ordering) are
|
||||
computed server-side and the client must not re-rank (architecture rule). The
|
||||
real fix is still backend-side.
|
||||
|
||||
## Backend — features
|
||||
|
||||
|
||||
Reference in New Issue
Block a user