Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when choosing the names for an application's environment variables: enforce UPPER_SNAKE_CASE identifiers that start with a letter, namespace every variable under an app or component prefix instead of a bare generic name, and distinguish related values by a descriptive prefix rather than a numbered suffix — which cheaper models do not apply by default. Do NOT use for deciding whether config belongs in environment variables versus files, for reading or validating env vars at runtime, or for renaming ordinary code variables.
.claude/skills/env-var-naming/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 1 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +27% | +71% | 0% | 22 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
Enforces the standard identifier form for environment variables: UPPER_SNAKE_CASE names that start with a letter, are namespaced under an owning app or component prefix, and tell related values apart by a descriptive prefix rather than a numbered suffix. Apply when choosing what to call an app's configuration variables — not when deciding whether a value belongs in an env var at all, and not when reading or validating one at runtime.
underscore. No lowercase, no camelCase, no PascalCase, no hyphens: DATABASE_HOST, never dbHost or database-host.
only letters, digits, and underscores — no hyphens, dots, spaces, or other punctuation. A value whose natural name would start with a digit spells that digit out instead: a "7-zip" binary path becomes SEVENZIP_PATH, never 7ZIP_PATH, because a leading digit is not a portable identifier.
it. Bare, generic names — HOST, PORT, URL, KEY, SECRET, TOKEN, TIMEOUT, DEBUG — collide the instant a second subsystem needs the same word. Write POSTMARK_API_TOKEN, never TOKEN; SEARCH_CLUSTER_HOST, never HOST. The owning prefix comes first, then the specific detail.
with a descriptive segment, never a counter. CACHE_SESSION_URL / CACHE_RATELIMIT_URL, never CACHE_1_URL / CACHE_2_URL; MAIL_PRIMARY_HOST / MAIL_BACKUP_HOST, never MAIL_HOST_1. A number tells the reader nothing about which one is which.
_ENABLED (or _REQUIRED)suffix, and give it one consistent literal value across the entire app: pick true/false (or 1/0) and never mix yes, on, True, and 1 for flags of the same kind. Write FEATURE_BETA_ENABLED=true, never a bare BETA=yes sitting next to a DEBUG=on.
Each shows the base's wrong default → the conforming name.
BEFORE redis.url = ... (dotted, lowercase)
mailChimpApiKey = ... (camelCase)
AFTER REDIS_URL = ...
MAILCHIMP_API_KEY = ...Rule 1–2: uppercase, underscores, no dots or mixed case.
BEFORE KEY = ... (bare, collides)
HOST = ...
AFTER POSTMARK_API_TOKEN = ...
SEARCH_CLUSTER_HOST = ...Rule 3: each name namespaced under the component that owns it, no bare generics.
BEFORE CACHE_1_URL = ... (numbered)
CACHE_2_URL = ...
AFTER CACHE_SESSION_URL = ...
CACHE_RATELIMIT_URL = ...Rule 4: a descriptive segment, not a counter, distinguishes the two caches.
BEFORE 1PASSWORD_TOKEN = ... (leading digit)
AFTER ONEPASSWORD_SERVICE_TOKEN = ...Rule 2: a name may not begin with a digit; spell it out.
BEFORE DEBUG = on (bare noun, ad-hoc value)
BETA = yes
AFTER APP_DEBUG_ENABLED = true
FEATURE_BETA_ENABLED = trueRule 5: predicate names, one consistent literal value.
PATH-like variable the OS already defines) is leftas the platform defines it; the rule governs the variables your app introduces.
PAYMENTS_STRIPE_WEBHOOK_SECRET, not WEBHOOK_SECRET_STRIPE_PAYMENTS.
APP_LOG_LEVEL), so itnever sits in the namespace as a bare LOG_LEVEL another library might also claim.
AWS_S3_BUCKET, not AWSS3BUCKET.HOST, KEY, or TIMEOUT._1 / _2._ENABLED predicates with one consistent value. Don't mix yes, on, and 1.HOST, PORT, KEY) that collide across subsystems — the default.SERVICE_1_URL, SERVICE_2_URL) instead of descriptive prefixes.SSL, RETRY) or set with a jumble of yes / on / 1._1 / _2._ENABLED predicates with one consistent literal value app-wide.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/10/2026 | +75% |
Other measured skills in the registry, with their headline benchmark lift.