---
id: S02
parent: M015
milestone: M015
provides:
  - last_technique_at field on /api/v1/creators response
  - Creator freshness dates on browse page
  - Date stamps on homepage recently-added cards
requires:
  []
affects:
  []
key_files:
  - backend/schemas.py
  - backend/routers/creators.py
  - frontend/src/api/public-client.ts
  - frontend/src/pages/CreatorsBrowse.tsx
  - frontend/src/pages/Home.tsx
  - frontend/src/App.css
key_decisions:
  - Used correlated scalar subquery for last_technique_at to preserve existing query structure
  - Used opacity-reduced --color-text-secondary for muted date styling
patterns_established:
  - (none)
observability_surfaces:
  - none
drill_down_paths:
  - .gsd/milestones/M015/slices/S02/tasks/T01-SUMMARY.md
  - .gsd/milestones/M015/slices/S02/tasks/T02-SUMMARY.md
duration: ""
verification_result: passed
completed_at: 2026-04-03T04:21:37.819Z
blocker_discovered: false
---

# S02: Creator Freshness + Homepage Card Dates

**Added last_technique_at to the creators API and rendered freshness dates on both the creators browse page and homepage recently-added cards.**

## What Happened

Two tasks delivered this slice end-to-end.

T01 added a correlated scalar subquery (`MAX(technique_pages.created_at)`) to the `list_creators` endpoint, exposed via a new `last_technique_at` field on the `CreatorBrowseItem` schema. The subquery preserves the existing query structure — no JOINs or GROUP BY changes. Deployed and verified on ub01: all 5 creators with techniques return datetime values, Caracal Project (0 techniques) returns null.

T02 added the field to the frontend TypeScript interface, rendered "Last updated: Mon D" on creator browse rows (only when non-null), and added `.recent-card__date` elements on homepage recently-added cards with muted styling (opacity-reduced secondary text). Rebuilt and deployed the web container. Browser assertions confirmed dates appear in short format (Apr 2, Apr 3) on both pages.

## Verification

Slice-level verification on live deployment (ub01:8096):

1. **API field presence:** `curl /api/v1/creators?limit=5 | grep last_technique_at` — field present on all items, non-null datetimes for creators with techniques.
2. **Creators browse page:** browser_assert confirmed "Last updated" text visible and `.creator-row__updated` selector present. Caracal Project (0 techniques) has no date element.
3. **Homepage cards:** browser_assert confirmed `.recent-card__date` selector visible, "Apr 3" and "Apr 2" text visible in recently-added section.
4. **Date format:** All dates use short format (Mon D), not full dates or ISO strings.

## Requirements Advanced

- R033 — Validated — creators browse shows last updated dates, homepage cards show date stamps, both verified live

## Requirements Validated

- R033 — Browser assertions on ub01:8096 confirm dates on creators page and homepage cards in short Mon D format

## New Requirements Surfaced

None.

## Requirements Invalidated or Re-scoped

None.

## Deviations

Docker Compose service name is chrysopedia-web, not chrysopedia-web-8096 as stated in the plan. SPA curl verification replaced with browser_assert since HTML is rendered client-side.

## Known Limitations

None.

## Follow-ups

None.

## Files Created/Modified

- `backend/schemas.py` — Added last_technique_at: datetime | None to CreatorBrowseItem
- `backend/routers/creators.py` — Added correlated MAX(created_at) subquery and row unpacking for last_technique_at
- `frontend/src/api/public-client.ts` — Added last_technique_at to CreatorBrowseItem interface
- `frontend/src/pages/CreatorsBrowse.tsx` — Render Last updated: Mon D on creator rows when non-null
- `frontend/src/pages/Home.tsx` — Render .recent-card__date on recently-added cards
- `frontend/src/App.css` — Added .creator-row__updated and .recent-card__date styles
