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.

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)

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.