From 761d5268d03a2b26579d6ae4afb29f49f6d0a0a5 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 20 Sep 2026 10:41:13 -0700 Subject: [PATCH] Record feed tabs completion in backlog and briefing By specifier. --- specifier-prompt.md | 53 +++++++++++++++++++++++++++++----------- specs/feature-backlog.md | 30 ++++++++++++++++------- 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/specifier-prompt.md b/specifier-prompt.md index cc51088..9bb2d28 100644 --- a/specifier-prompt.md +++ b/specifier-prompt.md @@ -614,6 +614,24 @@ that a single user-facing feature may require specs in more than one component. reply-exclusion, and `postParents`-not-iterated mutations were killed (language mutation 40/40 on `src/adapters/post-query.js`). +47. **Feed tabs merge the Following feed into the posts page.** `/posts/recent` + now hosts a pure `FeedTabsPage` service + (`psf-memo-client/src/services/feed-tabs-page.js`) that composes + `RecentFeedPage` and `FollowingFeedPage` behind injected `memoDb`/`wallet`; + the React shell reads the controller's `getState()` snapshot, not internal + fields. First load asks `GET /follow/following/:addr` (via + `memoDb.getFollowing`) and selects Following when the viewer follows at + least one account, else Recent; switching tabs resets to page one. The + `/posts/following` route and navbar item are removed. + `FollowingFeedPage.emptyBecauseNoFollows` is retained only because + `specs/following-feed.feature` still specifies it; retiring that older + feature (and the now-redundant field) is a specifier cleanup. Soft Gherkin + mutation of `feed-tabs.feature` was 42 total / 0 killed / 42 survived — every + survivor is a single-character case/character substitution of an example + value used on both the setup and assertion sides (gotcha #12 class); + language mutation on `feed-tabs-page.js` was 22/22 killed. Spec: + `psf-memo-client/specs/feed-tabs.feature`. + --- ## 10. Run / verify the app @@ -664,22 +682,24 @@ At the end of each session, update this file: - Note the current `master` HEAD commit. - State the next feature to work on. -Current `master` HEAD: `de3f1c8bb6` (`following-feed-cap` merged from +Current `master` HEAD: `2d1755a03d` (`feed-tabs` merged from `swarmforge-architect`). The verification record names the architect code -review commit `b7c20560c2`; the only later commit (`de3f1c8`) is docs-only +review commit `e4bda31256`; the only later commit (`2d1755a`) is docs-only (record and summary), so the record is valid for the merged tree. This task -bounds `GET /posts/following/:addr`: the global `postHeights` scan stops after -`offset + limit + 500` eligible followed posts and reports -`total = min(eligible, 500)`, and reply detection uses per-candidate `isReply` -lookups instead of iterating all of `postParents`. The cap counts eligible -followed posts, not raw index entries (followed posts are sparse). DB-only; the -client heading now reads "Showing 1–50 of 500". Spec: -`psf-memo-db/specs/following-feed-performance.feature`; record -`docs/reviews/following-feed-cap-verification.json` (psf-memo-db). The specifier -merged the branch and ran only the merged feature's acceptance test (db 3/3) as -the independent check; soft Gherkin mutation 17/14 (3 intrinsic survivors) and -language mutation 40/40 killed. Architect summary: -`docs/reviews/following-feed-cap-summary.md`. +merges the old `/posts/following` feed into `/posts/recent` as a row of two mode +buttons ("Recent" / "Following"): first load asks +`GET /follow/following/:addr` and picks Following when the viewer follows at +least one account, else Recent; switching tabs resets to page one; the +`/posts/following` route and navbar item are removed. The pure `FeedTabsPage` +service composes `RecentFeedPage` and `FollowingFeedPage` behind injected +`memoDb`/`wallet`, and the React shell reads its `getState()` snapshot. +Client-only; no DB or indexer change. Spec: +`psf-memo-client/specs/feed-tabs.feature`; record +`docs/reviews/feed-tabs-verification.json` (psf-memo-client). The specifier +merged the branch and ran only the merged feature's acceptance test (feed-tabs +12/12) as the independent check; soft Gherkin mutation 42/0 (all intrinsic) and +language mutation 22/22 killed. Architect summary: +`docs/reviews/feed-tabs-summary.md`. Note: `master` also contains two earlier human commits made outside the swarm pipeline — `ea67979` (removed the redundant inline author name from feed posts) @@ -687,6 +707,11 @@ and `8eab46d` (Notifications entry CSS/layout tweaks). Neither is covered by a Gherkin spec yet; they are unspecified working-tree behavior to reconcile if a future feature touches those surfaces. +Also open (specifier cleanup, not blocking): `FollowingFeedPage.emptyBecauseNoFollows` +and `psf-memo-client/specs/following-feed.feature` now describe the retired +`/posts/following` surface; retire them when a future feature touches the +following feed. + Next action: **TBD** — ask the user for the next feature. Current direction is front-end improvements to `psf-memo-client` (UI/UX polish, accessibility, performance, responsiveness, state handling, error surfacing). See diff --git a/specs/feature-backlog.md b/specs/feature-backlog.md index 5c7b828..28aa2a7 100644 --- a/specs/feature-backlog.md +++ b/specs/feature-backlog.md @@ -31,18 +31,30 @@ focus is **front-end improvements** to `psf-memo-client` (the React SPA). ## In progress -- **Feed tabs (2026-09-20):** merge the Following feed into the `/posts/recent` - posts page as a row of two mode buttons ("Recent" / "Following"). On first - load the page selects Following when the viewer's address follows at least one - account (resolved via `GET /follow/following/:addr`) and Recent when it - follows no one; the viewer can switch tabs at any time and switching resets to - the first page. The `/posts/following` route and its navbar item are removed, - so the Following feed is reached only through the Following button. Client-only - read feature (no DB or indexer change). Spec: - `psf-memo-client/specs/feed-tabs.feature`. Task: `feed-tabs`. +- None. ## Recently completed +- **Feed tabs (2026-09-20):** the Following feed is merged into the + `/posts/recent` posts page as a row of two mode buttons ("Recent" / + "Following"). On first load the page asks `GET /follow/following/:addr` and + selects Following when the viewer's address follows at least one account, + Recent when it follows no one; the viewer can switch tabs at any time and + switching resets to the first page. The `/posts/following` route and its + navbar item are removed, so the Following feed is reached only through the + Following button. A new pure `FeedTabsPage` service + (`psf-memo-client/src/services/feed-tabs-page.js`) composes the existing + `RecentFeedPage` and `FollowingFeedPage` controllers behind injected + `memoDb`/`wallet`; the React shell reads the controller `getState()` snapshot. + Client-only read feature. Spec: + `psf-memo-client/specs/feed-tabs.feature`. Merged to `master` at `2d1755a03d` + (fast-forward; review commit `e4bda31256`; record + `docs/reviews/feed-tabs-verification.json`; the later `2d1755a` commit is + docs-only, so the record is valid for the merged tree). Independent acceptance + check after merge: feed-tabs 12/12 scenario examples. Soft Gherkin mutation + 42/0 (all intrinsic example-value case substitutions); language mutation 22/22 + killed; architect summary `docs/reviews/feed-tabs-summary.md`. + - **Following feed cap (2026-09-20):** `GET /posts/following/:addr` no longer full-scans the global `postHeights` index to compute `pagination.total` (the live total reached 10942). The scan now stops after `offset + limit + 500`