···40404141- Moderation service integration
4242- Labels added to users in posts
4343+4444+#### 2026-03-22
4545+4646+- Starter packs & lists
+13
docs/specs/phase-5.md
···11+---
22+title: Phase 5 Spec
33+updated: 2026-03-23
44+---
55+66+## Feature Parity
77+88+- Endpoints to build UI around:
99+ - In search screen: `/xrpc/app.bsky.graph.searchStarterPacks`
1010+ - In profile screen: `/xrpc/app.bsky.graph.getSuggestedFollowsByActor`, should be a
1111+ sheet accessible via overflow menu
1212+ - In settings screen: `/xrpc/app.bsky.video.getUploadLimits` to show remaining daily
1313+ video upload limits
+6-59
docs/tasks/phase-4.md
···1111## M14 — Account Switching
12121313- [x] `AccountSwitcherCubit` exposing account list and active DID
1414-- [ ] Account switcher bottom sheet UI — list accounts with avatars and handles
1414+- [x] Account switcher bottom sheet UI — list accounts with avatars and handles
1515- [x] Store `active_account_did` in Drift `settings` table
1616- [x] Drift migration: add `account_did` column to `cached_posts` if not present
1717-- [ ] All user-scoped queries filter by active account DID
1818-- [ ] Broadcast `AccountSwitched` event to all Blocs on switch
1919-- [ ] "Add Account" button triggers OAuth flow, inserts new `accounts` row
2020-- [ ] Silent token refresh on account switch; navigate to login on failure
1717+- [x] All user-scoped queries filter by active account DID
1818+- [x] Broadcast `AccountSwitched` event to all Blocs on switch
1919+- [x] "Add Account" button triggers OAuth flow, inserts new `accounts` row
2020+- [x] Silent token refresh on account switch; navigate to login on failure
21212222## M15 — Offline Reading & Network Resilience
2323···40404141Completed [2026-03-21](../../CHANGELOG.md#2026-03-21)
42424343-### Core
4444-4545-- [x] `ListBloc` — events: `ListRequested`, `ListRefreshed`, `ListItemAdded`, `ListItemRemoved`, `ListMuted`, `ListUnmuted`, `ListBlocked`, `ListUnblocked`
4646-- [x] `MyListsCubit` — load user's lists via `getLists`
4747-- [x] `ListFeedBloc` — paginated feed via `getListFeed`, reuse existing feed pattern
4848-4949-### List CRUD
5050-5151-- [x] Create list — name, description, avatar, purpose selector (curation/moderation) via `com.atproto.repo.createRecord`
5252-- [x] Edit list — update name, description, avatar via `com.atproto.repo.putRecord`
5353-- [x] Delete list via `com.atproto.repo.deleteRecord`
5454-- [x] Add members — search via `searchActorsTypeahead`, create `listitem` records
5555-- [x] Remove members — delete `listitem` records
5656-5757-### Moderation Actions
5858-5959-- [x] Mute list via `muteActorList` / unmute via `unmuteActorList`
6060-- [x] Block via list — create `listblock` record; unblock — delete `listblock` record
6161-6262-### Screens
6363-6464-- [x] My Lists screen — curation and moderation tabs, FAB to create new list
6565-- [x] List detail screen — header (name, avatar, description, creator, member count), Feed tab (curation lists), Members tab
6666-- [x] Add/remove members screen — search field + current members with remove buttons
6767-- [x] Create/edit list dialog — name, description, avatar picker, purpose selector
6868-6969-### Profile Integration
7070-7171-- [x] "Lists" tab on profile screens via `getLists`
7272-- [x] "Add to list" option in profile overflow menu using `getListsWithMembership`
7373-7443## M19 — Starter Packs
75447676-### Core
7777-7878-- [x] `StarterPackBloc` — events: `StarterPackRequested`, `StarterPackCreated`, `StarterPackUpdated`, `StarterPackDeleted`, `MemberAdded`, `MemberRemoved`
7979-- [x] `ActorStarterPacksCubit` — load starter packs for an actor via `getActorStarterPacks`
8080-8181-### Viewing
8282-8383-- [x] Starter pack detail screen — name, description, creator, join stats, member sample (up to 12), recommended feeds (up to 3)
8484-- [x] "See all members" — navigate to full member list via backing reference list
8585-- [x] "Follow all" button — follow every member in the pack
8686-- [x] Actor starter packs screen — paginated list via `getActorStarterPacks`
8787-8888-### Creation & Editing
8989-9090-- [x] Create starter pack — name (max 50 graphemes), description, member search, feed picker (up to 3)
9191-- [x] Creation flow: create reference list → add `listitem` records → create starter pack record
9292-- [x] Edit starter pack — update name/description/feeds via `putRecord`, add/remove members via `listitem` CRUD
9393-- [x] Delete starter pack and its backing reference list
9494-9595-### Profile Integration
9696-9797-- [x] "Starter Packs" section on profile screens showing packs created by actor
9898-- [x] Starter pack cards — name, creator, member count, join stats
4545+Completed [2026-03-22](../../CHANGELOG.md#2026-03-22)
···313313 ),
314314 ).thenAnswer((_) async {});
315315316316- // Use router so context.canPop() works when state transitions to deleted.
317316 await tester.pumpWidget(buildSubjectWithRouter(currentUserDid: 'did:plc:creator'));
318317 await tester.pumpAndSettle();
319318