Skip to content
Back to skills

Web Infra Plan

ASecurity

Produce a sprint INFRA.md covering Terraform / gcloud changes — dry-run plan, IAM diff, cost estimate, rollback. Coordinator-only — does not apply infra changes. Pauses for user confirmation. Bias toward GCP+Terraform but works with Pulumi / CloudFormation / Serverless / CDK.

  • 3 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 27, 2026
data-aibashawsgcpazureterraformsecurity

Works with

  • cli

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add howar31/magi-workflow --skill web-infra-plan --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Web Infra Plan?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Web Infra Plan
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/howar31-web-infra-plan/badge)](https://www.skillsdirectory.com/skills/howar31-web-infra-plan)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: web-infra-plan
description: Produce a sprint INFRA.md covering Terraform / gcloud changes — dry-run plan, IAM diff, cost estimate, rollback. Coordinator-only — does not apply infra changes. Pauses for user confirmation. Bias toward GCP+Terraform but works with Pulumi / CloudFormation / Serverless / CDK.
disable-model-invocation: true
---

# /magi:web-infra-plan — infra elaboration

You are the coordinator. Plan an infrastructure change and capture the
analysis in `magi/<num>-<slug>/INFRA.md`. **You never run `terraform apply`,
`gcloud ... create`, or any other resource-mutating command.** Read
`references/domain/web/infra.md` before starting.

## 0. Preflight

```bash
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-}"
[[ -z "$PLUGIN_ROOT" ]] && PLUGIN_ROOT="$(cd "$(dirname "$BASH_SOURCE[0]")/../.." 2>/dev/null && pwd)"
USER_CONFIG="$HOME/.config/magi-workflow/config.json"
```

If config missing → tell user to run `/magi:setup`.


## 0.5. State preflight (auto-refuse if not allowed)

```bash
STATE_JSON=$(bash "$PLUGIN_ROOT/scripts/shared/detect-state.sh")
blocked=$(jq -r '.disallowed_skills["web-infra-plan"] // empty' <<<"$STATE_JSON")
if [[ -n "$blocked" ]]; then
  reason=$(jq -r '.disallowed_skills["web-infra-plan"].reason' <<<"$STATE_JSON")
  suggest=$(jq -r '.disallowed_skills["web-infra-plan"].suggest' <<<"$STATE_JSON")
  echo "Cannot run /magi:web-infra-plan: $reason"
  echo "Suggested: $suggest"
  exit 1
fi
```

`--force` skips preflight (advanced/recovery only).

## 1. Locate sprint + IaC

Find the sprint folder (default: most recent; or `--sprint <num>-<slug>`).

Detect IaC tool per `references/domain/web/infra.md` "Discovery". Check:

- Is there a `*.tf` / `terraform/` / `pulumi.yaml` / `cloudformation/` etc.?
- For Terraform: where is the state? Workspace pattern? Tooling
  (`terragrunt`, `tflint`, `tfsec`, `checkov`)?

If there is NO IaC and the user is asking for non-trivial cloud changes,
**push back**: surface "no IaC = no reproducibility" as a 🔴 risk and
recommend introducing a minimal Terraform setup before proceeding.

## 2. Read the existing spec

Read PLAN/SPEC.md to understand what infra change is implied. If the spec
is silent on infra, ask the user to describe the intended change.

## 3. Generate the dry-run plan

Per `references/domain/web/infra.md`, run the appropriate dry-run:

### Terraform

```bash
cd <terraform-dir>
terraform fmt -check -recursive
terraform validate
terraform plan -out=plan.tfplan -detailed-exitcode -input=false
plan_rc=$?     # 0=no changes, 2=changes, 1=error
[[ $plan_rc -eq 1 ]] && abort  # surface the error to the user
terraform show -no-color plan.tfplan > "$sprint_dir/plan.txt"
terraform show -json plan.tfplan > "$sprint_dir/plan.json"
```

### gcloud (no Terraform)

For each gcloud command in the proposed change:

- Add `--dry-run` or `--validate-only` if supported.
- If not supported, mark it 🟡 in INFRA.md as "no dry-run available; review carefully before apply".

### Pulumi

```bash
pulumi preview --diff --json > "$sprint_dir/preview.json"
```

### CloudFormation

```bash
aws cloudformation create-change-set ... --change-set-type CREATE
aws cloudformation describe-change-set ... > "$sprint_dir/changeset.json"
```

If the dry-run cannot be run for any reason (no creds, no state lock,
network), abort and tell the user — never make up a fake plan.

## 4. IAM diff

Build the IAM impact table (per reference). For each binding change,
identify principal × resource × role-before × role-after.

Flag as 🔴 Critical anything in the reference's "elevated risks" list:

- `roles/owner`, `roles/editor`
- `roles/iam.securityAdmin`, `roles/resourcemanager.projectIamAdmin`
- `allUsers` / `allAuthenticatedUsers`
- Cross-project bindings without audit-logged SA
- Newly public bucket / firewall rule / Cloud Run service

## 5. Cost estimate

Pick the cheapest available tool:

```bash
# Preferred for Terraform projects:
infracost breakdown --path "$sprint_dir/plan.json" \
  --format table > "$sprint_dir/cost.txt" 2>&1 \
  || echo "infracost unavailable; falling back to manual estimate"
```

If `infracost` is missing, do a manual estimate using:

- Resource shape (machine type, region, storage class, retention).
- Public GCP / AWS / Azure pricing.
- Top 3 cost drivers.
- Cost-control levers.

State the methodology in INFRA.md so a reviewer can sanity-check.

## 6. Rollback plan

For every change, answer:

- **Reversible?** Can `terraform destroy <addr>` (or equivalent) restore
  prior state without data loss?
- **Backup needed first?** For DB / GCS / KMS / IAM cascading changes:
  yes, document the backup command.
- **Blast radius**: per-env vs cross-env vs whole project.
- **Comm plan**: who needs to know before / during / after apply.

For IRREVERSIBLE changes, INFRA.md must include a **STOP-checklist**
the operator runs aloud before applying:

```
STOP — irreversible apply ahead.
Confirm:
  [ ] Backup taken: <command and verified output>
  [ ] Approver: <name>
  [ ] Rollback path documented and tested
  [ ] Off-hours window: <timestamp>
```

## 7. Write INFRA.md

Use the deliverable template from `references/domain/web/infra.md`. Fields:

- Summary
- Resource changes (link to plan.tfplan / plan.txt)
- IAM diff table
- Cost estimate
- Network & security baseline check (TLS, WAF, secrets, logs)
- Rollback plan (+ STOP checklist if applicable)
- Verification (post-apply smoke commands; drift detection cadence)
- Open questions

Use `output_language` for prose; keep CLI commands and resource names in
English / canonical form.

## 8. Stop and hand off

Show the user:
- INFRA.md path
- Top 3 risks (especially any 🔴 IAM escalations)
- Cost delta summary
- Whether the change is reversible

Recommend next:
- If risks are 🔴: have user re-run `/magi:review-plan` so other models
  also see the IAM diff.
- If clean: tell user the apply commands they should run themselves
  (DO NOT run them).
- If something is missing for a clean apply (creds, backup), surface that.

**Never run `terraform apply` or any mutating gcloud command.**

## Argument parsing

- `--sprint <num>-<slug>` — explicit sprint folder.
- `--iac terraform|pulumi|cloudformation|gcloud` — skip detection.
- `--terraform-dir <path>` — explicit terraform directory if not at sprint root.
- `--no-cost` — skip cost estimation (rare; usually wanted).
- `--no-iam-diff` — skip IAM diff (only for changes that don't touch IAM).

## Conventions

- **Plan, not apply** — this skill never mutates state.
- **Always dry-run first** — even for "trivial" changes; the dry-run is the
  artefact reviewers compare against the apply.
- **Errors are blocking** — `terraform plan` returning 1 = abort; do not
  guess at the missing pieces.
- **IAM is rarely "small"** — even one role addition can be Critical.
  Be paranoid by default.
- **Cost methodology must be stated** — an unattributed number is worse
  than no number.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.