# S01: Dedicated Sub-Topic Pages — UAT

**Milestone:** M010
**Written:** 2026-03-31T06:04:33.352Z

## UAT: S01 — Dedicated Sub-Topic Pages

### Preconditions
- Chrysopedia stack running on ub01 (docker ps shows chrysopedia-api, chrysopedia-web-8096 healthy)
- At least one technique page exists with topic_category and topic_tags populated
- Web UI accessible at http://ub01:8096

### Test 1: Sub-topic page loads from Topics browse
1. Navigate to http://ub01:8096/topics
2. Click any sub-topic link (e.g., "Compression" under Mixing)
3. **Expected:** URL changes to /topics/mixing/compression (or equivalent category/subtopic)
4. **Expected:** Page shows breadcrumbs: "Topics > Mixing > Compression" — "Topics" is a clickable link to /topics
5. **Expected:** Techniques are grouped under creator name headings
6. **Expected:** Each technique title links to /techniques/{slug}

### Test 2: Direct URL navigation
1. Navigate directly to http://ub01:8096/topics/mixing/compression
2. **Expected:** Page loads without error, shows same content as Test 1

### Test 3: Empty sub-topic
1. Navigate to http://ub01:8096/topics/mixing/nonexistent-subtopic
2. **Expected:** Page shows empty state message (no techniques found), not a crash or 500 error
3. **Expected:** Breadcrumbs still render: "Topics > Mixing > Nonexistent Subtopic"

### Test 4: Breadcrumb navigation
1. On any sub-topic page, click the "Topics" breadcrumb link
2. **Expected:** Navigates back to /topics
3. **Expected:** Topics browse page loads normally

### Test 5: Creator grouping correctness
1. Navigate to a sub-topic that has techniques from multiple creators
2. **Expected:** Techniques appear in sections under each creator's name
3. **Expected:** Within each creator section, technique cards/links are listed

### Test 6: API endpoint direct test
1. `curl http://ub01:8096/api/topics/mixing/compression`
2. **Expected:** JSON response with `items` array, `total` count, and `page`/`size` pagination fields
3. **Expected:** Each item has `title`, `slug`, `creator_name`, `creator_slug`, `topic_category`, `topic_tags`

### Test 7: Pagination
1. `curl "http://ub01:8096/api/topics/mixing/compression?page=1&size=1"`
2. **Expected:** Returns at most 1 item with correct total count
3. **Expected:** `page` is 1, `size` is 1

### Edge Cases
- Sub-topic slug with hyphens (e.g., "sound-design") displays as "Sound Design" in breadcrumbs
- Category slug case doesn't matter for API (normalized in backend)
- Browser back button from sub-topic page returns to previous page
