Skip to content

feat(web): thread groups span projects and can mark a parent thread - #1829

Merged
donjor merged 1 commit into
hyprwsfrom
t3/cross-project-thread-groups
Oct 23, 2026
Merged

donjor merged 1 commit into
hyprwsfrom
t3/cross-project-thread-groups

Conversation

@donjor-agent

@donjor-agent donjor-agent Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

🤖 claude/anthropic claude-opus-5-5 (high)

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.

  • Multi-select across projects creates one group
  • Drag a thread from any project into a group
  • Old per-project groups merge on read

Group parent: optional parentThreadId, visual only.

  • Drag a thread flush under the header: parent
  • Drag the parent right: it steps down
  • Thread menu: Set / Clear group parent
  • Parent sits flush; only children indent
  • Parent leaves the group: rest flatten

Collapse with a parent: parent row stays.

  • Children fold into one strip
  • Strip: count plus one status dot each
  • Hover: each child's title and status
  • Click the strip to expand

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 0
  • vp run build (apps/web): exit 0
  • vp test run, changed test files: exit 0
  • vp run fork:ci: exit 0
  • Changed-file lint and format: exit 0
  • Real Chrome UAT, seeded dev data: clips below
  • vp run check:changed: exit 1, unrelated
    • Format, lint, knip, typecheck pass
    • Only GitManager.test.ts fails (server)
    • No server files change

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

@rsi-software-agent rsi-software-agent Bot added the size:XL 500-999 effective changed lines (test files excluded in mixed PRs). label Oct 22, 2026
@rsi-software-agent

rsi-software-agent Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

🧩 Effect Service Conventions e4d21ea ✅ clear

No findings.

🕐 22 Oct 15:15 UTC ⏱️ <1 min 🤖 gpt-6.1-sol 🪙 183.3K

⚠️ Not verified: Static review of the cumulative diff and latest changes; tests and builds were not rerun.

Details
Head Result Time Check
e4d21ea ✅ clear <1 min run
d4c69af ✅ clear <1 min run
181a62c ✅ clear <1 min run
fa6ee61 ✅ clear <1 min run

@rsi-software-agent

rsi-software-agent Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

🧩 UI Consistency e4d21ea ✅ clear

No findings.

🕐 22 Oct 15:16 UTC ⏱️ <1 min 🤖 gpt-6.1-sol 🪙 109.5K

Details
Head Result Time Check
e4d21ea ✅ clear <1 min run
d4c69af ✅ clear <1 min run
181a62c ✅ clear <1 min run
fa6ee61 ✅ clear 1 min run

@rsi-software-agent

rsi-software-agent Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

🩺 Aftercare e4d21ea ✅ clear

follow-up 2 resolved 4

commit fa6ee61

  • A1 Flatten visible members when their group parent is hidden ✅ d4c69af
  • A2 Regenerate titles from complete group membership ✅ d4c69af
  • 🔵 A3 Remove retired test-only local thread ordering 🔁 ×3 Caller searches still find only store plumbing and tests for retired local ordering.
  • 🔵 A4 Extract group coordination from oversized sidebar modules 🔁 ×3 Group coordination remains embedded in the oversized sidebar and logic modules.

commit d4c69af

  • A5 Preserve folded-parent heights in drag projection ✅ e4d21ea
  • A6 Document parent drag gestures and parent-preserving collapse ✅ e4d21ea

🕐 22 Oct 15:20 UTC ⏱️ 4 min 🤖 gpt-6.1-sol 🪙 693.7K

💬 Push to fix; reply A<n>: <option>, A<n>: defer <issue>, or A<n>: drop <reason>.

Details

A1 Flatten visible members when their group parent is hidden · apps/web/src/components/Sidebar.tsx:3269

  • Problem: Hidden parents leave remaining visible members indented as orphaned children.
  • Fix: Apply child indentation only when the parent is among visible active members.
  • Note: Visible-parent presence now controls hierarchy; filtered-parent coverage was added.

A2 Regenerate titles from complete group membership · apps/web/src/components/Sidebar.tsx:3304

  • Problem: Filtered regeneration omits group members; retry uses a different member set.
  • Fix: Resolve regeneration members from persisted scoped IDs, consistently with retry.
  • Note: Regeneration and retry now resolve stored membership through requestFromStore.

A3 Remove retired test-only local thread ordering · apps/web/src/uiStateStore.ts:500

  • Problem: Retired ordering state and mutators have no production consumers.
  • Fix: Delete obsolete ordering state, persistence, mutators, unused types, and supporting tests.
  • Note: Caller searches still find only store plumbing and tests for retired local ordering.

A4 Extract group coordination from oversized sidebar modules · apps/web/src/components/Sidebar.tsx:1123

  • Problem: Group coordination remains scattered through oversized general-purpose sidebar modules.
  • Fix: Extract feature-owned group coordination and leave sidebar section composition at the caller.
  • Note: Group coordination remains embedded in the oversized sidebar and logic modules.

A5 Preserve folded-parent heights in drag projection · apps/web/src/components/Sidebar.drag.ts:214

  • Problem: Shared card-height fallbacks mis-size drag gaps for taller folded parents.
  • Fix: Use measured heights for same-section drags; cover mixed-height card lists.
  • Note: Same-section projection preserves measured heights; mixed-height regression coverage was added.

A6 Document parent drag gestures and parent-preserving collapse · docs/user/thread-sidebar.md:109

  • Problem: Group documentation contradicts promotion gestures and parent-preserving collapse behavior.
  • Fix: Update user and internal guides for promotion, stepping down, and folded children.
  • Note: Both guides now describe parent promotion, demotion, and parent-preserving collapse.
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

@donjor
donjor force-pushed the t3/cross-project-thread-groups branch 2 times, most recently from 181a62c to d4c69af Compare October 22, 2026 14:33
@donjor-agent

donjor-agent Bot commented Oct 22, 2026

Copy link
Copy Markdown
Author

🤖 claude/anthropic claude-opus-5-5 (high)

Requested a rerun for one exact failed or cancelled CI job on the unchanged pull-request head. GitHub may also rerun dependent jobs.

  • Head: d4c69afc1e410169c91711436c8335fccb7dec7d
  • Workflow: hyprws CI; run 39796666961; pre-rerun attempt 1; open run
  • Job: Test Server 1; id 119885470055; open job
  • Check run: 119885470055
  • Genuine flake reason: apt mirror hang (azure.archive.ubuntu.com) timed out the job in setup; no server files changed

Fork-Domain: thread-ordering
Fork-Tier: qol
@donjor
donjor force-pushed the t3/cross-project-thread-groups branch from d4c69af to e4d21ea Compare October 22, 2026 15:14
@donjor
donjor merged commit 7901bcc into hyprws Oct 23, 2026
@donjor
donjor deleted the t3/cross-project-thread-groups branch October 23, 2026 01:33
donjor added a commit that referenced this pull request Oct 23, 2026
…1829)

Fork-Domain: thread-ordering
Fork-Tier: qol

Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 24, 2026
…1829)

Fork-Domain: thread-ordering
Fork-Tier: qol

Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 26, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
donjor added a commit that referenced this pull request Oct 27, 2026
…1829)

Fork-Domain: thread-ordering
Fork-Tier: qol

Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 27, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
donjor added a commit that referenced this pull request Oct 27, 2026
…1829)

Fork-Domain: thread-ordering
Fork-Tier: qol

Co-authored-by: donjor <[email protected]>
donjor added a commit that referenced this pull request Oct 27, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 27, 2026
…1829)

Squashes:

- 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
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 27, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 30, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 30, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 30, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 30, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 31, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Oct 31, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
donjor pushed a commit that referenced this pull request Nov 6, 2026
…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
donjor added a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 6, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 7, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 7, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 7, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 7, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 7, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 7, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 8, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 8, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 8, 2026
…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
rsi-software-agent Bot pushed a commit that referenced this pull request Nov 8, 2026
## 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 | ![before](https://github.com/user-attachments/assets/4a6c2a8d-befe-40b0-943d-6d9cdf62b6a5) | ![after](https://github.com/user-attachments/assets/e801aeb1-5cb4-4be9-ad1a-361d5e2ba9b3) |
| Collapsed | ![before](https://github.com/user-attachments/assets/8f9f9ccf-63d6-4589-a710-508a102df85f) | ![after](https://github.com/user-attachments/assets/f8338eca-d3a6-4d6b-a803-cc8599048714) |

**Active parent:** ![active](https://github.com/user-attachments/assets/08ed94ed-5806-4113-9f09-d66625d8d2b6)

**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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 effective changed lines (test files excluded in mixed PRs).

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant