Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when naming resources, data sources, variables, and outputs in Terraform / HCL code: snake_case identifiers with no hyphens or CamelCase, a local name that never repeats its resource type (aws_instance.web, never aws_instance.web_instance), this for a module's single primary resource, and snake_case variable and output names. Do NOT use for structuring modules and directories, wiring outputs between modules, choosing a cloud provider, writing the resource arguments, or naming resources in other IaC tools.
.claude/skills/terraform-naming/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 12 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +4% | +118% | 0% | 25 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-11 | ✓→✓ | = Same ✓ | — | — |
| case-16 | ✗→✗ | = Same ✗ | — | — |
| case-14 | ✗→✗ | = Same ✗ | — | — |
| case-05 | ✗→✗ | = Same ✗ | — | — |
Enforces the HashiCorp Terraform naming style on every identifier you declare: resource and data-source local names, variables, outputs, and module names are snake_case, never repeat the resource type, and use this for a module's single primary resource. Apply when writing or reviewing HCL identifiers; not for the resource arguments, directory layout, or module wiring.
lowercase words joined by single underscores. Never CamelCase (webServer), never a leading capital (WebServer).
output, or module name. Hyphens live only INSIDE string VALUES — the real cloud resource name or tag (name = "prod-web-01"), never in the HCL label itself.
reference (aws_s3_bucket.logs is read as aws_s3_bucket.logs), so repeating the type is pure redundancy. Name it logs, never logs_bucket, bucket, or s3_bucket. Strip the type noun (bucket, role, table, queue, topic, instance) from the local name.
this for a module's single primary resource. When a module (or config) creates exactlyONE resource of its main type, name that resource this — resource "aws_vpc" "this". Use a descriptive name only when there are two or more of the type to tell apart.
instance_count,enable_logging, subnet_ids. Carry the unit or purpose in the name; never CamelCase or hyphenate them either.
data block's local name is snake_case and doesnot repeat the data-source type: data "aws_ami" "ubuntu", never data "aws_ami" "ubuntu_ami".
A bucket whose local name repeats the type, loses the repetition:
BEFORE resource "aws_s3_bucket" "app_bucket" { ... }
AFTER resource "aws_s3_bucket" "app" { ... }A role named ..._role, loses the type noun:
BEFORE resource "aws_iam_role" "lambda_role" { ... }
AFTER resource "aws_iam_role" "lambda" { ... }A CamelCase, hyphenated identifier becomes snake_case:
BEFORE resource "aws_security_group" "web-SG" { ... }
AFTER resource "aws_security_group" "web" {
name = "web-sg" # the hyphen lives in the string value
}A module's single instance of its main type is named this:
BEFORE resource "aws_db_instance" "main_database" { ... }
AFTER resource "aws_db_instance" "this" { ... } # the module makes exactly oneA CamelCase variable and output become snake_case:
BEFORE variable "instanceCount" {}
output "bucketArn" { value = aws_s3_bucket.app.arn }
AFTER variable "instance_count" {}
output "bucket_arn" { value = aws_s3_bucket.app.arn }this; give each a distinguishing snake_casename that still omits the type (aws_subnet.public, aws_subnet.private, not aws_subnet.public_subnet).
(aws_instance.worker with count, never aws_instance.workers or worker_instance).
aws_vpc.this or aws_vpc.main, never aws_vpc.vpc.
(bucket = "app-prod-logs"); the HCL label stays snake_case.
identifiers — hyphens there are correct and untouched.
aws_s3_bucket.logs. Don't write aws_s3_bucket.logs_bucket or .bucket._role, _table, _queue, etc.this for a module's single primary resource. Don't use main_thing or the type.aws_iam_role.role, aws_sqs_queue.queue, .this_table.aws_lambda_function.imageResizer).aws_subnet.public-a) instead of only in the string value.main / default / the type instead of this.enableLogging or subnet-ids instead of enable_logging / subnet_ids.data "aws_ami" "base_ami").this; siblings get distinguishing names, still typeless.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-25 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | 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. 25 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 25 comparable cases.
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 | +23% |
Other measured skills in the registry, with their headline benchmark lift.