phacility/phabricator · info · PhutilArgumentUsageException

Aborted, your objects are safe.

Error message

Aborted, your objects are safe.

What it means

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.

Source

Thrown at src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php:140

    foreach ($named_objects as $object_name => $object) {
      $phid = $object->getPHID();

      $console->writeOut(
        "    - %s (%s) %s\n",
        $object_name,
        get_class($object),
        $handles[$phid]->getFullName());
    }

    $force = $args->getArg('force');
    if (!$force) {
      $ok = $console->confirm(
        pht(
          'Are you absolutely certain you want to destroy these %s object(s)?',
          phutil_count($named_objects)));
      if (!$ok) {
        throw new PhutilArgumentUsageException(
          pht('Aborted, your objects are safe.'));
      }
    }

    $console->writeOut("%s\n", pht('Destroying objects...'));

    $notes = array();
    foreach ($named_objects as $object_name => $object) {
      $console->writeOut(
        pht(
          "Destroying %s **%s**...\n",
          get_class($object),
          $object_name));

      $engine = id(new PhabricatorDestructionEngine())
        ->setCollectNotes(true);

      $engine->destroyObject($object);

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Re-run and answer y if destruction is really intended
  2. In validated automation, pass --force to skip the prompt entirely
  3. Treat a non-zero exit carrying this message as a clean no-op abort, not a failure to retry

Example fix

# before: interactive prompt, declined
./bin/remove destroy T123

# after: explicit non-interactive destroy after validation
./bin/remove destroy --force T123
Defensive patterns

Strategy: validation

Validate before calling

# Validate the target list yourself, then decide the prompt's fate explicitly
if [ "$CONFIRMED" = "yes" ]; then
  ./bin/remove destroy --force $NAMES
else
  echo "not confirmed; skipping destroy" >&2
fi

Prevention

When it happens

Trigger: Running ./bin/remove destroy interactively and answering no; scripts driving the command non-interactively where stdin supplies a negative or empty answer.

Common situations: Automation piping unanticipated input into the command; an operator changing their mind at the prompt.

Related errors


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