Skip to content

feat(desktop): outcome-first Projects with in-place thread panel - #95

Merged
oscarlehuu merged 1 commit into
mainfrom
feat/issue-83
Aug 7, 2026
Merged

feat(desktop): outcome-first Projects with in-place thread panel#95
oscarlehuu merged 1 commit into
mainfrom
feat/issue-83

Conversation

@oscarlehuu

Copy link
Copy Markdown

Summary

Mission-control series (#83, spike decisions: Projects = outcome cards → page breadcrumb, ship log, crew/upstream split, plumbing collapse, #13: in-flight opens the thread in place — no channel redirect):

  • Landing: outcome cards (needs-you / ready / in-flight / shipped-30d), quiet projects dimmed, repository-less projects first-class, sorted by what needs you.
  • Project page: breadcrumb Projects › name, ship log (merged PRs newest-first), in-flight section, crew vs upstream contributors, workspace tabs collapsed into Plumbing (closed by default).
  • In-place thread: clicking an in-flight row mounts the production MessageThreadPanel on the project page — panel owns its chrome (no nested shells), root fetched independently by event id + replies via useThreadReplies (roots outside the channel window work), skeleton/error states, composer send forwards threadHeadId for correct rooting. Channel send path untouched (additive optional param; fallback engages only when supplied).
  • needsYou: real source — Channel view: needs-you state — surface blocked agents (approval requests) per thread #74's store via new useNeedsYouForChannels (per-channel-set cached snapshots, generation invalidation, regression-tested).

Tests & verify

17 unit tests (outcome derivation, sort/dim, ship log, contributor split, store hook) · e2e: click → root text visible in exactly ONE message-thread-panel, URL stays /projects/ (never /channels/), plumbing expand, 4 hash-distinct screenshots, 2 green runs · pnpm run check + tsc clean.

Built by gpt-5.6-luna max (build + three fix rounds); reviewed by grok-4.5 across three rounds: r1 goChannel redirect (violating locked decision #13) + nonexistent PR.needsYou; r2 nested AuxiliaryPanel shell, channel-window-only reply loading, count-based invalidation, null/?? ""/send wiring; r3 APPROVE — verified in-place panel is real, data seam matches ChannelScreen, and no channel-send regression.

Fixes #83

Projects now leads with outcomes instead of plumbing. The landing is a
grid of outcome cards — needs-you / ready / in-flight / shipped-30d
counts, quiet projects dimmed, repository-less projects first-class —
sorted by what needs the user. A project opens as a page (breadcrumb
Projects › name) with a ship log of merged PRs, an in-flight section,
crew/upstream contributor split, and the old workspace tabs collapsed
into a Plumbing section, closed by default.

Clicking an in-flight thread opens the production MessageThreadPanel
in place on the project page (locked spike decision #13): the panel
owns its chrome (no nested shells), loads the root independently by
event id and replies through useThreadReplies — roots outside the
channel window render fine — with skeleton and error states, and the
composer send forwards threadHeadId so replies root correctly. The
channel send path is untouched (fallback only applies when a caller
supplies it). needsYou counts come from #74's store via a new
useNeedsYouForChannels hook with per-channel-set cached snapshots and
generation invalidation.

Three grok-4.5 review rounds: r1 caught a goChannel redirect and a
nonexistent PR.needsYou source; r2 caught the nested-panel shell,
channel-window-only reply loading, and count-based cache invalidation;
r3 verified every fix including no regression to channel thread sends.

Fixes #83

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Mission control: Projects rethink — outcome cards, ship log, crew/upstream split, plumbing collapse

1 participant