* fix(webapp): carry the hot-and-stale warning to the file and folder views (BEA-119)
The Dashboard flagged archive/retired-spec.md as read-a-lot and
unmaintained, then the file's own page served it with raw counts and a
raw date and left the reader to do the staleness arithmetic. The warning
existed on the one screen nobody opens before trusting a doc.
HOT_READS, STALE_DAYS and the danger predicate were module-private to
Insights.tsx, so no other surface could reach the verdict — even though
both inputs (heatMap, Node.time) were already in hand on both of them.
They move to lib/heat.ts, whose own header says every read-count surface
shares one arithmetic, and Insights.tsx imports them instead.
The predicate takes (reads, days) rather than a heat entry: only the
Dashboard has a reader lens, so it keeps passing its lens-filtered count
while the file and folder views pass heatTotal.
- file page: "⚠ stale · last changed 7 months ago", leading the meta line
because #meta is nowrap + ellipsis and a trailing warning is the first
thing a narrow window eats
- folder listing: ⚠ beside the heat dot, files only (a folder's heat is a
subtree sum with no single mtime), with a real aria-label rather than a
hover-only title
- no threshold change: the Dashboard flags the same set, pinned by both a
unit test on the boundaries and an e2e test on all three surfaces
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(architecture): heat.ts now owns the hot-and-stale verdict (BEA-119)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>