diff --git a/ui/src/components/logs/derive-trace-groups.ts b/ui/src/components/logs/derive-trace-groups.ts index f0cfecef..a533fc38 100644 --- a/ui/src/components/logs/derive-trace-groups.ts +++ b/ui/src/components/logs/derive-trace-groups.ts @@ -33,6 +33,7 @@ function coalesceKey(entry: LogsEntry): string { return [ entry.event ?? '', entry.message ?? '', + entry.stage ?? '', entry.module ?? entry.source ?? '', entry.level, entry.requestId ?? '', diff --git a/ui/tests/unit/ui/components/logs-derive-trace-groups.test.ts b/ui/tests/unit/ui/components/logs-derive-trace-groups.test.ts index 41a726e9..1fef043f 100644 --- a/ui/tests/unit/ui/components/logs-derive-trace-groups.test.ts +++ b/ui/tests/unit/ui/components/logs-derive-trace-groups.test.ts @@ -119,6 +119,17 @@ describe('deriveTraceGroups', () => { expect(leaves.every((l) => l.repeatCount === undefined)).toBe(true); }); + it('keeps adjacent leaves with different stages as separate rows (round-6 fix)', () => { + const result = deriveTraceGroups( + leafEntries( + { id: '1', timestamp: 't1', event: 'e', message: 'm', stage: 'route' }, + { id: '2', timestamp: 't2', event: 'e', message: 'm', stage: 'dispatch' } + ) + ); + expect(result).toHaveLength(2); + expect(result.every((r) => r.kind === 'leaf' && r.repeatCount === undefined)).toBe(true); + }); + it('keeps adjacent leaves with different messages as separate rows', () => { const result = deriveTraceGroups( leafEntries(