phacility/phabricator · warning · PhutilArgumentUsageException
Object "%s" is not a Harbormaster Buildable!
Error message
Object "%s" is not a Harbormaster Buildable!
What it means
Thrown by 'bin/harbormaster update'. The supplied name resolved to a real object, but that object is not a HarbormasterBuildable (for example a Differential revision or a Maniphest task). Because update drives buildable state, it rejects objects of any other type immediately after the generic object query.
Source
Thrown at src/applications/harbormaster/management/HarbormasterManagementUpdateWorkflow.php:59
$names = $args->getArg('buildable');
if (count($names) != 1) {
throw new PhutilArgumentUsageException(
pht('Specify exactly one buildable, by object name.'));
}
$buildable = id(new PhabricatorObjectQuery())
->setViewer($viewer)
->withNames($names)
->executeOne();
if (!$buildable) {
throw new PhutilArgumentUsageException(
pht('No such buildable "%s"!', head($names)));
}
if (!($buildable instanceof HarbormasterBuildable)) {
throw new PhutilArgumentUsageException(
pht('Object "%s" is not a Harbormaster Buildable!', head($names)));
}
// Reload the buildable directly to get builds.
$buildable = id(new HarbormasterBuildableQuery())
->setViewer($viewer)
->withIDs(array($buildable->getID()))
->needBuilds(true)
->executeOne();
$builds = $buildable->getBuilds();
$builds = mpull($builds, null, 'getID');
$build_id = $args->getArg('build');
if ($build_id) {
$builds = array_select_keys($builds, array($build_id));
if (!$builds) {
throw new PhutilArgumentUsageException(View on GitHub (pinned to 5720a38cfe)
Solutions
- Pass the buildable monogram (B...) shown on the build page
- When scripting from a revision or commit, first resolve its buildables via harbormaster.buildable.search with objectPHIDs, then update those
Example fix
# before $ bin/harbormaster update D123 # after $ bin/harbormaster update B123
Defensive patterns
Strategy: type-guard
Validate before calling
$buildable = id(new PhabricatorObjectQuery())
->setViewer($viewer)
->withNames(array($name))
->executeOne();
if ($buildable && !($buildable instanceof HarbormasterBuildable)) {
// wrong object type; resolve the real buildable instead
} Type guard
function isHarbormasterBuildable($object) {
return ($object instanceof HarbormasterBuildable);
} Prevention
- Pass buildable monograms (B...), not revision/task monograms, to update
- In scripts, type-check resolved objects before forwarding them to the CLI
When it happens
Trigger: Running 'bin/harbormaster update D123' or 'bin/harbormaster update T123'; passing a PHID whose type is not PHID-HMBB-.
Common situations: Confusing the object being built (a commit/revision) with its buildable; scripts resolving names generically and forwarding them without a type check.
Related errors
- Object "%s" is not a HarbormasterBuildable (it is a "%s"). N
- Specify exactly one buildable, by object name.
- No such buildable "%s"!
- Object "%s" is not a buildable!
- Choose a build log to rebuild with "--id", or rebuild all lo
AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21).
Data as JSON: /api/errors/a74e31c1a081b56e.
Report an issue: GitHub.