Patterns
Audit log
The Audit Log tab of a record page (DLA, DSA, nominations): the milestones, then every status move as one sentence, newest first. The list is taken from the activity feed in Vercel's team settings.
Anatomy
A record page's Audit Log tab is an AuditLog (app/pages/_shared/audit-log.tsx): the record's ID and its created, activated (or decided) and last-modified milestones as "on" and "by" pairs, then a "Show all changes" link. The list it opens is an AuditFeed (app/pages/_shared/audit-feed.tsx), shown below on its own. It takes the record's events in the order they happened, the status meta of the collection (label and badge colour) and a noun for the empty state. Nothing else is chosen by the screen, so the three record pages read the same.
- One sentence per move. The person is the subject, then "moved this to" ("created this as" for a draft) and the status as its
Badge. The date sits at the right: Today, Yesterday, then 23 Sep 2026. Only dates are stored, not times. - Newest first, with a Current chip on the newest move.
- A run by the same person shares one header. The lines under it drop the name, so a person who made four moves in a row appears once.
- A note sits under its move: a rejection reason, an on-hold note.
- System is the clock moving a record (Approved to Active on the start date, Active to Closed the day after the end date). It has a bolt in place of initials.
A typical trail
Two people, newest first
A note and a system move
On hold with a note, then Active by the clock
Recent moves
Today and Yesterday
Empty
A log with no moves
Rules
- It lists status moves only. A field edit or an added location is not an event.
- It never shows an invented step. A record saved before logs existed is rebuilt from its own dates, with the note "Earlier steps were not recorded for this record."
- A record page reuses
AuditLogandAuditFeed; it does not build its own list of rows.
Held back
The research also showed filters and export (Customer.io, Toggl, Discord), expandable rows (Discord, 7shifts), before and after values (Toggl, Deputy), and from and to status chips (incident.io). None is built: a record has a handful of moves, and only status is recorded. They belong to a cross-record audit report, if one is added.
Figma
No linked Figma file yet - chosen from Mobbin research (Vercel's activity feed), not designed in Figma first.