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
- 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.
- Verify the column still exists and is visible to the acting user (open the project's workboard; check column status and project policy).
- 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.
- 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
- Never persist column PHIDs across sessions; resolve them from the board at request time.
- On drag-drop failure, refresh the board - the column list in the client is stale.
- Expose 'project.column.search' to API consumers so they always submit live PHIDs.
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
- Transaction specifies both "afterPHID" and "afterPHIDs". Spe
- Transaction specifies both "beforePHID" and "beforePHIDs". S
- When moving objects between columns on a board, columns must
- Failed to load import with PHID "%s".
- Diff "%s" does not exist!
AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21).
Data as JSON: /api/errors/21a372a6f8080fc0.
Report an issue: GitHub.