{"record":{"id":"babe0221d5fd2cbf","repo":"phacility/phabricator","slug":"aborted-your-objects-are-safe","errorCode":null,"errorMessage":"Aborted, your objects are safe.","messagePattern":"Aborted, your objects are safe\\.","errorType":"console","errorClass":"PhutilArgumentUsageException","httpStatus":null,"severity":"info","filePath":"src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php","lineNumber":140,"sourceCode":"\n    foreach ($named_objects as $object_name => $object) {\n      $phid = $object->getPHID();\n\n      $console->writeOut(\n        \"    - %s (%s) %s\\n\",\n        $object_name,\n        get_class($object),\n        $handles[$phid]->getFullName());\n    }\n\n    $force = $args->getArg('force');\n    if (!$force) {\n      $ok = $console->confirm(\n        pht(\n          'Are you absolutely certain you want to destroy these %s object(s)?',\n          phutil_count($named_objects)));\n      if (!$ok) {\n        throw new PhutilArgumentUsageException(\n          pht('Aborted, your objects are safe.'));\n      }\n    }\n\n    $console->writeOut(\"%s\\n\", pht('Destroying objects...'));\n\n    $notes = array();\n    foreach ($named_objects as $object_name => $object) {\n      $console->writeOut(\n        pht(\n          \"Destroying %s **%s**...\\n\",\n          get_class($object),\n          $object_name));\n\n      $engine = id(new PhabricatorDestructionEngine())\n        ->setCollectNotes(true);\n\n      $engine->destroyObject($object);","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php#L122-L158","documentation":"Without --force, the destroy workflow asks for an interactive confirmation ('Are you absolutely certain...'). Declining throws PhutilArgumentUsageException with this message and nothing is destroyed. It is a deliberate safety stop, not a malfunction.","triggerScenarios":"Running ./bin/remove destroy interactively and answering no; scripts driving the command non-interactively where stdin supplies a negative or empty answer.","commonSituations":"Automation piping unanticipated input into the command; an operator changing their mind at the prompt.","solutions":["Re-run and answer y if destruction is really intended","In validated automation, pass --force to skip the prompt entirely","Treat a non-zero exit carrying this message as a clean no-op abort, not a failure to retry"],"exampleFix":"# before: interactive prompt, declined\n./bin/remove destroy T123\n\n# after: explicit non-interactive destroy after validation\n./bin/remove destroy --force T123","handlingStrategy":"validation","validationCode":"# Validate the target list yourself, then decide the prompt's fate explicitly\nif [ \"$CONFIRMED\" = \"yes\" ]; then\n  ./bin/remove destroy --force $NAMES\nelse\n  echo \"not confirmed; skipping destroy\" >&2\nfi","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use --force only after independently validating the target list","Scripts should expect a non-zero exit whose output contains 'Aborted' and treat it as a clean no-op","Never automate answering the interactive prompt blindly"],"tags":["cli","confirmation","destroy","abort"],"backgroundTag":"user-aborted-confirmation","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}