phacility/phabricator · error · Exception

Column move transaction specifies column PHID "%s", but ther

Error message

Column move transaction specifies column PHID "%s", but there is no corresponding column with this PHID.

What it means

ManiphestTransactionEditor throws this while applying a workboard column-move transaction. It first loads every column named in the transaction via PhabricatorProjectColumnQuery->withPHIDs(...) scoped to the acting user (src/applications/maniphest/editor/ManiphestTransactionEditor.php:535-544), then requires each spec's 'columnPHID' to be present in that map. The PHID was well-formed but the query loaded nothing for it, so the editor refuses to record a move to a nonexistent column.

Source

Thrown at src/applications/maniphest/editor/ManiphestTransactionEditor.php:569

    $object_phids = array();
    if ($object_phid) {
      $object_phids[] = $object_phid;
    }

    if ($object_phids) {
      $layout_engine = id(new PhabricatorBoardLayoutEngine())
        ->setViewer($this->getActor())
        ->setBoardPHIDs($board_phids)
        ->setObjectPHIDs($object_phids)
        ->setFetchAllBoards(true)
        ->executeLayout();
    }

    foreach ($new as $key => $spec) {
      $column_phid = $spec['columnPHID'];
      $column = idx($columns, $column_phid);
      if (!$column) {
        throw new Exception(
          pht(
            'Column move transaction specifies column PHID "%s", but there '.
            'is no corresponding column with this PHID.',
            $column_phid));
      }

      $board_phid = $column->getProjectPHID();

      if ($object_phid) {
        $old_columns = $layout_engine->getObjectColumns(
          $board_phid,
          $object_phid);
        $old_column_phids = mpull($old_columns, 'getPHID');
      } else {
        $old_column_phids = array();
      }

      $spec += array(

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Refresh the board and retry with current column data - the normal UI refetches columns per request; long-lived tabs are the usual source of stale PHIDs.
  2. Verify the column still exists and is visible to the acting user (open the project's workboard; check column status and project policy).
  3. If calling the API, fetch live columns first (e.g. 'project.column.search') and use one of the returned PHIDs instead of a stored or hard-coded value.
  4. Confirm the PHID prefix is PHID-PCD- (a column) and belongs to this install, not a project PHID (PHID-PROJ-) or another instance's column.

Example fix

// before: trust a PHID saved long ago
$xactions[] = id(new ManiphestTransaction())
  ->setTransactionType(ManiphestTransaction::TYPE_COLUMN)
  ->setNewValue(array('columnPHID' => $stored_phid));

// after: verify against the board's current columns, visible to the actor
$columns = id(new PhabricatorProjectColumnQuery())
  ->setViewer($viewer)
  ->withProjectPHIDs(array($board_phid))
  ->execute();
$valid = mpull($columns, 'getPHID');
if (!in_array($stored_phid, $valid)) {
  $stored_phid = head($valid); // or abort and ask the client to reload
}
$xactions[] = id(new ManiphestTransaction())
  ->setTransactionType(ManiphestTransaction::TYPE_COLUMN)
  ->setNewValue(array('columnPHID' => $stored_phid));
Defensive patterns

Strategy: validation

Validate before calling

// Before applying a column move, confirm the column loads for the actor.
$columns = id(new PhabricatorProjectColumnQuery())
  ->setViewer($viewer)
  ->withPHIDs(array($spec['columnPHID']))
  ->execute();
if (!$columns) {
  // reload board / pick a fresh column instead of submitting
  throw new Exception('Column no longer exists or is not visible; reload the board.');
}

Try / catch

try {
  $editor->applyTransactions($task, $xactions);
} catch (Exception $ex) {
  if (preg_match('/no corresponding column/', $ex->getMessage())) {
    // surface 'reload the board' to the user instead of a raw stack
  }
  throw $ex;
}

Prevention

When it happens

Trigger: Applying TYPE_COLUMN transactions (board drag-drop, maniphest.edit Conduit with 'column', or $editor->applyTransactions()) where 'columnPHID' refers to a column that was deleted between board load and submit, belongs to a board the acting user cannot see (withViewer applies policy filtering), or was copied from another install. Deleted/hidden columns are excluded from the loaded map even though the PHID string is valid.

Common situations: A stale browser tab keeps a board open, an admin deletes or hides the column meanwhile, and the user then drags a task into it; API scripts that hard-code column PHIDs captured from an old board export; passing a column PHID from a different Phabricator instance.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/21a372a6f8080fc0. Report an issue: GitHub.