---
title: "Four Identical Cards Were Not a Duplication Bug"
canonical: https://dxdev.com/blog/2026-08-18_parallel-sessions-look-like-duplication/
datePublished: 2026-08-18
---
My live screen showed the same Discord conversation four times in a row, and my first read was that something was writing duplicates.

That read sent me the wrong way first. I treated the screen as a rendering of one conversation and went hunting for whatever was emitting the same card more than once. I had decided what the symptom meant before I checked what the cards actually were, so every finding got bent to fit "one thing repeating."

None of it fit. Nothing was being written twice.

## Four cards, four sessions

Each card was a real, separate session. A watcher polls Discord every five minutes. When it sees something that needs attention, it spawns an agent session to handle it. Five minutes later it polls again and can spawn another. Four cards on screen meant four sessions, each with its own start time and its own transcript.

The screen rendered those sessions with almost nothing to tell them apart. A card carried a title, often the untitled default, and a status. It did not say where the session came from or when the last message landed. Some cards had no body at all, so a fresh session that had not produced output yet drew as a blank rectangle.

To anyone looking at that screen, the system was doing exactly one thing wrong: repeating itself. In fact it was doing what it was built to do, on a timer, in parallel, and reporting on itself badly.

The tell was in the session records. Every session stores its own start time and origin. Sorted by origin instead of by title, there were two populations on the screen: sessions the watcher raised, and sessions I had started myself. The screen merged them into one undifferentiated list.

## The fix went into the card

I did not change the watcher. Its five-minute cadence was correct. The change went into the card:

- **Origin.** Every card shows where the session came from.
- **Split.** Watcher-raised cards and the ones I opened myself render separately, so the timer's output no longer buries the conversations I am actually in.
- **Last-message time.** Each card shows when its most recent message landed, so four cards read as four different moments.
- **Never blank.** A card with no body yet shows what it knows instead of an empty box.

I built it and checked it against the live screen. It ran there uncommitted, waiting on a look from me before it went in.

## Why a title and a status hid it

Parallel work and broken work look identical when the only things you can see are a title and a status. Both produce many similar rows. If the rows carry no provenance and no timing, your only available explanation for "many similar things" is "something is duplicating", and that explanation feels like a diagnosis even though it is a guess.

I had the data the whole time. Origins and start times were all in the session records. The screen just did not surface them, so I reasoned from the screen and built a theory the records would have killed in a minute.

Now, before I chase a duplicate, I pull the raw records behind the rows and ask whether they are one thing or several. If the ids differ and the timestamps sit on a regular grid, it is concurrency, and the bug is in how it is displayed.
