Connection status or expiry shows Unknown
Why the Integration page sometimes shows 'Unknown' for connection status or PAT expiry, and how to resolve it.
Last updated
Your Settings → Integration page shows Connection Status: Unknown or Expires: Unknown instead of a green check and a date. Connection Status: Unknown means no health result has been recorded yet — ADO Pilot writes this record during onboarding, PAT rotation, authentication events, and an hourly background check, so it usually clears on its own. Expires: Unknown is different: ADO Pilot doesn't currently record PAT expiration for any account. Neither is a sign that something is broken, and reviews are typically still running.
Symptom
Where you see it
- The Integration page shows the Unknown state in either the Connection Status or Expires field, often with a grey neutral indicator instead of green or red.
- No banner appears in the dashboard and no PRs are blocked.
What is not broken
Reviews keep firing on PRs while the page shows Unknown — the backend uses the stored credential directly and does not depend on the dashboard status display. If actual reviews stop, that is a different problem (see Webhook 401s and reviews stopped firing).
Why it happens
The Integration page reads connection state from a cached record that ADO Pilot's backend writes during provisioning, PAT rotation, authentication events, and an hourly background connectivity probe. Unknown means the cached record has not been written yet — not that a live API call failed.
Status record not yet written
When Connection Status shows Unknown, it means no connection-health record exists for your account yet. This is typical for accounts that were migrated or created before connection-health tracking was introduced. The status is stored in the backend and displayed from a cached record; it is not fetched live from Azure DevOps on every page load. Reloading the page will not clear this state, but an hourly background probe checks connectivity automatically — if your organization already finished provisioning its Azure DevOps subscriptions, Unknown typically clears to Healthy within about an hour on its own. To get a result immediately, rotate the PAT instead of waiting.
PAT expiry was never recorded
The Expires field shows Unknown when ADO Pilot has no record of when your PAT expires. Fetching expiry metadata requires an additional Azure DevOps token scope that ADO Pilot does not currently request, so this field is never populated for any account — including after you rotate your PAT. See below for how to track your PAT's expiration yourself.
Disconnected status after an auth failure
If reviews have stopped and you see Disconnected (not Unknown) on the Connection Status badge, an authentication failure was logged. See Webhook 401s and reviews stopped firing for that scenario. Unknown specifically means no probe result has been recorded yet.
Degraded status after a failed background probe
Connection Status can also show a yellow Degraded badge. This means the hourly background probe failed once; it's usually transient, and the next successful probe restores Healthy automatically with no action from you. If Degraded persists across multiple probes, it escalates to Disconnected and reviews may be affected — see Webhook 401s and reviews stopped firing.
How to fix it
Rotate your PAT to record a fresh status
If Connection Status shows Unknown, the fastest way to clear it is to rotate your PAT via the Rotate PAT button on the Integration page. Rotating records a fresh health check and updates the status immediately. See Rotating your PAT for the full procedure.
You can also just wait: an hourly background probe checks connectivity on its own and typically clears Unknown to Healthy within about an hour, as long as your organization's Azure DevOps subscriptions finished provisioning. The status is also updated automatically if an authentication failure is recorded during a review run, which would flip it to Disconnected rather than clearing Unknown.
Expires shows Unknown for every account
ADO Pilot does not currently record PAT expiration dates — reading that metadata requires an additional Azure DevOps token scope that isn't part of the standard required scopes, and no part of the product, including PAT rotation, requests or stores it. Rotating your PAT will not change what Expires shows. Track your PAT's expiration date directly in Azure DevOps under User Settings → Personal access tokens, and use that date for your own rotation reminders.
If Connection Status stays Unknown and reviews have stopped
Unknown alone does not stop reviews — the backend uses the stored PAT directly, independently of the dashboard status. If reviews have also stopped, that is a separate issue: check Webhook 401s and reviews stopped firing.
To investigate the webhook path directly, use the Service Hooks card on the same Integration page:
- Check now reads the live status of each Azure DevOps subscription (active, probation, disabled, or missing). This is independent of the Connection Status badge above it — it queries the subscriptions, not the PAT health record.
- Resync re-creates any broken subscriptions without changing your PAT.
- Test connection fires a synthetic event through the full webhook path. Azure DevOps accepts it for asynchronous delivery and reports the event as accepted — then click Check now a moment later to confirm it arrived.
How to prevent it
- Rotate PATs proactively. Set a calendar reminder for 7 days before your PAT expires, using the expiration date from Azure DevOps (User Settings → Personal access tokens) — the Integration page's Expires field doesn't show this date today.
- Pick a 90-day PAT TTL. Longer-lived PATs accumulate more failure modes (revocation by ADO admins, account changes, password resets). 90 days is the sweet spot between rotation toil and exposure.
- Watch the Integration page after major Azure DevOps changes. Tenant-wide policy changes, Conditional Access rollouts, and ADO admin transitions all show up here first.