diff --git a/.planning/STATE.md b/.planning/STATE.md
index 77df9df..225af56 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -2,15 +2,15 @@
gsd_state_version: 1.0
milestone: v3.0
milestone_name: Design System & Visual Polish
-status: planning
-last_updated: "2026-05-16T16:35:15.959Z"
-last_activity: 2026-05-16
+status: executing
+last_updated: "2026-05-16T17:00:49.619Z"
+last_activity: 2026-05-16 -- Phase 14 planning complete
progress:
total_phases: 5
completed_phases: 1
- total_plans: 5
+ total_plans: 7
completed_plans: 5
- percent: 100
+ percent: 71
---
# STATE
@@ -30,8 +30,8 @@ See: `.planning/PROJECT.md` (updated 2026-05-16)
Phase: 14
Plan: Not started
-Status: Ready to plan
-Last activity: 2026-05-16
+Status: Ready to execute
+Last activity: 2026-05-16 -- Phase 14 planning complete
## Previous Milestone Status
diff --git a/.planning/phases/14-auth-pages/14-PATTERNS.md b/.planning/phases/14-auth-pages/14-PATTERNS.md
new file mode 100644
index 0000000..5c66c32
--- /dev/null
+++ b/.planning/phases/14-auth-pages/14-PATTERNS.md
@@ -0,0 +1,533 @@
+# Phase 14: Auth Pages - Pattern Map
+
+**Mapped:** 2026-05-16
+**Files analyzed:** 7 (5 templates/CSS + 2 static assets)
+**Analogs found:** 7 / 7
+
+---
+
+## File Classification
+
+| New/Modified File | Role | Data Flow | Closest Analog | Match Quality |
+|-------------------|------|-----------|----------------|---------------|
+| `backend/templates/auth_layout.templ` | template/layout | request-response | `backend/templates/layout.templ` | exact-role |
+| `backend/templates/auth_components.templ` | template/component | static-render | `go-backend/internal/web/views/auth_components.templ` | exact |
+| `backend/templates/auth_login.templ` | template/page | request-response | `backend/templates/auth_signup.templ` (peer) | exact |
+| `backend/templates/auth_signup.templ` | template/page | request-response | `backend/templates/auth_login.templ` (peer) | exact |
+| `backend/internal/web/ui/auth.css` | stylesheet | static-render | `go-backend/static/styles.css` lines 1063–1510, 2533–2947 | exact (extract) |
+| `backend/static/logo_dark.png` | static asset | file-copy | `go-backend/static/logo_dark.png` | exact |
+| `backend/static/logo_white.png` | static asset | file-copy | `go-backend/static/logo_white.png` | exact |
+
+---
+
+## Pattern Assignments
+
+### `backend/templates/auth_layout.templ` (layout, request-response)
+
+**Analog:** `backend/templates/layout.templ`
+
+**Package and imports pattern** (`backend/templates/layout.templ` lines 1–9):
+```go
+package templates
+
+import (
+ "backend/internal/web/ui"
+)
+```
+
+`AuthLayout` does NOT import `backend/internal/auth` — auth pages are always unauthenticated. No `user *auth.User` parameter.
+
+**HTML shell pattern** (`backend/templates/layout.templ` lines 25–59 adapted):
+```go
+templ AuthLayout(title string, csrfToken string) {
+
+
+
+
+
+ { title }
+
+
+
+
+ @AnimatedBackground()
+
+
+
+ { children... }
+
+
+
+
+
+
+}
+```
+
+Key deltas from `Layout`:
+- No ``, no `