rotate-cli docs

Commands

who (alias: preview-ownership)

For each selected secret, decide: mine, someone else's, or unknown. Hits only read-only endpoints. Never mutates anything.

Why this exists

In a shared Vercel team, a CLERK_SECRET_KEY in project-x might belong to Cueva's Clerk account, not yours. Rotating it with your PLAPI key would fail, or worse, succeed against a Clerk instance you don't own and charge you for billing. who catches that before rotation.

Usage

$ rotate-cli who [selector...] [flags]

Selecting secrets

FlagMeaning
--from-scanUse cached rotate-cli scan output (recommended).
--provider <name>Filter by adapter (e.g. clerk).
--tag <name>Filter by tag (e.g. non-sensitive from scan).
--scan-max-age 15mRe-scan if cache older than this.
--freshIgnore cache, force a fresh scan.

Verdicts

VerdictGlyphWhat it means
self ✓ Evidence the secret belongs to the authenticated admin. Safe to rotate.
other ✗ Evidence it belongs to another account. Rotating would fail or charge the wrong person.
unknown ? Adapter couldn't decide. Usually provider API limitation or missing sibling hint.
no-check ○ Adapter has no ownership detection (e.g. local-random, you generated it).

Ownership strategies

Different adapters use different strategies. All read-only, all documented in the evidence string on each check.

StrategyExample
format-decode Clerk pk_live_... base64-decodes to a FAPI host; match against your Clerk instances.
api-introspection OpenAI /v1/me returns the org id the key authenticates to.
list-match Neon /projects enumerates your projects; decoded endpoint ids must be in the list.
sibling-inheritance Clerk CLERK_WEBHOOK_SECRET has no owner info; inherits from CLERK_SECRET_KEY in the same project.

Output

$ rotate-cli who --from-scan --tag non-sensitive

Preloading ownership indexes...
  ✓ clerk             · 865ms
  ✓ upstash           · 1.2s
  ✓ neon-connection   · 3.0s
  ✓ vercel-siblings   · 98/126 projects decrypted · 14.3s

Checking 451 secret(s)...

  ✓ clerk-elements-CLERK_SECRET_KEY      self      [clerk] decoded FAPI host matches known host
  ✗ upstash-onpe-bot-UPSTASH_REDIS_REST_URL other  [upstash] endpoint not in admin's index
  ? openai-semantik-OPENAI_API_KEY       unknown   [openai] /v1/me no org info

Summary: 77 self (58 unique), 280 other (145 unique), 69 unknown, 22 no-check

The (N unique) tells you how many actual rotations apply will do, duplicate values across projects get deduped (see apply).

JSON envelope

{
  "command": "preview-ownership",
  "data": {
    "checks": [{
      "secret_id": "clerk-elements-CLERK_SECRET_KEY",
      "verdict": "self",
      "confidence": "high",
      "strategy": "format-decode",
      "value_hash": "a1b2c3d4e5f6",
      "evidence": "decoded FAPI host matches..."
    }],
    "summary": { "self": 77, "other": 280, ... },
    "unique_counts": { "self": 58, "other": 145 }
  }
}