{"record":{"id":"93bf985ad2e49425","repo":"phacility/phabricator","slug":"no-such-implementation-s-exists","errorCode":null,"errorMessage":"No such implementation \"%s\" exists!","messagePattern":"No such implementation \"(.+?)\" exists!","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php","lineNumber":43,"sourceCode":"\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  }\n\n  /**\n   * The generic description of the implementation.\n   */\n  public function getGenericDescription() {","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php#L25-L61","documentation":"HarbormasterBuildStepImplementation::requireImplementation($class) found no registered implementation matching the given class name. Implementations are concrete subclasses discovered by Phabricator's class discovery; an unknown name means the class does not exist, is abstract or not a subclass, or was never loaded in this process.","triggerScenarios":"Calling requireImplementation('MyOldStep') after the class was renamed or deleted in a deploy; a typo in the class name; the class exists but is abstract or sits in a module excluded from discovery.","commonSituations":"Custom step implementations removed in a code update while harbormaster_buildstep rows still reference them; stale class caches after deploying new step classes; copying plans between instances that lack the custom step code.","solutions":["Verify the class exists, is concrete, and extends HarbormasterBuildStepImplementation (or a descendant)","Fix stale harbormaster_buildstep rows: update className to the renamed class or delete orphaned steps","Clear Phabricator's class discovery cache after deploying or removing step classes"],"exampleFix":"// before\n$impl = HarbormasterBuildStepImplementation::requireImplementation('MyCompany_OldStepName');\n// after\n$impl = HarbormasterBuildStepImplementation::requireImplementation('MyCompany_NewStepName');","handlingStrategy":"validation","validationCode":"$impl = HarbormasterBuildStepImplementation::getImplementation($class);\nif ($impl === null) {\n  // class not registered; fix the step row or clear the class cache\n}","typeGuard":"$impl = HarbormasterBuildStepImplementation::getImplementation($class);\n$isValid = ($impl instanceof HarbormasterBuildStepImplementation);","tryCatchPattern":null,"preventionTips":["Prefer getImplementation() plus a null check over requireImplementation() in code that can recover","When renaming or deleting step classes, migrate or remove dependent harbormaster_buildstep rows in the same change","Clear class discovery caches after deploying step implementation changes"],"tags":["harbormaster","phabricator","build-step","class-not-found","configuration"],"backgroundTag":"class-not-found","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}