Repository navigation
feat(web): thread groups span projects and can mark a parent thread - #1829
Conversation
🧩 Effect Service Conventions
|
🩺 Aftercare
|
| Head | Result | Time | Check |
|---|---|---|---|
e4d21ea |
✅ clear · 2 fixed · 2 held | 4 min | run |
d4c69af |
🔴 2 open · 2 fixed · 2 held · 2 new | 5 min | run |
181a62c |
🔴 2 open · 4 held | 1 min | run |
fa6ee61 |
🔴 2 open · 4 new | 4 min | run |
181a62c to
d4c69af
Compare
Requested a rerun for one exact failed or cancelled CI job on the unchanged pull-request head. GitHub may also rerun dependent jobs.
|
Fork-Domain: thread-ordering Fork-Tier: qol
d4c69af to
e4d21ea
Compare
…1829) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
…1829) Squashes: - ffe001b feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 0a387aa fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - 2c59e70 feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) - ad5610a fixup! feat(web): thread groups span projects and can mark a parent thread (#1829) (#1829) Fork-Domain: thread-ordering Fork-Tier: qol
## Problem A group with a parent thread showed its title as a section header above the parent, detached from it. Collapse lived in two places: the header chevron, and an `8 threads` fold strip under the parent. ## Change - **Title tab:** joined to the parent card - **One control:** the tab toggles the children - **Collapsed:** urgent-first status dots, max 6 plus `+N` - **Tab tooltip:** every child's status; opens on focus - **Count:** children only - **Fold strip:** deleted, with drag hook and test - **Parentless groups:** header unchanged - **Cross-project:** cards keep their project line **Fork isolation:** the header lives in `SidebarThreadGroup.tsx`; upstream files carry `fork-hook` lines only. ## Scope and approval The human picked concept A (Tab) from four captured concepts, relayed by the orchestrator thread. Follows #1829 and #1840. ## Verification Real Chrome, seeded dev data: a cross-project parent group (8 children, 6 projects) and a parentless group (3). - Tab click flips `aria-expanded`; 6 dots plus `+2` - Keyboard focus on the tab opens the status list - Enter on the focused tab toggles; focus stays - Double-click opens rename; hover menu opens - Parentless header toggles as before - Light theme and active parent checked - No new console errors | State | Before | After | | --- | --- | --- | | Expanded |  |  | | Collapsed |  |  | **Active parent:**  **Checks:** - `vp run typecheck` (apps/web) → exit 0 - `vp run check:changed` → exit 1 on the last commit, from the unrelated `markdownPipeline.browser.test.ts`; it passes alone (exit 0 on earlier commits) - `vp run fork:ci` → exit 0 Claude Opus 5.5, Claude Code in T3 Code. ## Fork trailers Squashes: - 11840c4 feat(web): group title becomes a tab on its parent thread (#1878) (#1878) - 960f0b5 fixup! feat(web): group title becomes a tab on its parent thread (#1878) (#1878) Fork-Domain: thread-ordering Fork-Tier: qol Co-authored-by: donjor <[email protected]>
Problem
Sidebar thread groups only hold threads from one project.
Members all share one indentation, so a group cannot show which thread leads.
Change
Cross-project groups: one group list, not one per project.
Group parent: optional
parentThreadId, visual only.Collapse with a parent: parent row stays.
Title generation: first member's environment; member titles only.
Regenerate title: uses every stored member, not only visible ones.
Drag gap: a same-section drag sizes the gap from the lifted row's measured height, so a folded parent keeps its strip clear.
Fix: Create group clears the multi-select, so a member's menu shows the parent items at once.
Groups stay client-local; cross-machine sync is out of scope.
Web and desktop share this sidebar; mobile, providers, and wire contracts are unchanged.
Scope and approval
The maintainer asked for cross-project groups and a visual group parent in this agent thread, and deferred cross-machine sync.
Verification
vp run typecheck(apps/web): exit 0vp run build(apps/web): exit 0vp test run, changed test files: exit 0vp run fork:ci: exit 0vp run check:changed: exit 1, unrelatedGitManager.test.tsfails (server)Web client, seeded dev data, sidebar crop.
Drag to set the parent, fold children, step down
8-drag-parent-fold.mp4
The clips below predate the flush parent; they show it indented.
Group threads from two projects
1-cross-project-create.mp4
Set, switch, and clear the parent
2-parent.mp4
Drag a third project's thread in, long list
3-drag-in.mp4
Collapse, expand, reorder; parent stays first
4-collapse-reorder.mp4
Pin leaves the group; unpin restores its slot
5-pins.mp4
Remove the parent, then dissolve
6-remove-dissolve.mp4
Few threads: one project, three threads
7-few-threads.mp4
Implementation: Claude Opus 5.5 through Claude Code.
Fork trailers
Fork-Domain: thread-ordering
Fork-Tier: qol