{"record":{"id":"ae3f24deb1bb138e","repo":"phacility/phabricator","slug":"configuration-defines-no-task-status-with-special","errorCode":null,"errorMessage":"Configuration defines no task status with special attribute \"%s\", but you must specify a status which fills this special role.","messagePattern":"Configuration defines no task status with special attribute \"(.+?)\", but you must specify a status which fills this special role\\.","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/applications/maniphest/constants/ManiphestTaskStatus.php","lineNumber":390,"sourceCode":"      }\n\n      $special_map[$special] = $key;\n    }\n\n    // NOTE: We're not explicitly validating that we have at least one open\n    // and one closed status, because the DEFAULT and CLOSED specials imply\n    // that to be true. If those change in the future, that might become a\n    // reasonable thing to validate.\n\n    $required = array(\n      self::SPECIAL_DEFAULT,\n      self::SPECIAL_CLOSED,\n      self::SPECIAL_DUPLICATE,\n    );\n\n    foreach ($required as $required_special) {\n      if (!isset($special_map[$required_special])) {\n        throw new Exception(\n          pht(\n            'Configuration defines no task status with special attribute '.\n            '\"%s\", but you must specify a status which fills this special '.\n            'role.',\n            $required_special));\n      }\n    }\n  }\n\n}\n","sourceCodeStart":372,"sourceCodeEnd":401,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/maniphest/constants/ManiphestTaskStatus.php#L372-L401","documentation":"After scanning every maniphest.statuses entry, the validator requires that the three mandatory special roles — SPECIAL_DEFAULT, SPECIAL_CLOSED, SPECIAL_DUPLICATE — each appear exactly once. If none of the statuses carries a given special attribute, this Exception names the missing role. Without them Phabricator could not pick a status for new tasks, closing, or duplicates.","triggerScenarios":"A maniphest.statuses config where no entry has \"special\": \"duplicate\" (or \"default\", or \"closed\") — e.g. a from-scratch config that only lists open and resolved without special markers.","commonSituations":"Writing a minimal custom status list for the first time and not knowing about required special roles. Deleting a status (like 'duplicate') entirely instead of disabling it. Copying an example config that omitted the special fields.","solutions":["Ensure one status has \"special\": \"default\" (an open one), one has \"special\": \"closed\" (a closed one), and one has \"special\": \"duplicate\" (a closed one).","Instead of removing an unwanted status, mark it \"disabled\": true so the special roles survive.","Start from the shipped default maniphest.statuses map and modify entries rather than building one empty."],"exampleFix":"// before\narray(\n  'open'     => array('name' => 'Open'),\n  'resolved' => array('name' => 'Resolved', 'closed' => true),\n)  // no special roles -> throws\n\n// after\narray(\n  'open'     => array('name' => 'Open', 'special' => 'default'),\n  'resolved' => array('name' => 'Resolved', 'closed' => true, 'special' => 'closed'),\n  'duplicate' => array('name' => 'Duplicate', 'closed' => true, 'special' => 'duplicate'),\n)","handlingStrategy":"validation","validationCode":"$roles = array();\nforeach ($statuses as $constant => $spec) {\n  if (!empty($spec['special'])) $roles[$spec['special']] = $constant;\n}\nforeach (array('default', 'closed', 'duplicate') as $required) {\n  if (!isset($roles[$required])) {\n    throw new InvalidArgumentException(\"No status with special '$required'\");\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always define default, closed, and duplicate special roles in maniphest.statuses.","Disable unwanted statuses with \"disabled\": true instead of deleting them.","Start from the shipped default map when customizing."],"tags":["phabricator","maniphest","configuration","status","missing-required-key"],"backgroundTag":"missing-required-config-key","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}