diff --git a/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx b/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx
index 9e69ac6a5..0c2298da4 100644
--- a/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx
+++ b/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx
@@ -285,6 +285,47 @@ describe('TicketDetailPage reply access', () => {
.toBeUndefined()
})
+ it('identifies support team replies without labelling the ticket owner', () => {
+ mockUseSWR.mockReturnValue({
+ data: {
+ ...closedTicket,
+ responseCount: 2,
+ responses: [{
+ createdAt: '2026-08-07T01:30:00.000Z',
+ id: 'response-owner',
+ markdown: 'Member follow-up.',
+ readBy: [],
+ userHandle: 'ticket-owner',
+ userId: '12345',
+ }, {
+ createdAt: '2026-08-07T01:45:00.000Z',
+ id: 'response-support',
+ markdown: 'Support follow-up.',
+ readBy: [],
+ userHandle: 'support-agent',
+ userId: '67890',
+ }],
+ },
+ error: undefined,
+ isValidating: false,
+ mutate: mockMutate,
+ })
+
+ render()
+
+ const ownerReply = screen.getByText('Member follow-up.')
+ .closest('article')
+ const supportReply = screen.getByText('Support follow-up.')
+ .closest('article')
+
+ expect(ownerReply?.textContent)
+ .toContain('ticket-owner')
+ expect(ownerReply?.textContent)
+ .not.toContain('(Support Team)')
+ expect(supportReply?.textContent)
+ .toContain('support-agent (Support Team)')
+ })
+
it('requires non-owner support staff to assign an open ticket before replying or closing it', () => {
mockProfile = {
roles: ['Topcoder Support Team'],
diff --git a/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx b/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx
index 8ac4bfeb5..e0a731c86 100644
--- a/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx
+++ b/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx
@@ -43,7 +43,7 @@ import {
import styles from './TicketDetailPage.module.scss'
/**
- * Renders the original request followed by ascending replies and authorized actions.
+ * Renders the original request followed by ascending, role-labelled replies and authorized actions.
*
* @returns support ticket detail page.
* @throws Does not throw; request failures are shown with recovery actions.
@@ -316,6 +316,7 @@ export const TicketDetailPage: FC = () => {
color={response.userHandleColor}
handle={response.userHandle}
/>
+ {response.userId !== data.memberUserId && ' (Support Team)'}
diff --git a/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx b/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx
index 579e4a5a7..978510484 100644
--- a/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx
+++ b/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx
@@ -3107,7 +3107,7 @@ describe('ChallengeEditorForm', () => {
render(
-
+
,
)
@@ -3131,7 +3131,7 @@ describe('ChallengeEditorForm', () => {
{
render(
-
+
,
)
@@ -4443,7 +4443,7 @@ describe('ChallengeEditorForm', () => {
isLoading: false,
})
mockedPatchChallenge.mockResolvedValue({
- ...designChallengeWithDeferredScreener,
+ ...designChallengeWithDeferredScreeners,
metadata: [],
status: 'DRAFT',
})
@@ -4452,7 +4452,7 @@ describe('ChallengeEditorForm', () => {