phacility/phabricator · error · PhabricatorWorkerPermanentFailureException

No Asana provider configured.

Error message

No Asana provider configured.

What it means

DoorkeeperAsanaFeedWorker::getProvider() lazily resolves the configured Asana auth provider via PhabricatorAsanaAuthProvider::getAsanaProvider(). If no enabled Asana provider exists (typically because asana.application-id / application-private-key are unset or the provider is not configured in the Auth application), it throws PhabricatorWorkerPermanentFailureException and the story task is dropped without retry.

Solutions

  1. Configure the Asana auth provider: Auth application -> Add Provider -> Asana, with application ID and secret from Asana
  2. Ensure asana.application-id and application-private-key config are set to match the Asana developer app
  3. If Asana integration is not wanted, disable the Doorkeeper Asana feed worker / unsubscribe so stories stop failing
Defensive patterns

Strategy: validation

Validate before calling

if (!PhabricatorAsanaAuthProvider::getAsanaProvider()) {
  // Do not enqueue Asana feed work until a provider is configured.
  return;
}

Prevention

When it happens

Trigger: The Asana feed worker is active (subscribed/enabled) while the Phabricator instance has no Asana auth provider configured — `PhabricatorAsanaAuthProvider::getAsanaProvider()` returns null. Also fires if the provider was disabled after Asana edges/workers already exist.

Common situations: Enabling or leaving on the Asana integration in one config layer while the auth provider was never set up in the Auth application; disabling the provider during migration; fresh installs that import a config with asana.workspace-id set but no provider.

Related errors


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

Appendix: source

Thrown at src/applications/doorkeeper/worker/DoorkeeperAsanaFeedWorker.php:460

        'POST',
        array(
          'text' => $text,
        ));
    }
  }


/* -(  Internals  )---------------------------------------------------------- */

  private function getWorkspaceID() {
    return PhabricatorEnv::getEnvConfig('asana.workspace-id');
  }

  private function getProvider() {
    if (!$this->provider) {
      $provider = PhabricatorAsanaAuthProvider::getAsanaProvider();
      if (!$provider) {
        throw new PhabricatorWorkerPermanentFailureException(
          pht('No Asana provider configured.'));
      }
      $this->provider = $provider;
    }
    return $this->provider;
  }

  private function getAsanaTaskData($object) {
    $publisher = $this->getPublisher();

    $title = $publisher->getObjectTitle($object);
    $uri = $publisher->getObjectURI($object);
    $description = $publisher->getObjectDescription($object);
    $is_completed = $publisher->isObjectClosed($object);

    $notes = array(
      $description,
      $uri,

View on GitHub (pinned to 5720a38cfe)