Card chains

One piece of work often comes out as fourteen cards written in a single sitting. Before, the only way to say they belonged together was a title prefix — [LOOP] … on every card — which cost fourteen title slots to state one fact and still left fourteen cards competing for the column.

A chain (internally a card group) says it once. The members fold into a single row in each column they occupy.

card-groups

What a chain carries

Two labels and nothing else:

FieldExampleWhere it shows
codeLOOPA small chip on the group row, and again on each member's face next to its display ID
nameLoop EngineeringThe heading on the group row
coloroptionalTints the chip; falls back to the neutral ink token so it stays legible in both themes

Membership is the only thing a group carries. It has no status, no completion state and no date of its own — which is exactly why it is a group and not an epic. Everything a chain can say about progress is derived from its members.

The group row

A chain gets one row per column it has members in, sitting where its first member fell in that column's sort order. The row states:

  • the chain's name and code chip
  • a rollup — 3/14 done — counted across the whole board, not just this column. This is where the rollup earns its keep: the Backlog row can read 3/14 while only 8 of those cards are actually in Backlog
  • how many members this column is holding (8 collapsed)
  • the chain's next card: the first member that is neither completed nor withdrawn, in task-number order

Task-number order is chain order. A chain is written in one sitting, so the numbers come out in dependency order. Cards without a number (drafts) sort last rather than winning the "next" slot with a zero.

Folding

A chain is folded by default — that's the whole point, a 14-card chain occupying one slot until asked. Click the chevron to unfold.

Folded means folded: no member renders under a closed row. An earlier cut kept the next card visible under a closed row, which read as a disclosure control with a child still showing. What the next card was there to answer, the row already answers in text.

Fold state is per (chain, column), not per chain. Unfolding a chain in Backlog to see six cards has no business unfolding eight more in Ideation, off-screen. What you want across columns, the row already tells you.

When a chain disappears

Once every member is completed, the chain gets no row at all. A done chain has nothing left to say, and its cards are ordinary Completed cards from then on.

Withdrawn members count as finished for "what's next" but not as done for the rollup — a chain of 14 with 3 completed and 2 withdrawn reads 3/14 and points at the 6th card.

Search doesn't shrink the rollup

Group summaries are computed from the unfiltered board. A search that hides half a chain must not make the rollup claim the chain got shorter.

Creating and assigning chains

Chains are assigned through the MCP layer rather than by drag-and-drop, because they're normally created at the same moment as the cards — one agent turn writing the whole chain.

  • create_card takes an optional groupId
  • update_card takes groupId too; null removes the card from its chain
  • scripts/backfill-card-groups.mjs converts an existing [PREFIX] … title convention into real groups, stripping the prefixes as it goes

The group itself lives in the card_groups table (id, projectId, code, name, color), and each card carries a nullable groupId.

The Stale row is the same control

The row at the foot of a column holding its stale cards folds through exactly the same mechanism — same chevron, same "N collapsed", same per-column fold state. Chains and Stale differ in what they say, not in how they behave. See Stale cards leave the flow.


Prev: Focus view Next: Card anatomy Up: User guide index

Last updated: 2026-08-20