The dismissed follow-up, as its own chain

A dismissed cycle currently opens into a paragraph. This is what it looks like if it opens into a second rail instead — smaller dots, hanging off the row that dismissed them.

2026-08-28 · prospect detail → “Following up automatically” · round 2, after the caret and indent notes

Both of your notes were right, and they were the same mistake twice. I argued the child indent should be derived from the label column — then broke that column with a leading caret, and indented the child chain a second time on top of an inset it already had. Both fixed below.

What changed since round 1

Your noteWhat was wrongNow
“the text is not left aligned”A leading caret pushed that row's label off the 20px column every sibling holds.Caret moved to the trailing edge. Label back on the column.
“doesn't need to be further indented”The panel is already inset by the row; I indented the chain again inside it, so it sat 37px in.Child dots start at the panel's own left edge — no second indent.

The proposal — click the dismissed row

Switch the trailing control to compare. The blue line is the label column, drawn so alignment is visible rather than claimed.

Following up automatically

2 of 5 sent

  • Email

    Sent · Aug 20

  • Text

    Sent · Aug 22

  • Email

    Scheduled · Sep 2

Why trailing, when the app's convention is leading

The house disclosure convention really is caret-first — ConversationDetailsDisclosure says so in as many words, and CheckpointSection follows it. But those are standalone headers, where nothing else has to line up with them.

A rail row is the one place that convention can't hold: its labels form a column, and anything ahead of the label breaks it for one row only. So the rail is a principled exception, not a preference — and trailing is the conventional accordion position anyway.

Why the count and caret are one control

The row was going to carry a count at the trailing edge regardless. Two separate right-hand elements read as two things; 3 unsent › reads as one, and the count is the actual reason to open it. It also answers “the caret should look different” — it's an attached control rather than a glyph floating at the edge.

The indent is now genuinely derived

The panel already sits inside the row's 20px inset, so the child dots start at the panel's own left edge and land on the parent's label column with no offset of their own. Round 1 added 17px on top of that — the argument was right and the CSS didn't follow it.

child dot
6px, filled grey
child spine
panel edge = x 20px absolute
child inset
14px (dot 6 + gutter 8)
row gap
8px

What ships today, for comparison

Following up automatically

2 of 5 sent

  • Email

    Sent · Aug 20

  • Follow-up dismissed — tour booked

    3

    Dismissed due to activity — the lead moved on, so these never went out.

    • TextNever sent
    • EmailNever sent
    • CallNever sent
  • Email

    Scheduled · Sep 2

Three touches that occupy real positions in a cadence, rendered as a two-column list. Nothing says they were steps, and nothing ties them to the row that cancelled them.

And nothing says it opens. An expandable rail row is a real <button aria-expanded> — a keyboard and a screen reader find it — but it draws no glyph at all. That's the gap behind your question, and it's a defect rather than a preference: the affordance exists for assistive tech and is invisible to everyone else.

One constraint worth knowing

So the nested chain separates by size and position — 6px against 10px — not by becoming a different kind of mark. Two sizes of one dot read as parent and child; two shapes would read as two unrelated systems. Every nested dot is grey because the brand run is earned by happening, and none of these did.

Still open

  1. Which trailing control. R2 is my recommendation. R1 keeps the count and caret separate, which is more literal but puts two things at the edge. R3 drops the caret entirely and leans on the count alone — the row still opens, but discoverability goes back to hover.
  2. The stacked-dot hint (toggle above, off by default now). It invents a new glyph in a vocabulary that is deliberately strict about what a dot may mean. With a trailing control it is arguably redundant — I'd leave it off unless you want the collapsed row to hint at the chain from the dot column too.
  3. Whether the nested rows keep their day numbers. Day 5 / Day 9 / Day 14. The alternative names nothing, since none of them happened — but the schedule is why the cycle looks the way it does.

Geometry mirrored from TimelineRail.tsx and timeline-dot.ts · specimens at the real 358px sidebar width · mock data, no real lead.

PropFlow Docs