Index: src/views/pages/authorize-interaction.ejs
===================================================================
--- src/views/pages/authorize-interaction.ejs	(revision 5190152c90d2d397b7f87f9c900eae8d8c1e2856)
+++ src/views/pages/authorize-interaction.ejs	(revision e9c9ae1db68ca932789d82108c91af5e8bab1058)
@@ -204,4 +204,9 @@
         submitLabel: t('fedi.send'),
         rows: 4,
+        participants: (target && target.actor_uri) ? [{
+          uri: target.actor_uri,
+          url: target.actor_url || target.actor_uri,
+          handle: target.actor_handle || '',
+        }] : [],
       }) %>
       <div class="auth-interact-actions"><a href="<%= uri %>" class="btn"><%= t('comments.cancel') %></a></div>
Index: src/views/partials/fedi-node.ejs
===================================================================
--- src/views/partials/fedi-node.ejs	(revision 5190152c90d2d397b7f87f9c900eae8d8c1e2856)
+++ src/views/partials/fedi-node.ejs	(revision e9c9ae1db68ca932789d82108c91af5e8bab1058)
@@ -54,4 +54,5 @@
           submitLabel: t('fedi.send'),
           rows: 2,
+          participants: n.participants || [],
         }) %>
       </details>
Index: src/views/partials/reply-editor.ejs
===================================================================
--- src/views/partials/reply-editor.ejs	(revision 5190152c90d2d397b7f87f9c900eae8d8c1e2856)
+++ src/views/partials/reply-editor.ejs	(revision e9c9ae1db68ca932789d82108c91af5e8bab1058)
@@ -19,8 +19,12 @@
     initialText   plain-text prefill for the no-JS textarea (optional)
     noAttach      true hides the media button (edits do not touch attachments)
+    participants  [{uri, url, handle}] conversation partners → the mentions bar
+                  (u02): implicit mentions live here as removable chips, not in
+                  the text. Absent = no bar, legacy addressing.
 %>
 <% var _reInitHtml = (typeof initialHtml !== 'undefined' && initialHtml) || ''; %>
 <% var _reInitText = (typeof initialText !== 'undefined' && initialText) || ''; %>
 <% var _reNoAttach = (typeof noAttach !== 'undefined' && noAttach); %>
+<% var _reParts = (typeof participants !== 'undefined' && participants && participants.length) ? participants : null; %>
 <% var _reLang = (typeof defaultLang !== 'undefined' && defaultLang) || (typeof lang !== 'undefined' ? lang : 'en'); %>
 <form method="post" action="<%= action %>" class="re-form" data-re
@@ -30,4 +34,16 @@
   <% }); %>
   <input type="hidden" name="content" value="">
+  <%# Mentions bar (u02): the conversation partners as removable chips. The
+      hidden field always carries the CURRENT kept list (server-rendered full,
+      so the no-JS path addresses everyone). %>
+  <% if (_reParts) { %>
+    <input type="hidden" name="mentions" value="<%= JSON.stringify(_reParts) %>">
+    <div class="re-mentions">
+      <span class="re-mentions-label"><%= t('re.to') %></span>
+      <% _reParts.forEach(function (p) { %>
+        <span class="re-mention" data-uri="<%= p.uri %>"><%= p.handle && p.handle[0] === '@' ? p.handle : '@' + p.handle %><button type="button" class="re-mention-del" title="<%= t('re.mention_del') %>" aria-label="<%= t('re.mention_del') %>">×</button></span>
+      <% }); %>
+    </div>
+  <% } %>
   <%# Full-screen top bar (mobile compose). Hidden until JS + fullscreen. %>
   <div class="re-head" hidden>
