diff --git a/.planning/M016-ux-brand-reading-experience.md b/.planning/M016-ux-brand-reading-experience.md
index 5402224..887b2ae 100644
--- a/.planning/M016-ux-brand-reading-experience.md
+++ b/.planning/M016-ux-brand-reading-experience.md
@@ -42,8 +42,9 @@ Four issues identified with root causes already diagnosed:
| 2 | Mobile job cards show vertical text ("C h e e") | `.pipeline-video__creator` missing overflow rules (App.css:4477) | Add `overflow: hidden; text-overflow: ellipsis; white-space: nowrap` (matches `.pipeline-video__filename` pattern) |
| 3 | No stage direction chevrons | Pipeline stages listed without visual flow indicator | Add CSS chevron/arrow between stage indicators using `::after` pseudo-elements or inline SVG |
| 4 | Filter text box should be replaced with button group | Current text input for status filter; should be "ALL \| Not Started \| In Progress \| Complete" buttons, end-aligned | Replace `` with `
` flexbox, `justify-content: flex-end`, verify vertical alignment against adjacent elements |
+| 5 | Creators dropdown never populates (422 error) | Frontend requests `fetchCreators({ limit: 200 })` but backend validates `le=100` (line 1126) | Change to `limit: 100` |
-**Verification:** Test collapse toggle on most-recent run, resize to 375px and check creator name truncation, confirm chevrons render between stages, confirm filter buttons align right and sit level with row.
+**Verification:** Test collapse toggle on most-recent run, resize to 375px and check creator name truncation, confirm chevrons render between stages, confirm filter buttons align right and sit level with row, confirm creator filter dropdown populates.
---
@@ -135,8 +136,8 @@ Recommended execution order: **S01 → S02 → S03 → S04 → S05 → S06**
## Out of Scope (for this milestone)
-- Creator landing page redesign (depends on backend social links API — see M017)
-- Auto-avatar images (backend-gated — see M017)
-- Embed tab (needs backend investigation first — see M017)
+- Creator landing page redesign (depends on backend social links API — see backend session workplan)
+- Auto-avatar images (backend-gated — see backend session workplan)
+- Embed tab (needs backend investigation first — see backend session workplan)
- Any backend Python changes
- M015 S04/S05 leftovers (trending searches block, admin dropdown hover) — should be completed by M015's own GSD session first
diff --git a/.planning/M017-backend-perf-creator-features.md b/.planning/backend-perf-creator-features.md
similarity index 80%
rename from .planning/M017-backend-perf-creator-features.md
rename to .planning/backend-perf-creator-features.md
index 3089d44..feb71bf 100644
--- a/.planning/M017-backend-perf-creator-features.md
+++ b/.planning/backend-perf-creator-features.md
@@ -1,14 +1,14 @@
-# M017: Backend Performance & Creator Features
+# Backend Performance & Creator Features — Session Workplan
-> **Stream:** Backend — intended for a separate Claude Code session (not GSD)
-> **Conflict zone:** `backend/` only + one frontend API client fix
+> **Stream:** Backend — run in a separate Claude Code session while GSD executes M016
+> **Conflict zone:** `backend/` only — zero frontend changes
> **Deploy cadence:** commit-build-redeploy after each task group
---
## Goal
-Fix critical performance bottlenecks in the admin pipeline API, implement auto-avatar fetching for creators, and lay the backend groundwork for creator landing page improvements. Almost entirely backend Python — minimal frontend changes.
+Fix critical performance bottlenecks in the admin pipeline API, implement auto-avatar fetching for creators, and lay the backend groundwork for creator landing page improvements. Purely backend Python — no frontend changes (the creators 422 fix moved to M016 S02).
---
@@ -31,11 +31,8 @@ stats = await asyncio.to_thread(inspector.stats) or {}
Also consider: reduce inspect timeout to 0.5s, add Redis cache with 10-15s TTL to avoid repeated slow calls.
**Impact:** Page load drops from ~3s to ~50ms.
-#### 1b. Fix creators endpoint 422 error
-**File (frontend):** `frontend/src/pages/AdminPipeline.tsx` line 1126
-**File (backend):** `backend/routers/creators.py` line 28
-**Problem:** Frontend requests `fetchCreators({ limit: 200 })` but backend validates `le=100`. Returns 422 on every pipeline page load — creator filter dropdown never populates.
-**Fix:** Change frontend call to `limit: 100`. (This is the ONE frontend file touch in this stream.)
+#### ~~1b. Fix creators endpoint 422 error~~ → Moved to M016 S02
+The frontend `fetchCreators({ limit: 200 })` fix (AdminPipeline.tsx line 1126) is now part of M016's pipeline UI fixes slice, since that slice already owns AdminPipeline.tsx.
---
@@ -141,24 +138,23 @@ As each endpoint is touched, also consider:
| File | What changes |
|------|-------------|
-| `backend/routers/pipeline.py` | worker-status async fix, stale-pages rewrite, videos pagination, avatar endpoints |
-| `backend/routers/creators.py` | Creator detail expansion, social links |
+| `backend/routers/pipeline.py` | worker-status async fix, stale-pages rewrite, videos pagination, avatar admin endpoints |
+| `backend/routers/creators.py` | Creator detail expansion, social links, admin editing |
| `backend/routers/techniques.py` | Related techniques optimization |
| `backend/models.py` | Creator model additions (avatar, social_links, bio) |
| `backend/schemas.py` | New response schemas |
| `backend/services/avatar.py` | New — TheAudioDB integration |
| `backend/tasks.py` | New avatar fetch task |
| `alembic/versions/014_*.py` | Migration for creator columns |
-| `frontend/src/pages/AdminPipeline.tsx` | Line 1126 only — fix limit: 200 → 100 |
---
## Merge Coordination with M016
-These two streams are designed to have minimal file overlap:
-- **M016 touches:** `App.css`, `Home.tsx`, `TechniquePage.tsx`, `TableOfContents.tsx`, `AdminPipeline.tsx` (CSS/JSX only), new frontend components, static assets
-- **M017 touches:** `backend/` (routers, models, schemas, services, tasks), `alembic/`, one line in `AdminPipeline.tsx`
+These two streams have **zero file overlap:**
+- **M016 touches:** `frontend/src/` only — `App.css`, `Home.tsx`, `TechniquePage.tsx`, `TableOfContents.tsx`, `AdminPipeline.tsx`, new frontend components, static assets
+- **This session touches:** `backend/` only — routers, models, schemas, services, tasks, `alembic/`
-The single conflict point is `AdminPipeline.tsx` — M017's creators limit fix (line 1126) vs M016's pipeline UI fixes (collapse bug at line 729, filter buttons, chevrons). Resolve by merging M017's one-liner first, then M016's broader changes on top.
+No merge conflicts expected. The creators 422 fix (the former single overlap point) now lives in M016 S02.
-For the avatar/social-links frontend wiring: M017 ships the API, M016 (or a follow-up) consumes it. No conflict — just sequencing.
+For avatar/social-links frontend wiring: this session ships the API, M016 (or a follow-up) consumes it. No conflict — just sequencing.
diff --git a/frontend/src/App.css b/frontend/src/App.css
index c69ad74..1fae60c 100644
--- a/frontend/src/App.css
+++ b/frontend/src/App.css
@@ -1619,6 +1619,7 @@ a.app-footer__repo:hover {
align-items: center;
gap: 0.5rem;
flex-wrap: wrap;
+ flex: 1;
}
.recent-card__summary {
diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx
index cdf247a..0ef31c7 100644
--- a/frontend/src/pages/Home.tsx
+++ b/frontend/src/pages/Home.tsx
@@ -330,11 +330,6 @@ export default function Home() {
{t.creator_name || ''}
- {t.key_moment_count > 0 && (
-
- {t.key_moment_count} moment{t.key_moment_count !== 1 ? 's' : ''}
-
- )}
{t.created_at && (
{new Date(t.created_at).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}