Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when writing Terraform — AWS modules, resources, variables, outputs, remote state — even when the user just says 'provision this infra' or 'add an S3 bucket' without naming Terraform.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Use this skill when writing or modifying Terraform configurations (.tf files), creating new infrastructure modules, or understanding AWS resource definitions.
agents/overrides/skills/terraform.md for the repo location).modules/ for patterns and conventions.variables.tf of the target module to understand required inputs.versions.tf for provider version constraints.{infrastructure-repo}/
├── environments/
│ ├── pro/ # Production environment
│ │ ├── root.hcl # Terragrunt root config
│ │ ├── core/ # Core infrastructure (VPC, DNS zones)
│ │ └── {service}/ # Per-service resources
│ └── sta/ # Stage environment
│ └── ...
├── modules/
│ ├── core/ # VPC, DNS, shared resources
│ └── {service}/ # Per-service module (ECS, ALB, ECR, etc.)
└── Taskfile.yml # Task runner commands (or Makefile)
Read agents/overrides/skills/terraform.md for the actual repository layout and service names.
versions.tf.versions.tf in the existing modules for the project's version constraints.Prefer community or organization-specific Terraform modules from the Terraform Registry:
module "alb" {
source = "{org}/application-load-balancer/aws"
version = ">= 1.0.0, < 2.0.0"
}
Check existing modules in the project for which registry modules are used.
var.global_prefix (e.g., {project}-{env})tags = var.tags${var.global_prefix}-<purpose> (e.g., -ecs, -mysql, -redis)/aws/ecs/${cluster}/${service}${path_relative_to_include()}/terraform.tfstatevariable blocks with description.object() types for complex inputs (not any unless unavoidable).optional() with defaults where appropriate.ignore_changes = [task_definition] on ECS services — task definitions are managed by CI/CD, not Terraform.deletion_protection = true on databases.The failure that reaches production is almost never a pinned-version mistake;
it is a resource that works either way and was left on its permissive default.
Four constructs carry it. Each backstop grep is over the .tf tree you are
changing, not over this repository.
| Backstop grep | What a hit means | Override condition |
|---|---|---|
grep -rn '0\.0\.0\.0/0' --include='*.tf' . | An ingress or egress rule whose CIDR is 0.0.0.0/0, i.e. open to the whole internet. On a management or database port stop and treat it as CRITICAL - the corpus row enumerates which ports those are. | A deliberately public listener - an ALB or CloudFront origin on 80/443. Nothing else. Record the reason next to the rule. |
grep -rn 'publicly_accessible|block_public_acls|ignore_public_acls' --include='*.tf' . | Either publicly_accessible = true on a database, or a bucket with no public-access block present at all. Absence is the more common hit and the grep returning nothing is the failing case. | A bucket that genuinely serves public web assets, with the policy written explicitly rather than inherited from a default. |
grep -rnE '"(Action|Resource)" *: *"\*"|= *\["\*"\]' --include='*.tf' . | A wildcard IAM action or resource. One compromised workload credential then reaches everything in the account. | A named, reviewed exception - iam:PassRole scoped by condition, or a bootstrap role. Never the default. |
grep -rL 'encrypt' --include='*.tf' . (lists files with NO encryption mention; -L prints names only, so no -n) | A storage, volume, snapshot, or database resource with no encryption block. | None for data at rest. A resource holding no data at all. |
Read the surface class before the fix, not after: the mitigation text, the
abuse case, and the negative test live in the infrastructure rows of
threat-modeling's corpus, which is the single
authority for them. Ask that skill's grounded-corpus step for the
infrastructure surface class - it carries the invocation - and describe the
change you are making, e.g. terraform security group ingress open to
0.0.0.0/0. Do not copy the command here: one skill owns that interface, for
the same reason one file owns the control text.
Those rows also carry a Decided by: clause stating which check actually
decides each one. For all four constructs above that clause reads NO CHECK IN
THIS REPOSITORY - no HCL or IAM-policy parser ships here, so these greps and
your own IaC policy scanner are the whole enforcement story. Do not write or
imply otherwise.
Used for web services with zero-downtime deployments:
Used for workers and schedulers:
deployment_controller { type = "ECS" }lifecycle { ignore_changes = [task_definition] }Each environment has a GitHub IAM role with:
| Symptom | Root cause | Fix |
|---|---|---|
Error acquiring the state lock blocks every command | A prior apply crashed / was killed and left the lock held (DynamoDB / backend lock) | Confirm no apply is actually running, then terraform force-unlock <lock-id> — never delete the lock table |
plan wants to destroy+recreate a resource after a rename | Renaming a resource block changes its address; Terraform sees the old address gone and a new one added | terraform state mv <old.addr> <new.addr> (or a moved {} block) so it tracks the same object |
count/for_each errors with "value depends on resource attributes that cannot be determined until apply" | The count/for_each expression reads an unknown (not-yet-created) value | Key for_each off a static/known map, or split into a two-stage apply with -target |
A change applies but the next plan shows the same diff again (perpetual diff) | The provider normalizes/computes the attribute differently than written (ordering, defaults, case) | Match the provider's canonical form, or ignore_changes on that attribute in lifecycle |
plan shows a resource as tainted/replaced after a manual console change | Out-of-band drift — someone edited the resource outside Terraform | terraform apply -refresh-only to reconcile state, then decide code-vs-cloud; stop the manual edits |
terraform apply without -auto-approve requires interactive confirmation — don't use in CI without the flag.terraform plan before apply — always plan first, review changes.* in IAM resource ARNs unless absolutely necessary.deletion_protection from databases.data.aws_caller_identity.current.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
日本語の概要は準備中です。原文の説明を表示しています。
Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review.
日本語の概要は準備中です。原文の説明を表示しています。
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
日本語の概要は準備中です。原文の説明を表示しています。
Use for an adversarial red-team / blue-team / auditor review of an AI agent's CONFIG + behaviour (rules, skills, MCP, hooks, permissions) — attack-chain → defensive-gap list, not a code audit.
日本語の概要は準備中です。原文の説明を表示しています。