Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Never read .env files or write secrets to .squad/ committed files
.claude/skills/fritzandfriends-secret-handling/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 141% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 106% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 190% | 0% |
Spawned agents have read access to the entire repository, including .env files containing live credentials. If an agent reads secrets and writes them to .squad/ files (decisions, logs, history), Scribe auto-commits them to git, exposing them in remote history. This skill codifies absolute prohibitions and safe alternatives.
NEVER read these files:
.env (production secrets).env.local (local dev secrets).env.production (production environment).env.development (development environment).env.staging (staging environment).env.test (test environment with real credentials).env.* UNLESS explicitly allowed (see below)Allowed alternatives:
.env.example (safe — contains placeholder values, no real secrets).env.sample (safe — documentation template).env.template (safe — schema/structure reference)If you need config info:
.env.example — shows structure without exposing secretsREADME.md, docs/, config guidesNEVER assume you can "just peek at .env to understand the schema." Use .env.example or ask.
NEVER write these to .squad/ files:
| Pattern Type | Examples | Regex Pattern (for scanning) | |--------------|----------|-------------------------------| | API Keys | OPENAI_API_KEY=sk-proj-..., GITHUB_TOKEN=ghp_... | [A-Z_]+(?:KEY|TOKEN|SECRET)=[^\s]+ | | Passwords | DB_PASSWORD=super_secret_123, password: "..." | (?:PASSWORD|PASS|PWD)[:=]\s*["']?[^\s"']+ | | Connection Strings | postgres://user:pass@host:5432/db, Server=...;Password=... | (?:postgres|mysql|mongodb)://[^@]+@|(?:Server|Host)=.*(?:Password|Pwd)= | | JWT Tokens | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... | eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+ | | Private Keys | -----BEGIN PRIVATE KEY-----, -----BEGIN RSA PRIVATE KEY----- | -----BEGIN [A-Z ]+PRIVATE KEY----- | | AWS Credentials | AKIA..., aws_secret_access_key=... | AKIA[0-9A-Z]{16}|aws_secret_access_key=[^\s]+ | | Email Addresses | user@example.com (PII violation per team decision) | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} |
What to write instead:
DATABASE_URL=<set in .env>API key configured (see .env.example)Before committing .squad/ changes, Scribe MUST:
.env even if manually staged)git reset HEAD <file> 🚨 SECRET DETECTED — commit blocked
File: .squad/decisions/inbox/river-db-config.md Pattern: DATABASE_URL=postgres://user:password@localhost:5432/prod
This file contains credentials and MUST NOT be committed. Please remove the secret, replace with placeholder, and try again.
Implementation note for Scribe:
git commitSelect-String or git diff --cached to scan staged contentIf you discover a secret in git history:
🚨 CREDENTIAL LEAK DETECTED
A secret was found in git history: Commit: abc1234 File: .squad/decisions/inbox/agent-config.md Pattern: API_KEY=sk-proj-...
This requires immediate remediation:
Do NOT proceed with new work until this is resolved.
Agent needs to know what environment variables are required:
Agent: "What environment variables does this app need?"
→ Reads `.env.example`:
OPENAI_API_KEY=sk-...
DATABASE_URL=postgres://user:pass@localhost:5432/db
REDIS_URL=redis://localhost:6379
→ Writes to .squad/decisions/inbox/river-env-setup.md:
"App requires three environment variables:
- OPENAI_API_KEY (OpenAI API key, format: sk-...)
- DATABASE_URL (Postgres connection string)
- REDIS_URL (Redis connection string)
See .env.example for full schema."Agent needs to know database schema:
Agent: (reads .env)
DATABASE_URL=postgres://admin:super_secret_pw@prod.example.com:5432/appdb
→ Writes to .squad/decisions/inbox/river-db-schema.md:
"Database connection: postgres://admin:super_secret_pw@prod.example.com:5432/appdb"
🚨 VIOLATION: Live credential written to committed fileCorrect approach:
Agent: (reads .env.example OR asks user)
User: "It's a Postgres database, schema is in migrations/"
→ Writes to .squad/decisions/inbox/river-db-schema.md:
"Database: Postgres (connection configured in .env). Schema defined in db/migrations/."Scribe is about to commit:
powershell# Stage files git add .squad/ # Scan staged content for secrets $stagedContent = git diff --cached $secretPatterns = @( '[A-Z_]+(?:KEY|TOKEN|SECRET)=[^\s]+', '(?:PASSWORD|PASS|PWD)[:=]\s*["'']?[^\s"'']+', 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' ) $detected = $false foreach ($pattern in $secretPatterns) { if ($stagedContent -match $pattern) { $detected = $true Write-Host "🚨 SECRET DETECTED: $($matches[0])" break } } if ($detected) { # Remove from staging, report, exit git reset HEAD .squad/ Write-Error "Commit blocked — secret detected in staged files" exit 1 } # Safe to commit git commit -F $msgFile
.env "just to check the schema" — use .env.example instead.squad/ — Scribe commits ALL .squad/ changesOther measured skills in the registry, with their headline benchmark lift.