{"record":{"id":"9353f66c4c0f410d","repo":"phacility/phabricator","slug":"err-no-effect","errorCode":"ERR-NO-EFFECT","errorMessage":"ERR-NO-EFFECT","messagePattern":"ERR-NO-EFFECT","errorType":"error_code","errorClass":"ConduitException","httpStatus":null,"severity":"error","filePath":"src/applications/maniphest/conduit/ManiphestUpdateConduitAPIMethod.php","lineNumber":67,"sourceCode":"    }\n\n    $query = id(new ManiphestTaskQuery())\n      ->setViewer($request->getUser())\n      ->needSubscriberPHIDs(true)\n      ->needProjectPHIDs(true);\n    if ($id) {\n      $query->withIDs(array($id));\n    } else {\n      $query->withPHIDs(array($phid));\n    }\n    $task = $query->executeOne();\n\n    $params = $request->getAllParameters();\n    unset($params['id']);\n    unset($params['phid']);\n\n    if (call_user_func_array('coalesce', $params) === null) {\n      throw new ConduitException('ERR-NO-EFFECT');\n    }\n\n    if (!$task) {\n      throw new ConduitException('ERR-BAD-TASK');\n    }\n\n    $task = $this->applyRequest($task, $request, $is_new = false);\n\n    return $this->buildTaskInfoDictionary($task);\n  }\n\n}\n","sourceCodeStart":49,"sourceCodeEnd":80,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/maniphest/conduit/ManiphestUpdateConduitAPIMethod.php#L49-L80","documentation":"maniphest.update throws ConduitException 'ERR-NO-EFFECT' when, after stripping the 'id' and 'phid' identification parameters, every remaining parameter coalesces to null — i.e. the request does not actually change anything. It is a defined error type for the method ('Update has no effect.') and aborts before the task is loaded and edited.","triggerScenarios":"Calling maniphest.update with only identification parameters, or with all other values null/empty: array('id' => 123), or array('phid' => 'PHID-TASK-...', 'title' => null, 'priority' => null). call_user_func_array('coalesce', $params) returns null, so the exception fires.","commonSituations":"Generated update calls where every optional field is present but null (a common artifact of json_encode of a sparse struct). Idempotent retry loops that resend an update after the first application, or scripts that 'touch' a task without changing fields. Note this check runs BEFORE ERR-BAD-TASK, so a no-effect request to a nonexistent task reports ERR-NO-EFFECT first.","solutions":["Omit null/empty fields from the params dict entirely instead of passing them as null, so at least one real change (title, priority, ownerPHID, ccPHIDs, etc.) survives.","Skip the update call when the computed diff of desired vs. current values is empty — no-op updates are rejected by design.","If you only need the current task state, call maniphest.query (or maniphest.search) instead of a zero-change update."],"exampleFix":"// before\n$conduit->callMethodSynchronous('maniphest.update', array(\n  'id'    => $id,\n  'title' => $new_title,   // $new_title is null -> ERR-NO-EFFECT\n));\n\n// after\n$params = array('id' => $id);\nif ($new_title !== null) {\n  $params['title'] = $new_title;\n}\nif (count($params) > 1) {\n  $conduit->callMethodSynchronous('maniphest.update', $params);\n}","handlingStrategy":"validation","validationCode":"// Strip null/empty fields; skip no-op updates entirely\n$update = array_filter($params, function ($v) { return $v !== null && $v !== ''; });\nunset($update['id'], $update['phid']);\nif (empty($update)) {\n  // nothing to change; read state instead of updating\n  return $conduit->callMethodSynchronous('maniphest.query', array('ids' => array($params['id'])));\n}","typeGuard":null,"tryCatchPattern":"try {\n  $result = $conduit->callMethodSynchronous('maniphest.update', $params);\n} catch (ConduitClientException $e) {\n  if ($e->getMessage() === 'ERR-NO-EFFECT') {\n    // acceptable: task already in desired state; treat as success\n    $result = null;\n  } else {\n    throw $e;\n  }\n}","preventionTips":["Compute a diff against current task state and skip empty diffs.","Never send explicit null fields; unset them from the params dict."],"tags":["phabricator","maniphest","conduit","no-op-request"],"backgroundTag":"empty-update-rejected","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}