Add a permanent "Latest" lane beside "Highlights"
Restructure the nav around two permanent lanes, then the reader's chosen ones: "Highlights" (the curated daily brief — formerly "Today") and "Latest" (the freshest accepted stories, newest-first). Now that the gate is tight, a chronological "incoming" feed is safe to expose. * feed(): new sort="latest" (pure recency) alongside the default best-first rank; /api/feed exposes sort=ranked|latest (validated). Still accepted-only and boundary-respecting either way. * lanes.py: two pinned lanes (Highlights + Latest) instead of one. * Home: "Latest" view + "Load more" pagination for every feed view (offset- paged, de-duped). Mobile bottom bar gains a Latest tab. * LanePicker shows both pinned lanes; nav rail renders them first. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+12
-2
@@ -57,8 +57,13 @@ def feed(
|
||||
max_cortisol: int | None = None,
|
||||
max_ragebait: int | None = None,
|
||||
tag: str | None = None,
|
||||
sort: str = "ranked",
|
||||
) -> list[dict]:
|
||||
"""Return ranked articles with categorical filters applied in SQL.
|
||||
"""Return articles with categorical filters applied in SQL.
|
||||
|
||||
sort="ranked" (default) is best-first by the composite rank; sort="latest"
|
||||
is pure recency (newest first) for the chronological "Latest" feed. Both
|
||||
stay accepted-only and respect the same boundaries.
|
||||
|
||||
Categorical filters (topic/flavor include & mute, cortisol/ragebait ceilings)
|
||||
must be applied here, not after ranking — otherwise low-ranked-but-matching
|
||||
@@ -105,6 +110,11 @@ def feed(
|
||||
where = "WHERE " + " AND ".join(clauses)
|
||||
params.extend([limit, offset])
|
||||
|
||||
order_by = (
|
||||
"COALESCE(a.published_at, a.discovered_at) DESC, rank_score DESC"
|
||||
if sort == "latest"
|
||||
else "rank_score DESC, COALESCE(a.published_at, a.discovered_at) DESC"
|
||||
)
|
||||
rows = conn.execute(
|
||||
f"""
|
||||
SELECT {_ARTICLE_COLUMNS}
|
||||
@@ -112,7 +122,7 @@ def feed(
|
||||
JOIN sources src ON src.id = a.source_id
|
||||
JOIN article_scores s ON s.article_id = a.id
|
||||
{where}
|
||||
ORDER BY rank_score DESC, COALESCE(a.published_at, a.discovered_at) DESC
|
||||
ORDER BY {order_by}
|
||||
LIMIT ? OFFSET ?
|
||||
""",
|
||||
params,
|
||||
|
||||
Reference in New Issue
Block a user