Unify the Panoptiblog row parser, page link, formatters and stale/movement rules behind one panoptiblogStanding() value. The dataset now supplies totals.rankedPublications, previousGeneratedAt, and an optional previousRank; the shared model carries rank, field size, movement, snapshot date and stale state.
No UI changes in this slice. The Page card and Trending render exactly as before, but from one parser and one set of helpers. Tests cover standing rank/field/movement/stale cases and the stricter malformed-row rules.
🤖 Generated with Claude Code