You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Blocked by sprintstart-backend#214, which moves filters and named sessions onto the buddy.
Surfaces the capability mode from sprintstart-backend#206.
Summary & Goal
One conversation surface. A hire asks a question in one place, finds it again in one place, and
turns the buddy's capabilities off when they only want to search.
Technical Specification
Fold /chat and /buddy into a single page with a conversation list. Both are granted to all
groups in src/auth/accessPolicy.ts; the retired route redirects rather than 404s, and no
bookmark breaks.
The capability switch is the visible half of this. The backend mode exists already;
surface it as a control on the conversation — capabilities on for a buddy that can act, off for
plain search. Make the current state obvious, since it changes what the assistant can do.
Retrieval filters (source system, date range) move from the chat UI onto the unified surface.
BuddyProvider already holds one conversation for both dock and page
(src/features/buddy/BuddyProvider.tsx), which is the piece this builds on. The dock's expand
sequence (aiBuddyBus.ts, announceBuddyPageReady, the growing → covering → revealing handoff)
must land on the unified page.
Existing conversations, from both systems, appear in the list. Nothing a hire wrote disappears.
Retire features/chatbot/* and ChatPage.tsx once nothing references them. Leaving a dead second
implementation behind reintroduces exactly the confusion being fixed.
Note: searching across chat_messages and buddy_messages is deliberately not part of this.
With one engine there is one place to search, so the problem dissolves rather than being solved.
Acceptance Criteria
One page serves both uses, with a conversation list
The retired route redirects; no dead links or 404s
The capability switch is visible, obvious in its current state, and changes behaviour
Source and date filters work on the unified surface
Conversations from both systems appear, with transcripts intact
The dock's expand lands on the unified page with the handoff animation intact
The old chat implementation is removed, not left orphaned
Unit and a11y tests cover the list, the switch, and the filters
This is step 5 of Wiki#319. It was reopened on 2026-09-24 because its criteria were not met when it was closed on Sep 9. Blocked by sprintstart-backend#214 and sprintstart-frontend#266. The text above still stands; these points refine it, verified against dev.
Split with #266.#266 builds the parts: citations (popover and drawer), Stop, queue, reasoning panel, the conversation rail component with search and date grouping, moving the Citation type, and re-pointing the chat callers. This issue wires the page:
One page, one rail. Conversation history takes BuddyPage's left ConversationRail — the shared rail component already exists and already hosts PM Replies on BuddyPage; this adds the conversation list to it. PM Replies (BuddyPmReplies, which sits there today) move into a ui/SidePanel drawer opened from a header button with an unread badge.
No project gate. Remove BuddyPage's !selectedProjectId → "No project yet" gate. Without a project, the hire gets an unscoped conversation (Wiki#319 decision 1) instead of a dead end; this matters for everyone redirected from /chat.
Capability switch lives in BuddyComposer and is sent per message (SendBuddyMessageRequest.capabilitiesEnabled already exists), with its state always visible.
Filters sit on the composer and apply to the active conversation.
Dock.BuddyProvider holds one conversation; with several, the dock shows the most recently active one. "New conversation" in the dock creates one, and expanding navigates to /buddy/:id of that conversation, with the growing → covering → revealing handoff intact.
Dependencies
sprintstart-backend#214, which moves filters and named sessions onto the buddy.sprintstart-backend#206.Summary & Goal
One conversation surface. A hire asks a question in one place, finds it again in one place, and
turns the buddy's capabilities off when they only want to search.
Technical Specification
/chatand/buddyinto a single page with a conversation list. Both are granted to allgroups in
src/auth/accessPolicy.ts; the retired route redirects rather than 404s, and nobookmark breaks.
surface it as a control on the conversation — capabilities on for a buddy that can act, off for
plain search. Make the current state obvious, since it changes what the assistant can do.
BuddyProvideralready holds one conversation for both dock and page(
src/features/buddy/BuddyProvider.tsx), which is the piece this builds on. The dock's expandsequence (
aiBuddyBus.ts,announceBuddyPageReady, thegrowing → covering → revealinghandoff)must land on the unified page.
features/chatbot/*andChatPage.tsxonce nothing references them. Leaving a dead secondimplementation behind reintroduces exactly the confusion being fixed.
Note: searching across
chat_messagesandbuddy_messagesis deliberately not part of this.With one engine there is one place to search, so the problem dissolves rather than being solved.
Acceptance Criteria
Definition of Done
npm run trypassesdevUpdated 2026-09-25 (chat → Buddy migration, SprintStartProject/Wiki#319)
This is step 5 of Wiki#319. It was reopened on 2026-09-24 because its criteria were not met when it was closed on Sep 9. Blocked by sprintstart-backend#214 and sprintstart-frontend#266. The text above still stands; these points refine it, verified against
dev.Split with #266. #266 builds the parts: citations (popover and drawer), Stop, queue, reasoning panel, the conversation rail component with search and date grouping, moving the
Citationtype, and re-pointing the chat callers. This issue wires the page:ConversationRail— the shared rail component already exists and already hosts PM Replies on BuddyPage; this adds the conversation list to it. PM Replies (BuddyPmReplies, which sits there today) move into aui/SidePaneldrawer opened from a header button with an unread badge.!selectedProjectId→ "No project yet" gate. Without a project, the hire gets an unscoped conversation (Wiki#319 decision 1) instead of a dead end; this matters for everyone redirected from/chat.BuddyComposerand is sent per message (SendBuddyMessageRequest.capabilitiesEnabledalready exists), with its state always visible.BuddyProviderholds one conversation; with several, the dock shows the most recently active one. "New conversation" in the dock creates one, and expanding navigates to/buddy/:idof that conversation, with thegrowing → covering → revealinghandoff intact./chat→/buddyand/chat/:id→/buddy/:id(chat UUIDs are kept by the backfill in Show the closed-source state on the current-task card #259). UpdateaccessPolicyandAppRouter.features/chatbot,ChatPage,ChatProvider,chatServiceand their tests once Buddy parity with chat: citations, stop, queue, reasoning, searchable rail, re-point chat consumers #266 has moved the callers.aria-liveturn announcements, chat mascot animations.devin,BuddyComposer/useBuddyConversationconflict), then fix(buddy): edit the flag-to-PM question before confirming (#235) #272 (stacked on it). Easter Eggs Consolidation & Overhaul #184 and Prevent Buddy composer lag in long conversations #236 are already merged.Added criteria:
/buddy/:id