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:
+4
-3
@@ -3,12 +3,13 @@ from goodnews.lanes import build_lane_pool, known_lane_keys, DEFAULT_LANES
|
||||
|
||||
def test_pool_shape_and_pinned():
|
||||
pool = build_lane_pool({"science": 100}, {"space": 200, "food": 0, "innovation": 99})
|
||||
assert pool["pinned"]["key"] == "today"
|
||||
pinned_keys = [p["key"] for p in pool["pinned"]]
|
||||
assert pinned_keys == ["today", "latest"] # Highlights + Latest, always first
|
||||
assert pool["default"] == DEFAULT_LANES
|
||||
names = [g["name"] for g in pool["groups"]]
|
||||
assert names == ["Moods", "Topics", "Discovery"]
|
||||
# 'today' is pinned, never part of the selectable pool.
|
||||
assert "today" not in known_lane_keys(pool)
|
||||
# pinned lanes are never part of the selectable pool.
|
||||
assert "today" not in known_lane_keys(pool) and "latest" not in known_lane_keys(pool)
|
||||
|
||||
|
||||
def test_topics_are_bare_keys_tags_are_prefixed():
|
||||
|
||||
Reference in New Issue
Block a user