{"record":{"id":"e2cec6b4468332b8","repo":"phacility/phabricator","slug":"associated-hook-s-for-webhook-request-s","errorCode":null,"errorMessage":"Associated hook (\"%s\") for webhook request (\"%s\") is disabled.","messagePattern":"Associated hook \\(\"(.+?)\"\\) for webhook request \\(\"(.+?)\"\\) is disabled\\.","errorType":"exception","errorClass":"PhabricatorWorkerPermanentFailureException","httpStatus":null,"severity":"error","filePath":"src/applications/herald/worker/HeraldWebhookWorker.php","lineNumber":52,"sourceCode":"\n    // If we're in silent mode, permanently fail the webhook request and then\n    // return to complete this task.\n    if (PhabricatorEnv::getEnvConfig('phabricator.silent')) {\n      $this->failRequest(\n        $request,\n        HeraldWebhookRequest::ERRORTYPE_HOOK,\n        HeraldWebhookRequest::ERROR_SILENT);\n      return;\n    }\n\n    $hook = $request->getWebhook();\n\n    if ($hook->isDisabled()) {\n      $this->failRequest(\n        $request,\n        HeraldWebhookRequest::ERRORTYPE_HOOK,\n        HeraldWebhookRequest::ERROR_DISABLED);\n      throw new PhabricatorWorkerPermanentFailureException(\n        pht(\n          'Associated hook (\"%s\") for webhook request (\"%s\") is disabled.',\n          $hook->getPHID(),\n          $request_phid));\n    }\n\n    $uri = $hook->getWebhookURI();\n    try {\n      PhabricatorEnv::requireValidRemoteURIForFetch(\n        $uri,\n        array(\n          'http',\n          'https',\n        ));\n    } catch (Exception $ex) {\n      $this->failRequest(\n        $request,\n        HeraldWebhookRequest::ERRORTYPE_HOOK,","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/herald/worker/HeraldWebhookWorker.php#L34-L70","documentation":"Before making the HTTP call, the worker checks the hook with isDisabled(); a disabled hook causes the request to be marked failed with ERRORTYPE_HOOK / ERROR_DISABLED and the task to permanently fail. Hooks are disabled manually from the Webhooks UI or automatically after too many consecutive failures, so no further calls are made.","triggerScenarios":"A webhook request was queued while the hook was enabled, then the hook was disabled before the task ran; the hook was auto-disabled by the failure threshold with old queued tasks still pending.","commonSituations":"Hook auto-disabled during a receiver outage while a queue backlog existed; an admin disabling a noisy hook without draining its queue.","solutions":["Re-enable the hook from the Webhooks console (/webhook/), then fire a fresh test with './bin/herald call-webhook --id <hook> --object <object>'.","Check the hook's error log to see why it was disabled (usually repeated failures) and fix the endpoint first.","If the hook should stay disabled, acknowledge the permanent failures -- no delivery is intended."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before queueing or firing, check the hook state:\nif ($hook->isDisabled()) {\n  throw new RuntimeException(\n    'Webhook '.$hook->getID().' is disabled; enable it in /webhook/ first.');\n}","typeGuard":"function heraldWebhookIsCallable(HeraldWebhook $hook) {\n  return !$hook->isDisabled();\n}","tryCatchPattern":null,"preventionTips":["Surface hook disabled-state in the admin UI next to delivery buttons so operators enable before firing.","Watch for auto-disable after failure storms; fix receiver reliability before re-enabling."],"tags":["herald","webhook","phabricator","worker","disabled-resource"],"backgroundTag":"resource-disabled","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}