configuration-strategy
Design environment configuration, secrets management, and feature-flag hierarchy for a service or feature. Triggers: config strategy, environment variables, .env, secrets management, feature flag, config hierarchy, config precedence, twelve-factor config, environment-specific settings.
- License 许可
- MIT
- 最近更新
- 2026-11-12
- Stars
- ★ 1
- Forks
- 1
01 前言 Front Matter
- name
- configuration-strategy
- description
- Design environment configuration, secrets management, and feature-flag hierarchy for a service or feature. Triggers: config strategy, environment variables, .env, secrets management, feature flag, config hierarchy, config precedence, twelve-factor config, environment-specific settings.
02 资源文件 2
- 参考文档evals/evals.json2.9 KB
- 参考文档references/config-patterns.md5.6 KB
03 SKILL.md 正文
Configuration Strategy
Design configuration that is safe, auditable, and easy to change. Most configuration problems (hardcoded secrets, production config in dev, feature flags with no off-switch) come from not designing the system upfront.
Step 0: Inventory What Already Exists
Before introducing a new environment variable, secret, feature flag, or constant, establish what the project already defines. Inspect the current state directly — grep the tree; don't infer it from the requirements or memory.
Cover both:
- Artifacts — existing key names and the values themselves. Search for the literal value, not just the name: the same timeout or limit is often already hardcoded in two places, and adding a third is the common failure.
- Written decisions — config conventions, naming schemes,
.env.example, and prior audit findings that already govern where things live.
Exit condition — one line, then keep going in the same response:
"<existing key> already carries <value>; it does / does not serve this
because <reason>."
This step is not a gate on delivering. Greenfield — nothing configured yet, or nothing you can reach — closes it in one line: say so and go straight to Step 1. When you can't inspect, name what you would check and continue under stated assumptions. Never answer with inventory and questions alone; produce the configuration design in the same reply.
This constrains the input, not the choice. A new key is a fine outcome; an unexamined one isn't — and a duplicated value will drift.
Step 1: Identify All Configuration Needed
List every piece of configuration the feature or service requires:
- Service endpoints: URLs for external APIs, internal services, databases
- Credentials and secrets: API keys, database passwords, signing keys, certificates
- Behavior toggles: Feature flags, A/B test parameters, rate limits, timeouts
- Static config: Timeouts, retry counts, pagination defaults, log levels
- Environment-specific values: Different database URLs for dev/staging/prod
Don't leave any implicit. "We'll hard-code the staging URL for now" is the start of a production incident.
Step 2: Classify Each Configuration Item
For each item, determine:
Sensitivity:
- Secret: Must never appear in logs, code, or non-encrypted storage (API keys, passwords, tokens)
- Sensitive: Not a secret but not public (internal service URLs, customer IDs)
- Non-sensitive: Safe to log, safe in version control (log levels, timeouts, feature flag names)
Mutability:
- Static: Set at deploy time, doesn't change without a redeploy (database schema version, service name)
- Runtime-mutable: Can change without redeploy (feature flags, rate limits, A/B test parameters)
Scope:
- Global: Same value in all environments (timeout constants, algorithm parameters)
- Environment-specific: Different per env (database URLs, API endpoints, log levels)
- Per-tenant/per-user: Different per customer (feature entitlements, custom limits)
Step 3: Design the Configuration Hierarchy
Based on classification, assign each item to the right storage:
| Storage | For | Examples |
|---|---|---|
| Environment variables | Environment-specific non-secrets | DATABASE_URL, SERVICE_ENV, LOG_LEVEL |
| Secrets manager | All secrets | Database passwords, API keys, signing keys |
| Feature flag service | Runtime-mutable toggles | Feature flags, A/B variants, rollout percentages |
| Config file in repo | Non-sensitive static config | Timeout constants, retry policies, allowed values |
| Database (config table) | Per-tenant/per-user config | Customer-specific rate limits, feature entitlements |
Hierarchy principle: More specific overrides less specific. Per-tenant overrides environment which overrides global default.
See references/config-patterns.md for feature flag design patterns and secrets management tool guidance.
Step 4: Plan Safe Config Rollout
Configuration changes can cause outages just like code changes. Plan rollout for each type:
Secrets rotation:
- Generate new secret while old one remains valid
- Deploy application with new secret
- Verify application uses new secret correctly
- Revoke old secret (after 24-hour overlap window)
Feature flag rollout:
- Start at 0% — verify flag infrastructure works
- Enable for internal users — catch obvious breakage
- Enable for small percentage (5-10%) — monitor metrics
- Ramp up gradually — verify metrics hold at each step
- Full rollout — verify, then clean up the flag
Environment variable changes:
- New variables: set in target environment before deploying code that reads them
- Changed values: consider backward compatibility with old code during rolling deploys
- Removed variables: remove from code before removing from environment config
Step 5: Audit Existing Code for Anti-patterns
Review the codebase for common configuration mistakes:
Hardcoded values to find and fix:
- IP addresses, hostnames, port numbers (search:
localhost,127.0.0.1, regex for IP patterns) - Credentials (search:
password,secret,api_key,tokenin string literals) - Environment-specific constants (search for strings that differ between environments)
- Magic numbers that should be configurable (search for hardcoded timeouts, limits, batch sizes)
Config anti-patterns:
- Feature flags that have been "on" everywhere for 6+ months (dead code risk — remove the flag)
- Config values read but never validated (add startup validation that fails fast on missing config)
- Different config loading paths for test vs production (leads to "works in tests but not prod")
- Secrets passed via command-line arguments (visible in process lists)
Principles Applied
- DRY: Single source of truth for each config value. If the same value appears in multiple places, it will drift.
- KISS: Flat config beats deeply nested config. Environment variables beat custom config DSLs.
- Least privilege: Services should only have access to the secrets they need. Database credentials shouldn't be shared across services.
- YAGNI: Don't create config variables for things that will never change. Hard-code what's truly constant.
- Fail fast: Validate all required config on startup. A crash at startup is better than a mysterious failure 10 minutes in.
Cross-Skill References
feature-planning— decide which behaviors will be feature-flagged during planning, before implementationsecurity-audit— review secrets handling and access control as part of security reviewdeployment-checklist— verify all config is set before deployingrollback-strategy— feature flags are the simplest rollback mechanism; design them accordingly
04 同仓库更多 Skills
writing-skills
Use when authoring, editing, or reviewing a skill in this library — a new SKILL.md, one that under-triggers, or hardening an existing one. Covers description and listing-budget rules, frontmatter, progressive disclosure, the 3-eval rule, and pressure-testing against rationalizations.
working-agreement
Define and validate how a multi-session project is run — where plans, status and decisions live, session routines, new work, milestone close. README/CONTRIBUTING → project-documentation.
verification-before-completion
Evidence gate before any claim that work is done, fixed, passing, or deployed. Route here when a message declares the work finished or asks to commit, push, merge, ship, or close it out, including a brief sign-off, and before git-workflow or release-management act on it. Writing the commit message or PR text itself → git-workflow.
ui-ux-design
Design user experiences from an engineer's perspective — user flows, wireframes, interaction patterns, responsive strategy, navigation, loading/error/empty states. Triggers: design the UI, user flow, wireframe, how should this screen look, loading state, error state, empty state, responsive design, navigation, page layout, form design, mockup.
threat-modeling
Design-time security analysis of a system or feature before it's built — trust boundaries, attack surface, STRIDE per element, abuse cases, prioritized mitigations that become security requirements. Triggers: threat model, STRIDE, trust boundary, attack surface, what could go wrong security-wise, security design review, abuse case, secure this design, security requirements. Reviewing EXISTING code/config for vulnerabilities → security-audit; use this skill while the design is still on the whiteboard.
test-suite-design
Design comprehensive test suites for existing code — strategy across unit/integration/e2e, fixtures, factories, helpers. Triggers: add tests, write tests for, increase coverage, test this module, testing strategy, test plan, what tests do I need, test infrastructure, test helpers, this has no tests. Not for TDD — use tdd-workflow.