Add discussions to the replacement MR overview

Adds the Conversations card from the Decluttered Overview v2 design, below the MR description. It shows every comment thread in the order it was started, with the opening note, a state pill, and replies inline. This MR is display only; filters, roles and file links come in !257879 (merged), replying and resolving come in !257871 (merged), and code snippets come in !257872 (merged).

Next in the stack: !257879 (merged).

The card in the overview, under the description:

mr257832-v3-overview

The card: each thread with its state, replies inline, the resolved thread dimmed:

mr257832-v3-card

Detailed context for AI agents

Why this changed

The new overview hides the classic thread list. This MR replaces it with the thread-list part of the "Conversations" card from the "Decluttered Overview v2" concept in the MR Experience Redesign design, the concept the whole chain is building. Issue #606674 lists a "Conversations list with filters (All / Needs action / People / Agents)". This MR shows the threads and their state only. Filters, role pills and file links follow in !257879 (merged). Reply, resolve and reopen are in !257871 (merged). Code snippets are in !257872 (merged).

Chain

Merged:

Open:

The conversations work was split into four MRs on request, to keep each one reviewable. Each is stacked on the one before it.

What the card shows now

  • Heading "Conversations" with a red "N open" badge: a count of resolvable, unresolved threads among those loaded. Hidden when that count is zero.
  • Threads are listed in the order they were started.
  • Each thread's opening note shows an avatar and name linking to the profile (js-user-link). Agents are shown with the design's purple tanuki tile instead of the bot user's own avatar. Names use the heading text colour.
  • Each note shows how long ago it was posted, a state pill ("Unresolved" with a red dot, "Resolved", or "Comment" for threads that cannot be resolved), and a one-line preview of its body (bodyFirstLineHtml, using TODO_NOTE_PREVIEW_SAFE_HTML_CONFIG). The full rendered body turned suggestions into big grey code blocks, so this MR shows a short preview instead.
  • Replies show inline under the opening note, indented and compact.
  • Resolved threads are dimmed (gl-opacity-7).
  • Loading, empty and error states: a loading icon, "No conversations to show.", "Could not load conversations." on query error (reported to Sentry), and "Load more" for the next page, 100 threads per page.
  • Not live: there is no GraphQL subscription for merge request notes, so the panel loads once.

Code shape

  • discussions_panel.vue is the panel. It renders the GraphQL shape as returned: the opening note is notes.nodes[0] and the replies are the rest.
  • conversation_note.vue renders one note's header: the author or agent tile, the time, and a badges slot for the state pill, plus the body preview. Used for the opening note and, with a compact prop, for replies. No role pill yet - that comes with !257879 (merged).
  • The query mr_ai_overview_discussions.query.graphql asks for discussionsWithActivity with ONLY_COMMENTS: each thread's id, resolvable and resolved, and every note's id, bodyFirstLineHtml, createdAt and author (the shared User fragment plus bot). No positions, merge request web path, author, reviewers or diff refs yet - those come with !257879 (merged).

Left out of this MR

The design also has these, left as later follow-ups:

  • Per-thread Ask Duo actions ("Ask Duo to fix", "Ask Duo to draft reply") and the bulk bar ("Select all open (N)", "Ask Duo to resolve").
  • "Resolved by Duo" vs "Resolved by you".
  • The design's three-way legend of Human / Agent to you / Agent to agent. This needs routing data that does not exist yet (#606672).
  • Opening a thread in a side panel.
  • Flow status notes (such as "Duo Code Review has started") belonging in a separate flows panel. Until that panel exists, they still show here as ordinary agent comments.

Strings

Four new strings, unnamespaced like the reviewers panel: %{count} open, Conversations, Could not load conversations., No conversations to show..

Reused: Unresolved, Resolved, Comment, Load more.

locale/gitlab.pot regenerated.

Files changed (10)

  • ee/app/assets/javascripts/merge_requests/ai_overview/components/app.vue - mounts the panel below the description.
  • ee/app/assets/javascripts/merge_requests/ai_overview/components/discussions_panel.vue - new.
  • ee/app/assets/javascripts/merge_requests/ai_overview/components/conversation_note.vue - new.
  • ee/app/assets/javascripts/merge_requests/ai_overview/queries/mr_ai_overview_discussions.query.graphql - new.
  • ee/spec/features/merge_request/user_toggles_ai_overview_spec.rb - one example: a diff note and a discussion note each get a row, a system note does not.
  • ee/spec/frontend/merge_requests/ai_overview/components/app_spec.js - the panel renders.
  • ee/spec/frontend/merge_requests/ai_overview/components/discussions_panel_spec.js - new, 14 examples.
  • ee/spec/frontend/merge_requests/ai_overview/components/conversation_note_spec.js - new, 5 examples.
  • ee/spec/frontend/merge_requests/ai_overview/mock_data.js - makeNote, makeDiscussion, discussionsResponse.
  • locale/gitlab.pot.

Verification performed

  • Jest ee/spec/frontend/merge_requests/ai_overview: 9 suites, 133 examples, all pass, re-run after the rebase onto master on 2026-09-29.
  • ESLint, Prettier and Rubocop clean.
  • The query was checked from inside a signed-in GDK page, at a complexity of 139 of 300.
  • The screenshots above were retaken on 2026-09-29 on GDK with this MR's files after the rebase onto master, no JavaScript console errors.
  • The feature spec has not run locally, because GDK's Vite serves the main checkout, not this branch's worktree. CI is its first run.
Edited by Marc Shaw

Merge request reports

Loading
Loading