con un clic
secret-handling
Never read .env files or write secrets to .squad/ committed files
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Never read .env files or write secrets to .squad/ committed files
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
Guide the coding agent with this feature's chosen implementation-craft rules WHILE it writes code. Use during implement: before and while writing source, and RE-INVOKE per task / file type. It resolves the active feature, reads the per-feature implementation-rules.yml manifest + the canonical code-rules.yml catalog (+ any code-rules.local.yml overlay), and composes a BASELINE (always-on craft defaults) + the feature's OVERLAY (selected decision-prompt rules + decisions + custom rules + dependency policy), surfaced task-scoped (service / client / concurrency / API) so the code reflects the agreed posture. Triggers: implement, writing code, code rules, code quality, DI, naming, error handling, dependency, add a package, refactor, concurrency, API design, before I write the implementation.
Perform a Specrew human-verdict boundary stop on the Claude host. Renders the FULL Rule 46 six-section human re-entry packet AND the verdict options as one Markdown message, with the AskUserQuestion picker disabled so the packet cannot collapse into the picker's short header/option fields. Invoke at EVERY human-judgment boundary stop (specify, clarify, plan, tasks, before-implement, implement, review, retro, feature-closeout, lifecycle-end). Triggers: boundary stop, verdict, approve / redirect / send back, why I stopped, human re-entry packet, gate stop.
How to write comprehensive architectural proposals that drive alignment before code is written
How to coordinate with squads on different machines using git as transport
Team initialization flow (Phase 1 proposal + Phase 2 creation)
Step-by-step release checklist for Squad — prevents v0.8.22-style disasters
| name | secret-handling |
| description | Never read .env files or write secrets to .squad/ committed files |
| domain | security, file-operations, team-collaboration |
| confidence | high |
| source | earned (issue |
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 |
| Passwords | DB_PASSWORD=super_secret_123, password: "..." | `[?:PASSWORD |
| Connection Strings | postgres://user:pass@host:5432/db, Server=...;Password=... | `(?:postgres |
| 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} |
| 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:
Scan all staged files for secret patterns (use regex table above)
Check for prohibited file names (don't commit .env even if manually staged)
If secrets detected:
STOP the commit (do NOT proceed)
Remove the file from staging: git reset HEAD <file>
Report to user:
🚨 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.
Exit with error (never silently skip)
If no secrets detected:
Implementation note for Scribe:
git commitSelect-String or git diff --cached to scan staged contentIf you discover a secret in git history:
STOP immediately — do not make more commits
Alert the user:
🚨 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:
1. Revoke the exposed credential (regenerate API key, rotate password)
2. Remove from git history (git filter-repo or BFG)
3. Force-push the cleaned history
Do NOT proceed with new work until this is resolved.
Do NOT attempt to fix it yourself — secret removal requires specialized tools
Wait for user confirmation before resuming work
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 file
Correct 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:
# 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/ changes