phacility/phabricator · error · Exception

No implementation is specified!

Error message

No implementation is specified!

What it means

HarbormasterBuildStepImplementation::requireImplementation($class) resolves a build step implementation by class name from the set discovered by getImplementations(). An empty or null class string means no implementation was ever recorded, which is always a configuration or programming defect, so it throws immediately rather than attempting lookup.

Source

Thrown at src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php:38

  public static function getImplementations() {
    return id(new PhutilClassMapQuery())
      ->setAncestorClass(__CLASS__)
      ->execute();
  }

  public static function getImplementation($class) {
    $base = idx(self::getImplementations(), $class);

    if ($base) {
      return (clone $base);
    }

    return null;
  }

  public static function requireImplementation($class) {
    if (!$class) {
      throw new Exception(pht('No implementation is specified!'));
    }

    $implementation = self::getImplementation($class);
    if (!$implementation) {
      throw new Exception(pht('No such implementation "%s" exists!', $class));
    }

    return $implementation;
  }

  /**
   * The name of the implementation.
   */
  abstract public function getName();

  public function getBuildStepGroupKey() {
    return HarbormasterOtherBuildStepGroup::GROUPKEY;
  }

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Set a valid implementation class on the step before calling requireImplementation (e.g. HarbormasterWaitForBuildStepImplementation)
  2. Inspect harbormaster_buildstep rows for empty className values and fix or delete them
  3. When generating steps in code, always pass the full class name constant from the plan definition

Example fix

// before
$impl = HarbormasterBuildStepImplementation::requireImplementation($step->getClassName()); // className is ''
// after
$step->setClassName('HarbormasterWaitForBuildStepImplementation')->save();
$impl = HarbormasterBuildStepImplementation::requireImplementation($step->getClassName());
Defensive patterns

Strategy: validation

Validate before calling

$class = $step->getClassName();
if ($class === null || $class === '') {
  // refuse before requireImplementation; fix or drop the step row
}

Prevention

When it happens

Trigger: Calling requireImplementation('') or requireImplementation(null); a HarbormasterBuildStep row whose className column is empty (corrupt import, bad migration, or a step created programmatically without a class).

Common situations: Creating build steps via code or Lisk directly without setting the class name; a database imported with blank className values; data truncated during an upgrade.

Related errors


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