{"record":{"id":"fee6652e9046a5e7","repo":"phacility/phabricator","slug":"argument-s-does-not-name-a-buildable-provide-o","errorCode":null,"errorMessage":"Argument \"%s\" does not name a buildable. Provide one or more valid buildable monograms or PHIDs.","messagePattern":"Argument \"(.+?)\" does not name a buildable\\. Provide one or more valid buildable monograms or PHIDs\\.","errorType":"console","errorClass":"PhutilArgumentUsageException","httpStatus":null,"severity":"warning","filePath":"src/applications/harbormaster/management/HarbormasterManagementPublishWorkflow.php","lineNumber":43,"sourceCode":"\n    $buildable_names = $args->getArg('buildable');\n    if (!$buildable_names) {\n      throw new PhutilArgumentUsageException(\n        pht(\n          'Name one or more buildables to publish, like \"B123\".'));\n    }\n\n    $query = id(new PhabricatorObjectQuery())\n      ->setViewer($viewer)\n      ->withNames($buildable_names);\n\n    $query->execute();\n\n    $result_map = $query->getNamedResults();\n\n    foreach ($buildable_names as $name) {\n      if (!isset($result_map[$name])) {\n        throw new PhutilArgumentUsageException(\n          pht(\n            'Argument \"%s\" does not name a buildable. Provide one or more '.\n            'valid buildable monograms or PHIDs.',\n            $name));\n      }\n    }\n\n    foreach ($result_map as $name => $result) {\n      if (!($result instanceof HarbormasterBuildable)) {\n        throw new PhutilArgumentUsageException(\n          pht(\n            'Object \"%s\" is not a HarbormasterBuildable (it is a \"%s\"). '.\n            'Name one or more buildables to publish, like \"B123\".',\n            $name,\n            get_class($result)));\n      }\n    }\n","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/harbormaster/management/HarbormasterManagementPublishWorkflow.php#L25-L61","documentation":"Per-argument resolution check in `harbormaster publish`: all names were run through PhabricatorObjectQuery->withNames(), and getNamedResults() is consulted for each input; any name that produced no named result throws, listing the offending argument. Note this fires before the type check that follows, so it concerns resolution, not buildability.","triggerScenarios":"One bad name in a batch ('B12x' among valid B123-style monograms); a PHID string that is well-formed but unknown; names the acting CLI viewer cannot resolve; copy-paste artifacts (trailing commas become separate arguments).","commonSituations":"Mixed-quality lists from automation; environments where buildables were garbage-collected between list generation and publish; trailing punctuation creating bogus extra arguments.","solutions":["Correct or drop the offending name and re-run with only resolvable buildable monograms (B123) or full PHIDs.","Pre-validate names (phid.lookup / object query) before invoking publish in scripts.","Trim punctuation/whitespace from generated name lists."],"exampleFix":"# before\n./bin/phabricator harbormaster publish B123, B12x\n\n# after\n./bin/phabricator harbormaster publish B123","handlingStrategy":"validation","validationCode":"// Pre-resolve every name before invoking publish:\n$query = id(new PhabricatorObjectQuery())\n  ->setViewer($viewer)\n  ->withNames($buildable_names);\n$query->execute();\n$valid = array_keys($query->getNamedResults());\n$buildable_names = array_intersect($buildable_names, $valid); // drop unresolvable","typeGuard":"function allNamesResolve($viewer, array $names) {\n  $query = id(new PhabricatorObjectQuery())\n    ->setViewer($viewer)\n    ->withNames($names);\n  $query->execute();\n  $results = $query->getNamedResults();\n  foreach ($names as $name) {\n    if (empty($results[$name])) { return false; }\n  }\n  return true;\n}","tryCatchPattern":"try {\n  runPublishWorkflow($args);\n} catch (PhutilArgumentUsageException $e) {\n  if (preg_match('/does not name a buildable/', $e->getMessage())) {\n    // remove the offending argument and re-run with the valid subset\n  }\n}","preventionTips":["Filter name lists through PhabricatorObjectQuery/phid.lookup before passing them to the CLI.","Trim whitespace and punctuation from generated lists; 'B123,' becomes a second bogus argument."],"tags":["harbormaster","cli","usage-error","object-resolution","publish"],"backgroundTag":"entity-not-found-by-name","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}