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.
What a chain carries
Two labels and nothing else:
| Field | Example | Where it shows |
|---|---|---|
code | LOOP | A small chip on the group row, and again on each member's face next to its display ID |
name | Loop Engineering | The heading on the group row |
color | optional | Tints 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 read3/14while 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_cardtakes an optionalgroupIdupdate_cardtakesgroupIdtoo;nullremoves the card from its chainscripts/backfill-card-groups.mjsconverts 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