eugenelim/agent-ready-repo/packs/iac-terraform/.apm/skills/generate-iac/SKILL.md
generate-iac
Use this skill to author governed, best-practice Terraform/OpenTofu infrastructure from a plain-language intent. Triggers on "provision X", "create Terraform for", "generate IaC for", "set up cloud resources", "write Terraform for", "scaffold infrastructure". Stops at a digest-pinned `terraform plan` (G4 handoff); never runs `apply`. Governance-first — resolves the decision-record surface before any code.
- Source repository stars
- 17
- Declared platforms
- 0
- Static risk flags
- 0
- Last source update
- 2026-08-28
- Source checked
- 2026-08-28
Decision brief
What it does: where it fits
Author governed, best-practice Terraform/OpenTofu from a plain-language intent. The output is a deploy-ready Terraform directory with a pinned, clean plan — the G4 handoff to release-loop (or the generated human-gated pipeline where release-loop is absent). Apply is never in sco…
Not for
- Emitting terraform apply, terraform destroy, or any autonomous apply path.
- Skipping Stage 0 for "simple" or "small" infrastructure.
Compatibility matrix
Platform support, with evidence labels
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
Inspect first. Install second.
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/eugenelim/agent-ready-repo --skill "packs/iac-terraform/.apm/skills/generate-iac"Inspect the Agent Skill "generate-iac" from https://github.com/eugenelim/agent-ready-repo/blob/12b2c9f36c800761156a1daa149949af4d84986f/packs/iac-terraform/.apm/skills/generate-iac/SKILL.md at commit 12b2c9f36c800761156a1daa149949af4d84986f. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
What the source asks the agent to do
- 01
Stage sequence
Review the “Stage sequence” section in the pinned source before continuing.
Review and apply the “Stage sequence” source section. - 02
Output rendering
Table — When presenting several items that share the same fields, render a Markdown table. Cap at 5 columns; beyond that, switch to a per-item detail list. Right-align numeric columns. Status list — Lead each row with a status glyph — ● running, ✓ done, ○ idle, ⚠ blocked — statu…
Table — When presenting several items that share the same fields, render a Markdown table. Cap at 5 columns; beyond that, switch to a per-item detail list. Right-align numeric columns. Status list — Lead each row with a… - 03
v1 scope — governed realization, not architectural design
In scope (v1): governed HCL generation from a pre-formed architectural intent; provider-contract, tagging, naming, state, IAM, networking, and observability standards applied; OPA/Conftest policy gate; Trivy security scan; CI pipeline wiring (GitHub Actions / Azure DevOps / GitL…
Workload selection. RDS vs Aurora vs DynamoDB, EKS vs ECS vs Lambda, VMNetwork topology design. Hub-spoke vs flat, Transit Gateway vs VPCLoad balancer type/tier selection. L4 vs L7, global vs regional, - 04
Hard rules — non-negotiable
Stage 0 is mandatory and non-bypassable. Before any Terraform, request
Stage 0 is mandatory and non-bypassable. Before any Terraform, requestFirst-time use (no governance index exists for the resolved destination):A mandatory-policy refusal, ambiguity, absence, contradictory evidence, - 05
Inputs to collect (ask if missing; use documented defaults)
Review the “Inputs to collect (ask if missing; use documented defaults)” section in the pinned source before continuing.
Review and apply the “Inputs to collect (ask if missing; use documented defaults)” source section.
Permission review
Static risk signals and limitations
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
Why each signal appears
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 93/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 17 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Provenance and original SKILL.md
- Repository
- eugenelim/agent-ready-repo
- Skill path
- packs/iac-terraform/.apm/skills/generate-iac/SKILL.md
- Commit
- 12b2c9f36c800761156a1daa149949af4d84986f
- License
- Apache-2.0
- Collected
- 2026-08-28
- Default branch
- main
View the original SKILL.md
Skill: generate-iac
Author governed, best-practice Terraform/OpenTofu from a plain-language intent.
The output is a deploy-ready Terraform directory with a pinned, clean plan —
the G4 handoff to release-loop (or the generated human-gated pipeline where
release-loop is absent). Apply is never in scope for this skill.
Output rendering
Table — When presenting several items that share the same fields, render a Markdown table. Cap at ~5 columns; beyond that, switch to a per-item detail list. Right-align numeric columns. Status list — Lead each row with a status glyph — ● running, ✓ done, ○ idle, ⚠ blocked — status first, one item per line, labels aligned.
v1 scope — governed realization, not architectural design
In scope (v1): governed HCL generation from a pre-formed architectural
intent; provider-contract, tagging, naming, state, IAM, networking, and
observability standards applied; OPA/Conftest policy gate; Trivy security scan;
CI pipeline wiring (GitHub Actions / Azure DevOps / GitLab) with OIDC auth;
plan-based drift audit via reconcile-iac.
Out of scope in v1 — bring a pre-formed architectural decision:
- Workload selection. RDS vs Aurora vs DynamoDB, EKS vs ECS vs Lambda, VM vs container vs serverless. This skill governs and builds what you chose; it does not evaluate requirements → service fit.
- Network topology design. Hub-spoke vs flat, Transit Gateway vs VPC peering, on-prem connectivity (DX / ExpressRoute / Interconnect), multi-region topology. This skill consumes a network; it does not design one.
- Load balancer type/tier selection. L4 vs L7, global vs regional, health-check strategy, blue/green or canary traffic-shift. "Governed front door only" means the skill wires an LB you specify.
- Multi-account / landing-zone orchestration. AWS Control Tower, Azure Landing Zones, GCP org-hierarchy. Account-isolation model is an input; the org infrastructure is not provisioned here.
- Compliance-framework content. CIS, NIST, PCI-DSS, HIPAA, FedRAMP, SOC 2 control mapping. Adopt via governance-index domain rows + custom standard references; built-in standards are security-best-practice, not a control-framework map.
- IAM guardrail layer. AWS SCPs, AWS permission boundaries, Azure Policy at
management-group scope, GCP Org Policy constraints. The pack enforces
least-privilege role policies; org-level guardrails are an adopter addition
(see
security-iam-standard.md§ Organization-level guardrails). - Autonomous apply / operational self-healing.
reconcile-iacv1 is managed-drift detect-propose-approve (never autonomous). Runtime operational self-healing (auto-remediate live service degradation) is not in scope.
Hard rules — non-negotiable
- Stage 0 is mandatory and non-bypassable. Before any Terraform, request
the
decision-recorddestination through Core'swork-intakesemantic- surface capability. Pass bounded adopter evidence and consume the returnedsemantic-surface-resolution.v1result unchanged; never reproduce its precedence, policy, or confinement logic. Then load the governance index established for that destination and read only the 2–3 records it maps to the intent's domains. The plan must list which decision records it satisfies and why. Do not proceed to Stage 1 until Stage 0 is complete.- First-time use (no governance index exists for the resolved destination):
offer to bootstrap one according to that destination's established index
convention, using the template from
governance-extras/seeds/governance/manifest.example.yaml. For a confined repository destination, inspect only the resolved decision-record surface; do not assumedocs/adr/. For an external destination, use only bounded content already acquired through a separately approved adapter. Without an adapter, render a portable handoff and stop. Confirm the bootstrap with the human before proceeding; the human confirms completeness before Stage 0. - A mandatory-policy refusal, ambiguity, absence, contradictory evidence, unsafe locator, or unavailable external content stops before index or directory creation and before any Terraform write.
- First-time use (no governance index exists for the resolved destination):
offer to bootstrap one according to that destination's established index
convention, using the template from
- Never invent a decision record. If an intent conflicts with an existing
ADR, or no ADR covers a material decision, stop and surface it — draft a new
ADR via
governance-extras'new-adr(infra mode); do not silently resolve. - Never hardcode a cloud. The target cloud is always an input; provider,
backend, and module choices resolve from
references/providers/<cloud>.md. - Vocabulary firewall at Stage 1 (SPECIFY).
spec.mdnames only generic infrastructure ("managed database", "object storage", "container orchestration") — no cloud-specific service names. Concrete services (RDS, Blob Storage, GKE…) appear only from PLAN onward. Cloud-agnosticism by construction. - Tier-ordered tasks at Stage 4 (TASKS). Order
tasks.mdby infrastructure tier: Foundation → Network → Compute/Data → App → Polish. Mark a task[P]only when it touches disjoint files with no resource/data dependency. - Scenario-independence. Each infra slice must be independently deployable, validatable, and rollback-able.
- Ground every resource in the live provider schema — always on. Before
emitting any resource, acquire the provider's live contract via
core'scontract-acquisitionoracle and reference the cited schema slice. Never guess a resource type, argument, or field. The ground-truth oracle is the toolchain's ownterraform providers schema -json/tofu providers schema -jsoncombined withvalidate. The HashiCorp Terraform MCP server and Registry API are optional discovery accelerants — never dependencies. - Standards are binding. The standard references (terraform-standard, networking-standard, security-iam-standard, tagging-standard, observability-standard) are law. Cite the standard applied.
- Apply is the outer loop's, gated by the loop arc. The skill's
deliverable is a green, digest-pinnable
plan= the G4 handoff. Deploy and apply arerelease-loop's act on ephemeral isolated envs, human-gated at the irreversible exits. Never emit a command that runsapplyordestroy.
Inputs to collect (ask if missing; use documented defaults)
| Input | Default | Note |
|---|---|---|
| Target cloud | ask | Never guess |
| Engine | terraform | terraform | opentofu — emit engine-neutral HCL unless a divergent feature is requested; load opentofu-differences.md only when engine = opentofu |
| Environment(s) | dev | |
| Region | ask | |
| Decision-record source | resolve semantic role decision-record | Adopter-owned repository or external destinations win when policy permits |
| CI system | github-actions | github-actions | azure-devops | gitlab |
| Remote execution platform | none | none | hcp-terraform | scalr; when engine = opentofu, only none and scalr are valid — cloud {} is Terraform-only and incompatible with OpenTofu |
| State backend | derive from cloud | S3 (AWS), GCS (GCP), Azure Blob — only when remote_exec_platform = none; remote exec platforms own the state |
| Account/tenant isolation model | separate account per env | drives OIDC trust-policy scoping and state backend key structure |
Stage sequence
Stage 0: ADR gate (mandatory, non-bypassable)
→ resolve decision-record; load its governance index; offer bootstrap if absent; read 2-3 governing records
Stage 1: SPECIFY
→ vocabulary firewall — generic names only in spec.md; no cloud service names
Stage 2: CLARIFY
→ collect all inputs; ask for missing; confirm engine + cloud + region
Stage 3: PLAN
→ load provider reference for target cloud; load CI reference for target CI
→ when platform ≠ none: load references/remote-exec/<platform>.md
→ draft: ADR-compliance table + standards-mapping table + layered layout
→ networking design + pipeline design + reversibility hints per stateful resource
→ ADR-compliance table must have zero ❌/⚠️ rows before proceeding to Stage 4
→ optional deep-design pass: tap `architect` pack's Well-Architected lenses
when installed (soft dependency — degrade cleanly when absent)
Stage 4: TASKS
→ tier-ordered (Foundation → Network → Compute/Data → App → Polish)
→ [P] only when files are disjoint with no resource/data dependency
Stage 5: WRITE TF
→ ground every resource type in live schema via contract-acquisition
→ emit provider config files (versions.tf / provider.tf) per
references/provider-contract.md; backend config branches on platform:
• platform = none (default): backend.tf + backend.hcl.example
(cloud-native object store: S3 / GCS / Azure Blob)
• platform = hcp-terraform: cloud {} block in versions.tf;
no backend.tf, no backend.hcl.example
• platform = scalr: backend.tf with backend "remote" block;
no backend.hcl.example
→ when platform ≠ none: emit REMOTE_EXEC_SETUP.md (credential guidance,
token setup, traps) per references/remote-exec/<platform>.md
→ apply all mandatory tagging (references/tagging-standard.md)
→ tag stateful resources with reversibility-class annotations
(reversible | costly-to-reverse | one-way-door)
→ emit OPA/Conftest starter rules (references/policy-on-plan.md)
→ emit CI pipeline (references/pipeline/<ci>.md) with OIDC auth, no static keys
Stage 6: VERIFY (inner loop — iterate until clean)
→ terraform fmt -check (or tofu fmt -check)
→ terraform validate (or tofu validate)
→ terraform plan -out=tfplan (or tofu plan -out=tfplan)
→ shasum -a 256 tfplan → record the plan digest
→ terraform show -json tfplan | conftest test (or tofu show ...)
→ trivy config . (or checkov -d .)
→ [optional] infracost diff --path . --format json
G4 handoff
→ deploy-ready Terraform directory
→ pinned plan file + digest (shasum -a 256 tfplan)
→ OPA/Conftest exit-0 evidence (plan JSON + checks applied + zero violations)
→ Trivy/Checkov exit-0 evidence
→ reversibility hints per stateful resource
→ [optional] Infracost cost delta JSON
References (load on demand per target)
Standards (always load):
references/terraform-standard.md— layered layout, versioning, state, anti-patternsreferences/networking-standard.md— private-by-default, per-cloud tablereferences/security-iam-standard.md— least-privilege, OIDC, data protectionreferences/tagging-standard.md— 6 mandatory keys + per-cloud applicationreferences/observability-standard.md— OTEL emit + collector + backend + dashboards
Verification and provider shape:
references/terraform-verify-and-iterate.md— plan-vs-apply oracle, module testsreferences/provider-contract.md— four-file shape + credential tiering + DoDreferences/release-loop-integration.md— G4 artifact set, preflight-set shapingreferences/bootstrap-sequence.md— load for first bootstrap/ apply — local-state → create-backend → migrate-state chicken-and-egg story
Load per target (never all at once):
references/providers/<cloud>.md— cloud-specific config (aws / gcp / azure / …)references/opentofu-differences.md— load ONLY when engine = opentofureferences/pipeline/<ci>.md— CI pipeline shape (github-actions / azure-devops / gitlab)references/remote-exec/<platform>.md— load ONLY when platform ≠ none — config block, auth, credential model, CI trigger delta, bootstrap narrative (hcp-terraform / scalr)
Policy and plan shape:
references/policy-on-plan.md— starter Rego rules + Trivy/Checkov guidancereferences/spec-plan-tasks-shape.md— mandatory ADR-compliance-table plan shape
Reuse — do not duplicate core
This skill references core's depth rather than re-stating it:
- Verification method (phased oracle fidelity, plan/preview discipline, drive
the deploy yourself) →
core's infra-verification mode - Operational depth (state & idempotency, drift & rollback, environment
isolation, cost & teardown, observability & smoke) →
core'soperational-safetymodules, inlined by the orchestrator - IaC/deploy-config misconfiguration review →
core'ssecurity-checklists(config-misconfigmodule), mandatory and non-skippable on infra work - ADR authoring →
governance-extras'new-adr(infra mode)
Reviewers (reused from core — zero new agents)
Route through the orchestrator-inlining mechanism at REVIEW:
adversarial-reviewer— spec/plan/diff; always after GATES passquality-engineer— operational lens, withoperational-safetymodules (state-and-idempotency, drift-and-rollback, environment-isolation, cost-and-teardown, observability-and-smoke, cloud-implementation-craft) inlined by orchestratorsecurity-reviewer—security-checklists/config-misconfig+ matching modules (access-control, secrets-and-crypto as diff trips them); mandatory on infra work
Loop arc
inner loop (work-loop):
intent → Stage 0 → spec → plan → tasks → write TF
↕
fmt · validate · plan ── errors? ─────────────────┘
│ (schema/arg hallucination, cycle, missing var)
▼ plan CLEAN + digest-pinned == G4 hand-off
outer loop (release-loop, when installed):
deploy to ephemeral env → apply → e2e/smoke → observe
│
└── apply-time failure? ── feed back to inner ──┘
converge → release-readiness record → G5 (human)
Full mode (release-loop + ephemeral envs + conformance canary present):
autonomous apply-iteration catches AWS-style apply-time failures (IAM
propagation, service quotas, terminal FAILED states).
Degraded mode (common case — release-loop absent): work-loop inner
loop + generated human-gated pipeline. Still a real improvement over hand-
written scaffolding; without the outer loop, autonomous apply-iteration is
unavailable. The RFC does not claim full mode as the default.
Anti-patterns this skill refuses
- Emitting
terraform apply,terraform destroy, or any autonomous apply path. - Skipping Stage 0 for "simple" or "small" infrastructure.
- Inventing a decision record to satisfy Stage 0.
- Hardcoding a cloud-specific service name in the SPECIFY spec.
- Referencing
tfsec(merged into Trivy in 2023) or DynamoDB state locking (superseded by native S3 lockfile, GA in Terraform 1.11). - Committing
*.tfvarswith real values or raw credentials. - Emitting a Sentinel policy (incompatible with OpenTofu — use OPA/Conftest for the open-source policy path that works on both engines).
- Emitting
backend "remote" { hostname = "app.terraform.io" ... }for an HCP Terraform target — this is the deprecated form; generate acloud {}block inversions.tfinstead. - Emitting a
cloud {}block for anengine = opentofutarget — it is Terraform-only and incompatible; offerplatform = scalrwithbackend "remote"as the OpenTofu-compatible remote execution alternative.
Frequently asked questions
What to verify before installation and use
What does the generate-iac source document cover?
Author governed, best-practice Terraform/OpenTofu from a plain-language intent. The output is a deploy-ready Terraform directory with a pinned, clean plan — the G4 handoff to release-loop (or the generated human-gated pipeline where release-loop is absent). Apply is never in sco…
How do I install generate-iac?
The source record exposes this install command: npx skills add https://github.com/eugenelim/agent-ready-repo --skill "packs/iac-terraform/.apm/skills/generate-iac". Inspect the command and pinned source before running it.
Alternatives
Compare before choosing
coreyhaines31/marketingskills
ab-testing
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
oaustegard/claude-skills
featuring
Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre
event4u-app/agent-config
existing-ui-audit
Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state.ui_audit. Hard gate for the ui directive set.
event4u-app/agent-config
fe-design
Frontend design heuristics — and, outside the ticket engine, the loop that applies them: audit, brief, inventory, build, review. Use when building or changing any UI, not only when planning one.