diff --git a/app/assets/javascripts/issuable/components/issue_assignees.vue b/app/assets/javascripts/issuable/components/issue_assignees.vue
index 21f35690f6d63a2b71c46ff296ee24b5b89e3b83..49269665d6fd630efb1c35fabfa4140803926a8e 100644
--- a/app/assets/javascripts/issuable/components/issue_assignees.vue
+++ b/app/assets/javascripts/issuable/components/issue_assignees.vue
@@ -91,7 +91,7 @@ export default {
       data-qa-selector="assignee_link"
     >
       <span class="js-assignee-tooltip">
-        <span class="bold d-block">{{ s__('Label|Assignee') }}</span> {{ assignee.name }}
+        <span class="bold d-block">{{ s__('Label|Assignee') }}</span> {{ "TEST" }}
         <span v-if="assignee.username" class="text-white-50">@{{ assignee.username }}</span>
       </span>
     </user-avatar-link>
diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb
index 087e4838ed94188de1d649b1f90dafa40a7fd196..b81a5eb840c2ce3bc88c89ad807fc743f297f892 100644
--- a/app/helpers/events_helper.rb
+++ b/app/helpers/events_helper.rb
@@ -68,7 +68,7 @@ def link_to_author(event, self_added: false)
     author = event.author
 
     if author
-      name = self_added ? _('You') : author.name
+      name = self_added ? 'You' : author.redacted_name(current_user)
       link_to name, user_path(author.username), title: name
     else
       escape_once(event.author_name)
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 4f345fdeb9cd9cd443dc936464ce4c0bd9b9ba34..e9d6f9b87c70e44471932f1ef02f40a84f0fa281 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -155,6 +155,8 @@ def confirm_user_data(user)
   def user_display_name(user)
     return s_('UserProfile|Blocked user') if user.blocked?
 
+    return secure_project_bot_name(current_user, user) if user.project_bot?
+
     can_read_profile = can?(current_user, :read_user_profile, user)
     return s_('UserProfile|Unconfirmed user') unless user.confirmed? || can_read_profile
 
@@ -172,6 +174,19 @@ def display_public_email?(user)
     user.public_email.present?
   end
 
+  def secure_project_bot_name(current_user, user)
+    if user.groups.any?
+      return user.name if current_user&.can?(:read_group, user.groups.first)
+    end
+
+    return user.name if current_user&.can?(:read_project, user.projects.first)
+
+    # If the requester does not have permission to read the project bot name,
+    # the API returns an arbitrary string. UI changes will be addressed in a follow up issue:
+    # https://gitlab.com/gitlab-org/gitlab/-/issues/346058
+    '****'
+  end
+
   private
 
   def admin_users_paths
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 7cef87ba19f2355f883349de498abb30f62aa6c5..cff6c4d3a036f7b3ed07e241e12bb064038409f2 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -54,7 +54,7 @@
         = link_to avatar_icon_for_user(@user, 400, current_user: current_user), target: '_blank', rel: 'noopener noreferrer' do
           = render Pajamas::AvatarComponent.new(@user, alt: "", size: 96, avatar_options: { itemprop: "image" })
 
-      - if @user.blocked? || !@user.confirmed?
+      - if @user.blocked? || !@user.confirmed? || @user.project_bot?
         .user-info
           %h1.cover-title
             = user_display_name(@user)
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index c2c78be6a0fba149a56e7fdbca41b42ab8867204..c1fa45d79e58e40b8db6141b289ec0df360461e7 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -370,6 +370,12 @@ def filter_ee_badges(badges)
       it { is_expected.to eq('Blocked user') }
     end
 
+    context 'for a project bot user' do
+      let(:user) { create(:user, :project_bot) }
+
+      it { is_expected.to eq('****') }
+    end
+
     def stub_current_user(user)
       allow(helper).to receive(:current_user).and_return(user)
     end