You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
(sidebar): define what a row represents and make every row verb follow it #564
Nothing defines what a sidebar row represents. Four mechanisms (/compact, /clear, continuations, slug groups) follow four different rules for which sessions share a row. Some verbs act on the row's representative, others on one member, and a merged row carries no mark that it is merged.
Concept: Row. See docs/product/CONCEPT-MAP.md M4 and §1–§4 (#561).
Related: #556 (Archive judges members by the representative's descriptor), #530 (duplicate merged row keys).
Converge in two steps. First write the definition, for example "a row is one conversation lineage; its newest live member drives its state, its position and the target of its verbs". Then align the four mechanisms and every row verb to it, and mark merged rows visibly.
Decision (maintainer, 13/10): what a sidebar row represents.
Definition. A row is one conversation: the transcript the user started, plus every transcript the CLI carried that same exchange into without being asked (a compaction mirror, or an unambiguous continuation).
The newest member (the head) drives state, position, Open and the process verbs.
Name, pin and archived belong to the conversation, stored on its oldest member (the root).
The four mechanisms
/compact: same row. This already works today through bridgeSessionId.
/clear: new row. The open terminal follows the new transcript.
Slug grouping is kept for scheduled runs only: a slug group is a container of rows. Interactive sessions are no longer grouped by the CLI slug, unless a measurement shows that slug links something users recognise.
Row verbs
Open: the open tab of any member, head first. Otherwise resume the head, with no chooser for a linear chain.
Delete: deletes every part (transcripts and their subagents). It is refused before any dialog while a member is live. The dialog counts the parts. There is no per-part delete.
Rename and Pin: the root.
Fork and Resume with config: the head.
View messages: the whole conversation, or at least the head.
Marking. A merged row shows "N parts", and its short id is the head's id. A "Parts" item in the context menu lists the members, each with View messages and Copy id. A search hit on any member lands on the row.
Found while writing this, not reproduced yet:
Delete on a merged row currently removes only the representative's file (main.js delete-session handler), so the row likely comes back as its newest mirror.
Opening a merged compact row with nothing open resumes the oldest file.
S16 (continuation chains rolled into one row) — owner decision, decided by Jean-Baptiste in person, 2026-10-19:
Q2: a continuation into a transcript of the same bridge group is not a branch. It is ignored for linearity, and the chain rolls up into one row.
Q1 (which name, pin and archive flag a rolled row shows, given that on real data the archived root is older than an unarchived, pinned head): delegated to the product designer. A recommendation will follow before the wiring PR.
Spec: .work-files/spec-564-s16.md (local). It is split into two PRs: PR 1 is renderer only (search and subagents follow every part of a merged row, which also fixes compaction mirrors); PR 2 does the rollup wiring and waits on Q1.
S16 Q1 — decided by Jean-Baptiste in person, 2026-10-19, on the product designer's recommendation. This replaces the 13/10 sentences "Rename and Pin: the root" / "The flag goes on the root".
Name, pin and archived belong to the conversation and are read across all its parts. A row is archived only when every part is archived, and pinned when any part is pinned. Its name is the newest rename the user made on any part, otherwise the root's name. Archive, Unarchive, Pin, Unpin and Rename write every part at once. A subagent is hidden when the conversation it belongs to is archived. The same rule applies to compaction mirrors and to a live background row.
Why: on real data, two of the chains S16 rolls up have an archived old part and a pinned live part. "Root only" would hide two live conversations, and their newer subagents would fall into Orphan subagents. The union rule writes nothing during a read and needs no migration.
This is implemented in S16 PR 2. docs/product/CONCEPT-MAP.md, docs/product/GLOSSARY.md and .ai/contexts/subagent-observability.md will be updated there.
Confirmed by Jean-Baptiste in person on 2026-10-30 (audit point M4): a sidebar row stays one conversation, as decided here on 19/10. Follow-up decisions of the same day: Stop from the terminal header and grid card stops the whole conversation (#917); Open always opens the head (#918, which also fixes the stale glossary entry); "Stop all" on a folder header refuses conversations with background jobs, says why, and can be forced (#843). Analysis: .work-files/switchboard/m4-row-definitions.md.
Activity
devsuitup commentedon Oct 13, 2026
Decision (maintainer, 13/10): what a sidebar row represents.
Definition. A row is one conversation: the transcript the user started, plus every transcript the CLI carried that same exchange into without being asked (a compaction mirror, or an unambiguous continuation).
The four mechanisms
/compact: same row. This already works today throughbridgeSessionId.continued-in): same row only for a single proven linear chain, meaning one terminal id or a matchingbridgeSessionId. An ambiguous or branching graph keeps separate rows, and the (sessions): one chooser for continuations, one rule for sessions live elsewhere #567 chooser runs on open./clear: new row. The open terminal follows the new transcript.slug, unless a measurement shows that slug links something users recognise.Row verbs
Marking. A merged row shows "N parts", and its short id is the head's id. A "Parts" item in the context menu lists the members, each with View messages and Copy id. A search hit on any member lands on the row.
Found while writing this, not reproduced yet:
main.jsdelete-session handler), so the row likely comes back as its newest mirror.(sidebar): a merged row opens and resumes its newest part (#564)
(sessions): attach and guard a merged row through the part that is li…
(restore): tell why a merged conversation was not restored when anoth…
(changelog): drop the entry for a regression that never shipped (#564)
(sidebar): a merged row opens and resumes its newest part (#564) (#615)
(sessions): delete every part of a merged row (#564)
(sessions): check and delete one snapshot of a row's parts, newest pa…
(sessions): forget the parts a partial delete removed, in the cache a…
(sessions): delete every part of a merged row (#564) (#708)
(sidebar): Fork, Resume with config and View messages act on the head…
(sidebar): Resume with config keeps the root among a row's parts; dro…
(docs): Agents Transcript keeps the job's own transcript (#564)
(sidebar): Fork, Resume with config and View messages act on the head…
(sidebar): show a merged row's parts, its head id, and a Parts menu (#…
1 remaining item
devsuitup commentedon Oct 19, 2026
S16 (continuation chains rolled into one row) — owner decision, decided by Jean-Baptiste in person, 2026-10-19:
Spec:
.work-files/spec-564-s16.md(local). It is split into two PRs: PR 1 is renderer only (search and subagents follow every part of a merged row, which also fixes compaction mirrors); PR 2 does the rollup wiring and waits on Q1.devsuitup commentedon Oct 19, 2026
S16 Q1 — decided by Jean-Baptiste in person, 2026-10-19, on the product designer's recommendation. This replaces the 13/10 sentences "Rename and Pin: the root" / "The flag goes on the root".
Why: on real data, two of the chains S16 rolls up have an archived old part and a pinned live part. "Root only" would hide two live conversations, and their newer subagents would fall into Orphan subagents. The union rule writes nothing during a read and needs no migration.
This is implemented in S16 PR 2.
docs/product/CONCEPT-MAP.md,docs/product/GLOSSARY.mdand.ai/contexts/subagent-observability.mdwill be updated there.(sidebar): search and subagents follow every part of a merged row (#564)
(sessions): name, pin and archive read across a conversation's parts …
(sidebar): search and subagents follow every part of a merged row (#564…
(sessions): name, pin and archive read across a conversation's parts …
(sessions): name, pin and archive read across a conversation's parts …
(sessions): a linear continuation chain shares one row (#564)
(sessions): a linear continuation chain shares one row (#564) (#721)
devsuitup commentedon Oct 19, 2026
Status of the slices, after #721 (merged as 8a44351):
(sessions): Stop on a multi-part conversation stops every running par…
(sessions): Stop on a multi-part conversation stops every running par…
devsuitup commentedon Oct 30, 2026
Confirmed by Jean-Baptiste in person on 2026-10-30 (audit point M4): a sidebar row stays one conversation, as decided here on 19/10. Follow-up decisions of the same day: Stop from the terminal header and grid card stops the whole conversation (#917); Open always opens the head (#918, which also fixes the stale glossary entry); "Stop all" on a folder header refuses conversations with background jobs, says why, and can be forced (#843). Analysis:
.work-files/switchboard/m4-row-definitions.md.(sidebar): Stop from the header or card stops the conversation, Open …