Date: 2026-07-20 Status: Accepted Target: v0.30.0
Auth is passkey-only. Handler.Middleware in server/auth/auth.go gates the API on the qntx_session cookie, which is HttpOnly and lives in an in-memory sync.Map. Scripts, plugins, and CI cannot authenticate.
Add a second auth path: access tokens, presented as Authorization: Bearer <token>.
access_tokens table (db/sqlite/migrations/); on parquet as one object per token under <location>/access_tokens/, matching the "small config" shape in ADR-024. Only the SHA-256 hash is stored.qntx_-prefixed. Shown once at creation./auth/tokens (POST create / GET list / DELETE revoke / POST enable). Bearer tokens cannot mint new tokens.Handler.Middleware gains a bearer-header path before the cookie check. Same trust envelope as a passkey session — no scoping in v1.<location>/access_tokens/ — not the SQLite scratch.