diff --git a/src/applications/maniphest/editor/ManiphestTransactionEditor.php b/src/applications/maniphest/editor/ManiphestTransactionEditor.php
--- a/src/applications/maniphest/editor/ManiphestTransactionEditor.php
+++ b/src/applications/maniphest/editor/ManiphestTransactionEditor.php
@@ -328,10 +328,12 @@
     $is_unassigned = ($object->getOwnerPHID() === null);
 
     $any_assign = false;
+    $new_assignee = null;
     foreach ($xactions as $xaction) {
       if ($xaction->getTransactionType() ==
         ManiphestTaskOwnerTransaction::TRANSACTIONTYPE) {
         $any_assign = true;
+        $new_assignee = $xaction->getNewValue();
         break;
       }
     }
@@ -353,17 +355,38 @@
       $is_closing = ManiphestTaskStatus::isClosedStatus($new_status);
     }
 
-    // If the task is not assigned, not being assigned, currently open, and
-    // being closed, try to assign the actor as the owner.
-    if ($is_unassigned && !$any_assign && $is_open && $is_closing) {
-      $is_claim = ManiphestTaskStatus::isClaimStatus($new_status);
+    // Check if status is configured to claim (silently set actor as owner).
+    $is_claim = ManiphestTaskStatus::isClaimStatus($new_status);
 
-      // Don't assign the actor if they aren't a real user.
-      // Don't claim the task if the status is configured to not claim.
-      if ($actor_phid && $is_claim) {
-        $results[] = id(new ManiphestTransaction())
-          ->setTransactionType(ManiphestTaskOwnerTransaction::TRANSACTIONTYPE)
-          ->setNewValue($actor_phid);
+    // Check if the task is not assigned, currently open, and being closed.
+    if ($is_unassigned && $is_open && $is_closing) {
+
+      // If the task is not being assigned, try to assign the actor as owner.
+      if (!$any_assign) {
+        // Assign the actor only if they are a real user.
+        // Claim the task only if the status is configured to claim.
+        if ($actor_phid && $is_claim) {
+          $results[] = id(new ManiphestTransaction())
+            ->setTransactionType(ManiphestTaskOwnerTransaction::TRANSACTIONTYPE)
+            ->setNewValue($actor_phid);
+        }
+      }
+
+      // If the actor is going to set a status configured to claim && the actor
+      // has opened "Add Field... > Assigned To" (so $any_assign is true) && the
+      // actor has removed themselves from "Assigned To" (so $new_assignee is
+      // null), we de-facto are not going to change the (empty) assignee anyway.
+      // Thus remove the reassign transaction from $results to avoid the
+      // unwanted "Action with no effect" dialog. - https://we.phorge.it/T15164
+      if ($any_assign && $is_claim && !$new_assignee) {
+        for ($i = 0; $i < count($results); $i++) {
+          if ($results[$i]->getTransactionType() ===
+              ManiphestTaskOwnerTransaction::TRANSACTIONTYPE) {
+            unset($results[$i]);
+            $results = array_values($results); // close gap
+            break;
+          }
+        }
       }
     }