On this page you learn which accounts the agents, release checks and canaries sign in with, who they are meant to belong to, how to prove each one is live, and the rules for adding or changing one.
Agents sign in to other services all day: GitHub, Stripe, QuickBooks, Microsoft, Seed, Neon and our own DevStride workspace. The accounts they use are the canary accounts. The aim is that each one belongs to DevStride rather than to an engineer, can be revoked on its own, and is proven live by a check anyone with access can repeat, so that nobody leaving the team breaks the fleet. A few still depend on one person; the table below marks them. How much access each key carries is a separate decision, described in Credentials and access.
The full inventory, with identifiers, owners and where each secret is stored, is in the repository at docs/canary-accounts.md. Whoever creates or changes a canary account updates that file in the same change. The expiry dates of the Microsoft credentials and the QuickBooks refresh tokens are in the repository's KEY_ROTATION.md.
Canary accounts are registered to a shared identity owned by DevStride, never to a person (owner decision, October 24, 2026). Its address is in the repository's inventory. Each service it signs up to has its own password, kept in the team's 1Password; ask an admin when you need one.
Every canary account and environment is named with the word Canary (for example DevStride Canary), so it reads as the framework's at a glance and never as a person's (owner decision, October 25, 2026). A few that predate the rule still carry their old names; the inventory lists them.
Status as of October 25, 2026. Person-owned means the account still depends on one person; replacing it is follow-up work, and those accounts come first when rotating.
| Account | What it is for | Proof that it is live | Status |
|---|---|---|---|
| GitHub token | gh, and the merge, review and deploy checks | ds agent check-gh | live; person-owned |
| DevStride API key | ds work, ds team, the agents' DevStride connection | ds machine ready --quick | live; person-owned |
| Stripe inventory key | the read-only billing inventory | ds -b stripe billing-inventory --out <dir> (a folder outside the repository) | live (proven on m3) |
| Seed token | a deliberate redeploy of a chosen commit (ds seed deploy) | ds machine ready --quick; Seed has no read-only call, so the next real redeploy proves it | live |
| Neon key | ds neon | ds neon projects list | live |
QuickBooks app DevStride Canary | reading DevStride's own books and a sandbox company | ds quickbooks --company sandbox company-info and ds quickbooks --company real company-info | live for both companies; its recovery phone is person-owned |
| Microsoft Graph agent app | directory reads (ds graph read-user) and rotating its own secret | ds graph read-user <user> | live |
| Teams canary reader | the hourly Teams canary confirms a notification arrived | ds graph teams-canary-reader-check | live |
| The canary Microsoft organization | every Microsoft and Teams test; the only test tenant | ds script teams-canary-status --stage prod --profile devstride-prod (production access) | live; its administrator, who is also the person the hourly Teams canary notifies, is person-owned |
| The canary organization in production | where the inbound email and Teams canaries act; its items are purged every 24 hours | the release's post-deploy health check | live |
The agents' DevStride Canary Chrome profile | the sites the agents reach only through a browser | an agent opens each site in the profile and none asks it to sign in | live on one agent machine, the others to follow; some of its sign-ins are person-owned until each site has a canary login |
Every proof prints nothing secret. Never "prove" the Graph app with ds graph rotate-secret: that replaces the live secret.
pbpaste | ds secrets set agent <KEY>, then clear the clipboard (pbcopy </dev/null) and run ds secrets pull on each machine (ds fleet status lists them). Never put a secret in the shared bundle, GitHub Actions, a chat, a comment, a screenshot or a file. A secret the deployed app also reads (the Teams canary reader's) additionally goes into that stage's settings store, as its setup command says.ds command wherever one exists, so a new machine, a rotation and a release check all use the same test.ds graph rotate-secret) and the Teams canary reader (ds graph teams-canary-reader-setup --rotate, then production's settings and a deploy, then --retire-old) have their own commands; both are listed in KEY_ROTATION.md.The agents hold one QuickBooks refresh token per company. Each lapses after 101 days without a run against that company, and about five years after its grant however often it is used. When ds quickbooks says Intuit no longer accepts a company's token:
ds secrets pull (another machine may already hold a newer token) and try again.docs/canary-accounts.md, "Granting QuickBooks again"). Never grant it with your own Intuit login.pbpaste | python3 -c 'import json,sys; print(json.load(sys.stdin)["refreshToken"], end="")' \
| ds secrets set agent QUICKBOOKS_AGENT_REAL_REFRESH_TOKEN # ..._SANDBOX_... for the sandbox
pbcopy </dev/null
ds secrets pull on each machine, then the proof for that company.Next: back to the Overview
For admins: access, keys and stages
What an admin does so a developer can set up their machine: grant and remove GitHub and AWS access with one command, add the team's Seed and Neon keys, and look after each machine's AWS stage.
How DevStride Is Built, and Why
The idea behind how DevStride is planned, built, reviewed and released — mostly by Claude Code agents walking a plan one item at a time — and why each rule exists. Read this before the mechanics.