Skip to content

One conversation surface: retire /chat #206

Description

@LinseCed

Dependencies

  • 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

Definition of Done

  • npm run try passes
  • PR reviewed and merged into dev

Updated 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 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.
  • Redirects. /chat → /buddy and /chat/:id → /buddy/:id (chat UUIDs are kept by the backfill in Show the closed-source state on the current-task card #259). Update accessPolicy and AppRouter.
  • Delete features/chatbot, ChatPage, ChatProvider, chatService and their tests once Buddy parity with chat: citations, stop, queue, reasoning, searchable rail, re-point chat consumers #266 has moved the callers.
  • Not ported (decided): KaTeX, aria-live turn announcements, chat mascot animations.
  • Order: land sprintstart-frontend#267 first (the tutor PR that replaced closed Feature/311 buddy onboarding tutor #265; approved — merge dev in, BuddyComposer/useBuddyConversation conflict), 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:

  • PM Replies open from the header drawer, with an unread badge
  • A hire without a project can open and use an unscoped conversation
  • The dock shows the most recent conversation and expands to its /buddy/:id

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestuxImprovement for the user experience

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions