{"record":{"id":"00108f8ddb612fa8","repo":"phacility/phabricator","slug":"no-implementation-is-specified","errorCode":null,"errorMessage":"No implementation is specified!","messagePattern":"No implementation is specified!","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php","lineNumber":38,"sourceCode":"  public static function getImplementations() {\n    return id(new PhutilClassMapQuery())\n      ->setAncestorClass(__CLASS__)\n      ->execute();\n  }\n\n  public static function getImplementation($class) {\n    $base = idx(self::getImplementations(), $class);\n\n    if ($base) {\n      return (clone $base);\n    }\n\n    return null;\n  }\n\n  public static function requireImplementation($class) {\n    if (!$class) {\n      throw new Exception(pht('No implementation is specified!'));\n    }\n\n    $implementation = self::getImplementation($class);\n    if (!$implementation) {\n      throw new Exception(pht('No such implementation \"%s\" exists!', $class));\n    }\n\n    return $implementation;\n  }\n\n  /**\n   * The name of the implementation.\n   */\n  abstract public function getName();\n\n  public function getBuildStepGroupKey() {\n    return HarbormasterOtherBuildStepGroup::GROUPKEY;\n  }","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php#L20-L56","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Set a valid implementation class on the step before calling requireImplementation (e.g. HarbormasterWaitForBuildStepImplementation)","Inspect harbormaster_buildstep rows for empty className values and fix or delete them","When generating steps in code, always pass the full class name constant from the plan definition"],"exampleFix":"// before\n$impl = HarbormasterBuildStepImplementation::requireImplementation($step->getClassName()); // className is ''\n// after\n$step->setClassName('HarbormasterWaitForBuildStepImplementation')->save();\n$impl = HarbormasterBuildStepImplementation::requireImplementation($step->getClassName());","handlingStrategy":"validation","validationCode":"$class = $step->getClassName();\nif ($class === null || $class === '') {\n  // refuse before requireImplementation; fix or drop the step row\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set the implementation class when creating build steps","Audit imported build plans for empty className values before enabling them"],"tags":["harbormaster","phabricator","build-step","empty-class","configuration"],"backgroundTag":"missing-class-name","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}