Skip to content

fix(dashboard): Show author photos and names on transcript messages - #2557

Merged
BYK merged 7 commits into
mainfrom
fix/transcript-author-avatars
Nov 2, 2026
Merged

BYK merged 7 commits into
mainfrom
fix/transcript-author-avatars

Conversation

@sentry-junior

@sentry-junior sentry-junior Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

After #2535, the conversation list shows profile photos, but the conversation view still shows initials for user messages. A new web send also shows the author email until history arrives, and then the name replaces it. Also, browsers could keep an old photo for a day after it changed.

Photos

Messages refer to their author by Identity id. The detail sends each author once.

  • Each user Message in an event page has actorIdentityId, from the actor_identity_id column of its event row. The page does no extra query. The system Identity is skipped, so event Messages do not change.
  • Pending mailbox rows have actorIdentityId from input.authorIdentityId.
  • The conversation detail has authors: each participant, keyed by every Identity id of their user. A web send from a person whose history is in Slack resolves before history has it. The photo uses the same rules as participants: the Slack photo, then the Google photo.
  • The client reads authors[actorIdentityId] where it draws the author: transcript messages, the speaker card, and queued rows. An author who is not in authors keeps the saved actorIdentity. The local outbox row uses the viewer photo from /api/me.
  • Live polls keep the authors reference while it does not change, so memoized views do not render again.
  • actorIdentityId and authors are sent only to viewers who can see private content, the same as participants.
  • TranscriptMessageShell and the speaker card draw the photo, with initials as the fallback. The fallback looks the same as before.

Name

actorLabel uses the email first. A web send carries both an email and a name, but its durable Message carries only the name, so the label changed after the refresh. transcriptMessageActorLabel now uses the name first. actorLabel itself does not change, so conversation owner labels stay the same.

Browser caching

Before this change, the photo path stayed the same when the photo changed, and it used private, max-age=86400. So a browser could show an old photo for a day, and it fetched each photo again in full every day.

  • Each photo path now has ?v= with a hash of the provider URL. A new photo has a new provider URL, so it gets a new path.
  • A request with the current version gets private, max-age=31536000, immutable.
  • A request without the version, or with an old one, gets private, no-cache and an ETag. A matching If-None-Match returns 304.
  • 404s stay no-store. The server already caches a failed fetch for 5 minutes.

Tests

  • The conversation detail test checks actorIdentityId on a user message, the author photo in authors, and that another Identity of the same user maps to the same author.
  • The pending-messages test checks actorIdentityId on a web mailbox row.
  • The dashboard format test checks that a message author comes from authors, with the saved author as the fallback. It also checks that the label is the name when the author has an email and a name.
  • The queue test checks that a queued row draws its author from authors.
  • The transcript test checks that a poll keeps the authors reference when it does not change.
  • The people avatar test checks the immutable versioned response, the no-cache response without a version, and a 304 on a matching ETag.

I did not take screenshots of the UI change.

via @BYK.

--

View Session in Sentry

sentry-junior Bot and others added 2 commits November 2, 2026 19:27
The conversation list showed participant photos, but transcript
messages still drew initials. Message actor identities came from the
saved message author and had no photo, and the message avatar drew only
initials.

Resolve each user Message author Identity when reading an event page
and add its photo path. Draw the photo in the message avatar and the
speaker card, with initials as the fallback.

Co-Authored-By: BYK <[email protected]>
A web send labeled its message with the author email until history
arrived, then switched to the name. The transcript label preferred
email, and only the durable Message had no email. Label user messages
with the name first.

Pending rows also had no photo. Add the viewer photo to the local
outbox row, and resolve the author photo for pending mailbox rows from
their author Identity.

Co-Authored-By: BYK <[email protected]>
@vercel

vercel Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
junior-docs Ready Ready Preview Nov 2, 2026 11:17pm UTC

Request Review

The photo path did not change when the photo changed, so the one-day
browser cache could show an old photo, and every day the browser fetched
the photo again in full.

Add the version of the provider URL to each photo path. A request with
the current version is immutable. Other requests use no-cache with an
ETag, and a matching If-None-Match returns 304.

Co-Authored-By: BYK <[email protected]>
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

20 screenshot changes — 20 changed · 0 added · 0 removed

Review screenshots in Frameshift

Automation Run Details · Desktop
Automation Run Details · Desktop
Changed
Automation Run Details Light · Desktop
Automation Run Details Light · Desktop
Changed
Conversation Attachment · Desktop
Conversation Attachment · Desktop
Changed
Conversation Attachment · Mobile
Conversation Attachment · Mobile
Changed
Conversation Attachment Modal · Desktop
Conversation Attachment Modal · Desktop
Changed
Conversation Child Agent Drawer · Desktop
Conversation Child Agent Drawer · Desktop
Changed
Show 12 more changed screenshots
Conversation Child Agent Drawer · Mobile
Conversation Child Agent Drawer · Mobile
Changed
Conversation Detail · Desktop
Conversation Detail · Desktop
Changed
Conversation Detail · Mobile
Conversation Detail · Mobile
Changed
Conversation Fork Dialog · Desktop
Conversation Fork Dialog · Desktop
Changed
Conversation Fork Links · Desktop
Conversation Fork Links · Desktop
Changed
Conversation Fork Links · Mobile
Conversation Fork Links · Mobile
Changed
Conversation Review Item Dismissed · Mobile
Conversation Review Item Dismissed · Mobile
Changed
Conversation Share Details · Desktop
Conversation Share Details · Desktop
Changed
Conversation Sidebar Collapsed · Desktop
Conversation Sidebar Collapsed · Desktop
Changed
Conversation Sidebar Needs Attention · Desktop
Conversation Sidebar Needs Attention · Desktop
Changed
Review Desk · Desktop
Review Desk · Desktop
Changed
Review Desk Item · Mobile
Review Desk Item · Mobile
Changed

2 more changed screenshots in Frameshift.

Messages and queued rows name their author with authorIdentityId. The
Conversation participants already carry each person's name and photo,
and now list the Identity ids of that person. The client reads the
author from there, so the API sends each person once and the event page
does no extra author lookup.
@github-actions github-actions Bot added risk: high PR risk score: high and removed risk: medium PR risk score: medium labels Nov 2, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 95b7a0c. Configure here.

Event pages read the author Identity id from the event row and send it
as actorIdentityId on each user Message. Pending messages do the same.
The detail sends authors once, keyed by every Identity id of each
person, so the client looks an author up by key. A person who sends from
another provider than the one in history still resolves.

Move outboxActorIdentity to the outbox module to keep queries.ts under
the file length limit.
…-avatars

# Conflicts:
#	packages/junior-dashboard/src/client/conversations/queries.ts
The queue no longer copies each author photo into every mailbox row.
The reply footer passes the Conversation authors to the queue, and each
row reads its author by actorIdentityId when it draws the avatar. Live
polls keep the authors reference while it does not change, so memoized
views do not render again.

Co-Authored-By: BYK <[email protected]>
@BYK
BYK merged commit e4ebbf5 into main Nov 2, 2026
46 checks passed
@BYK
BYK deleted the fix/transcript-author-avatars branch November 2, 2026 23:24

This branch was successfully deployed

1 active deployment
Preview – junior-docs — bbbf71c1 Deployed Nov 2, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk: high PR risk score: high

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant