diff --git a/specifier-prompt.md b/specifier-prompt.md index ca614df..101e3b0 100644 --- a/specifier-prompt.md +++ b/specifier-prompt.md @@ -167,17 +167,17 @@ Goal: reach feature parity with [memo.cash](https://memo.cash). | Tier | Features | Status | |------|----------|--------| | **P0** | Post, Set name, Reply, Efficient pagination | ✅ shipped | -| **P1** | Like counts (read side) ✅; client display ✅; Set profile text ✅; Set profile picture, Follow/Unfollow | next | +| **P1** | Like counts (read side) ✅; client display ✅; Set profile text ✅; Set profile picture ✅; Follow/Unfollow | next | | **P2** | Topics (list, feed, post, follow/unfollow) | later | | **P3** | Polls (create, add option, vote) | later | | **P4** | Mute / unmute user | later | | **P5** | Send money memo action, MIP-0009 token exchange | later | | **P6** | Repost, ranked feed, notifications, search, tags, following feed | later | -**Suggested next spec:** P1.4 — add a "Set Avatar URL" UI on the Account page that -broadcasts the `0x6d0a` Set profile picture action. The indexer and DB already -read/store profile pictures; the missing piece is the client write path and the -Account page editor. +**Suggested next spec:** P1.5/P1.6 — add Follow/Unfollow buttons on the profile +page that broadcast `0x6d06`/`0x6d07`, plus the DB read side (follow state, +following/followers lists). The indexer already stores follows in `followsDb`; +the missing pieces are the client write path and the DB read side. --- @@ -313,6 +313,11 @@ that a single user-facing feature may require specs in more than one component. client Set Bio UI enforces 217. The indexer's `handleSetProfile` still validates against `MAX_POST_SIZE = 65000`; the looser indexer limit is a separate hardening item (protocol parity would use 217). +14. **set-avatar-url Scenario 1 has a tautological assertion (gotcha #12 again).** + The "account page shows my avatar URL as \"\"" assertion echoes the same + example value that was broadcast, so Gherkin mutation of the URL survives + trivially. Same pattern as set-bio Scenario 1. If tightening, tie the + assertion to independent fixture data rather than the broadcast example. --- @@ -350,9 +355,7 @@ 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: `e321c7f` (set-bio merged to `master`; client unit 48, -property 6, acceptance all-features, lint, and build passing). An unrelated -`swarmforge.conf` specifier-model switch that leaked in with the merge was -reverted to keep the merge focused on set-bio. -Next action: **spec P1.4** — add a "Set Avatar URL" UI on the Account page that -broadcasts the `0x6d0a` Set profile picture action. +Current `master` HEAD: `ba2b3bf` (set-avatar-url merged to `master`; client unit +74, property 11, acceptance all-features, lint, and build passing). +Next action: **spec P1.5/P1.6** — Follow/Unfollow user (client write path + +DB read side). diff --git a/specs/feature-backlog.md b/specs/feature-backlog.md index 5dfd018..ddb6804 100644 --- a/specs/feature-backlog.md +++ b/specs/feature-backlog.md @@ -122,7 +122,7 @@ adding/editing the client UI. | 1.1 | Like / tip a Memo — read side | `0x6d04` | D | ✅ | `likeCount` returned on `/posts/*` and `/posts/:txid/thread` | | 1.2 | Like / tip a Memo — client display | `0x6d04` | C | ✅ | Feed/Profile/Thread read `likeCount` from API instead of defaulting to 0 | | 1.3 | Set profile text (bio) | `0x6d05` | C | ✅ | C: "Set Bio" UI on Account page broadcasts `0x6d05` (217-byte limit) | -| 1.4 | Set profile picture | `0x6d0a` | C, I, D | 🟡 partial | C: add "Set Avatar URL" UI; I/D already read | +| 1.4 | Set profile picture | `0x6d0a` | C, I, D | ✅ | C: "Set Avatar URL" UI broadcasts `0x6d0a` (217-byte limit); I/D already read | | 1.5 | Follow a user | `0x6d06` | C, I, D | 🔴 missing | C: follow button on profile; D: follow state + following/followers lists | | 1.6 | Unfollow a user | `0x6d07` | C, I, D | 🔴 missing | C: unfollow button; D: follow state | @@ -133,8 +133,8 @@ adding/editing the client UI. thread views now read `likeCount` from the API (profile shows a read-only like button). 3. **Set profile text** ✅ DONE. Account page "Set Bio" UI broadcasts `0x6d05` with a 217-byte limit and byte counter (task `set-bio`). -4. **Set profile picture** — URL broadcast + Account page UI. NEXT. -5. **Follow / Unfollow user** — social graph; enables the following feed later. +4. **Set profile picture** ✅ DONE. Account page "Set Avatar URL" UI broadcasts `0x6d0a` with a 217-byte limit and byte counter (task `set-avatar-url`). +5. **Follow / Unfollow user** — social graph; enables the following feed later. NEXT. ### Like / tip details @@ -213,13 +213,14 @@ Polls require a new data model and rendering. The indexer has no handler yet. ## Suggested next spec -**Set profile picture (bio)** (P1.4): -- `psf-memo-client`: add a "Set Avatar URL" UI on the Account page that broadcasts - the `0x6d0a` Set profile picture action via `minimal-slp-wallet.sendOpReturn()`. -- The indexer and DB already read/store profile pictures; the missing piece is - the client write path and the Account page editor. +**Follow / Unfollow user** (P1.5 / P1.6): +- `psf-memo-client`: add a Follow button on the profile page that broadcasts the + `0x6d06` Follow action (and an Unfollow button broadcasting `0x6d07`). +- `psf-memo-db`: expose follow state and following/followers lists. +- The indexer already stores follows in `followsDb`; the missing pieces are the + client write path and the DB read side. -This is the next smallest end-to-end win after the set-bio write path closed. +This is the next smallest end-to-end win after the set-avatar-url write path closed. ---