phacility/phabricator · error · PhutilArgumentUsageException

Blueprint " " could not be loaded. Try a blueprint ID or…

Error message

Blueprint "%s" could not be loaded. Try a blueprint ID or PHID.

What it means

A PhutilArgumentUsageException from `bin/drydock lease --blueprint <identifier>` when an identifier cannot be resolved by DrydockBlueprintQuery::withIdentifiers(). Acceptable identifiers are numeric blueprint IDs or blueprint PHIDs; anything else (name, class, callsign) fails here. It can also fire when the blueprint exists but is not visible to the management workflow's viewer.

Solutions

  1. Open the Drydock Blueprints console and use the numeric ID from the URL (e.g. /drydock/blueprint/view/3/ → 3) or the PHID.
  2. If it should exist, verify the blueprint was not deleted or disabled-out of visibility and re-run.
  3. Pass each identifier exactly once and in full (see the duplicate check in error 556).

Example fix

# before
bin/drydock lease --type host --blueprint my-host-blueprint

# after
bin/drydock lease --type host --blueprint 3
# or
bin/drydock lease --type host --blueprint PHID-DRYB-xxxxxxxx
Defensive patterns

Strategy: validation

Validate before calling

$query = id(new DrydockBlueprintQuery())
  ->setViewer($viewer)
  ->withIdentifiers($identifiers);
$blueprints = $query->execute();
$map = $query->getIdentifierMap();
foreach ($identifiers as $identifier) {
  if (!isset($map[$identifier])) {
    throw new InvalidArgumentException(
      "Unresolvable blueprint identifier: {$identifier}");
  }
}

Prevention

When it happens

Trigger: `bin/drydock lease --type host --blueprint my-host-blueprint` (a name instead of ID/PHID), or `--blueprint 99` where blueprint 99 does not exist or is invisible.

Common situations: Assuming blueprints are addressable by name like repositories are by callsign; stale IDs after blueprints were deleted; copy-pasting the blueprint PHID with a typo or truncation.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at src/applications/drydock/management/DrydockManagementLeaseWorkflow.php:286

    }
  }

  private function getBlueprintFilterMap(array $identifiers) {
    $viewer = $this->getViewer();

    $query = id(new DrydockBlueprintQuery())
      ->setViewer($viewer)
      ->withIdentifiers($identifiers);

    $blueprints = $query->execute();
    $blueprints = mpull($blueprints, null, 'getPHID');

    $map = $query->getIdentifierMap();

    $seen = array();
    foreach ($identifiers as $identifier) {
      if (!isset($map[$identifier])) {
        throw new PhutilArgumentUsageException(
          pht(
            'Blueprint "%s" could not be loaded. Try a blueprint ID or '.
            'PHID.',
            $identifier));
      }

      $blueprint = $map[$identifier];

      $blueprint_phid = $blueprint->getPHID();
      if (isset($seen[$blueprint_phid])) {
        throw new PhutilArgumentUsageException(
          pht(
            'Blueprint "%s" is specified more than once (as "%s" and "%s").',
            $blueprint->getBlueprintName(),
            $seen[$blueprint_phid],
            $identifier));
      }

View on GitHub (pinned to 5720a38cfe)