secrets-rotation — Claude Code skill: what it does, how to install
Turns exposed tokens, passwords, or keys into an urgent tracked task to revoke and reissue them. Runs when credentials leak into chat, logs, or commits.
npx skills add avelikiy/great_cto --skill secrets-rotation -a claude-codeWhat secrets-rotation does
Rewriting git history cannot fix an exposure. Transcripts and remote backups already stored the value. The skill treats any exposed secret as spent. It strictly forbids repeating the plain secret in prompt replies, commit notes, or ticket titles.
The workflow logs a bug task with priority 0 or 1, using Beads via bd create. It names only the secret category and location. The agent handles the change directly or writes exact console steps for the operator. That failure provides the required proof: a call with the retired credential must return a 401 or 403 error.
The skill relies on Read, Bash, and Grep. Saving the replacement key into CLAUDE.md will leak it right back into the model context.
What it helps with
- turn an exposed secret into a tracked revocation task
- log credential leaks without repeating the secret value
- verify token retirement through 401 or 403 provider responses
- escalate open secret rotation tasks older than 48 hours
Example prompts for the agent
- I accidentally pasted an API key into our chat, rotate it
- Gitleaks flagged a credential in the latest commit, handle the rotation
- The operator committed a .env file with secrets, start the incident steps
How to install secrets-rotation
1Skills CLI (Vercel)
npx skills add avelikiy/great_cto --skill secrets-rotation -a claude-code2Manually: put the files in place
~/.claude/skills/secrets-rotation/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/secrets-rotation/
1Skills CLI (Vercel)
npx skills add avelikiy/great_cto --skill secrets-rotation -a codex2Manually: put the files in place
.agents/skills/secrets-rotation/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add avelikiy/great_cto --skill secrets-rotation -a cursor2Manually: put the files in place
.cursor/skills/secrets-rotation/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install avelikiy/great_cto secrets-rotation2Manually: put the files in place
.github/skills/secrets-rotation/SKILL.md1Skills CLI (Vercel)
npx skills add avelikiy/great_cto --skill secrets-rotation -a gemini-cli2Platform CLI
gemini skills install https://github.com/avelikiy/great_cto --path skills/secrets-rotationManually: put the files in place
.devin/skills/secrets-rotation/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add avelikiy/great_cto --skill secrets-rotation -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about secrets-rotation
How to install secrets-rotation in Claude Code?
Run npx skills add avelikiy/great_cto --skill secrets-rotation -a claude-code. The file will be placed at ~/.claude/skills/secrets-rotation/SKILL.md.
What does the secrets-rotation skill do?
It directs the AI agent when a password, key, or token leaks. Instead of repeating reminders across sessions, it creates a priority bug ticket, forces key revocation, and demands evidence that the old credential is fully rejected.
When is a secret rotation task considered finished?
A rotation is complete only after direct verification. The new token must sit in the secret store, all consumers must be updated, and a request using the old credential must return an HTTP 401 or 403.
Source text
SKILL.md · MIT
---
name: secrets-rotation
description: What to do the moment a secret is exposed — pasted into chat, committed, logged, shown in a transcript or a screenshot. The secret is compromised; only revoking and rotating it helps. Turns it into one tracked task with an escalation, not a reminder repeated every session. Use when you see a key, token, password or private key anywhere it should not be ("ключ в чате", "токен в логах", "закоммитил .env"). Loaded by security-officer, l3-support, devops.
when_to_use: |
Apply when:
- a key, token, password or private key appears in a message, a commit, a log, a transcript, a screenshot or a context file
- the operator pastes a credential into the conversation
- a secret scanner (scripts/hooks/secret-scan.mjs, gitleaks) reports a finding
- a session log carries "rotate the X key" forward from an earlier session
Do NOT apply to:
- test fixtures that are assembled at runtime and match no live account
effort: low
allowed-tools: Read, Bash, Grep
---
# secrets-rotation — an exposed secret is spent
Deleting the message, rewriting git history or redacting the log does not un-expose a
secret: the transcript, the remote, the backup and the provider's own logs already hold
it. The only fix is to make the exposed value worthless — **revoke it and issue a new one**.
What went wrong on real projects is not ignorance of that. It is that the rotation was
**remembered instead of tracked**: "rotate the exchange API keys" was carried forward
through seven session logs; "keys that passed through chat" appeared in seven summaries
of another project; a monitoring token pasted in plain text was never rotated. Each
session wrote the reminder again and nobody owned it.
## The moment you see one
1. **Never repeat the value.** Not in your answer, not in a task title, not in a log, not
in a commit message. Name its **kind** and **where it is**: "OpenRouter API key, in the
operator's message of 22.09, 14:10". `scripts/lib/secret-patterns.mjs` names the kind.
2. **Say it plainly, first line:** this key is compromised; revoking it is the only fix.
3. **Open one task, not a note** — in Beads if the project has it:
```bash
bd create "Rotate <kind> exposed in <where> on <date>" -t bug -p 0 \
-d "Exposed: <where>. Revoke at <provider console>, issue new, store in <secret store>, redeploy <consumers>, prove the old one is rejected."
```
Priority 0 for a production credential or anything that moves money; 1 otherwise.
4. **If you can rotate it, rotate it** — the operator asked you to handle it, or your
task covers that system. If it needs the operator (a provider console you cannot
reach, a hardware token), the task's first line says exactly what they must click.
## Done means the old value is refused
A rotation is closed with evidence, not with "rotated":
- the new value is in the secret store the code reads — never in `CLAUDE.md`,
`preferences.md`, memory files, a README or any file that is loaded into a model's
context (one key in a preferences file reached 605 transcripts);
- every consumer was redeployed and uses it (`deploy-landed`, config check);
- **a call with the old value fails** — 401/403 from the provider. That is the proof.
## Carrying it forward
An open rotation task older than 48 hours goes to the top of the next session's report
and of `/inbox`, with its age. Do not re-list it in the session log as a fresh item —
link the task. Re-writing a reminder is how the seven-session carry-over happened.
© avelikiy · MIT · avelikiy/great_cto