Files
acdl/.ciagent/PLAN.md
T
Jon Chery 4ed2542ecf docs(P13): plan-as-execute + verify (v1.2.3)
---ci---
project: acdl
phase: 13
milestone: v1.2
status: verify
verdict: VERIFIED
requirements:
  covered: [REQ-31]
---/ci---

Phase 13 plan-as-execute + verify. scripts/verify_phase13.sh green.
6 ECS L1s authored + registered (l1-vpc, l1-ecs-cluster, l1-ecs-service,
l1-iam-role, l1-alb, l1-ecr). Adapter generalized to table-driven
TYPE_MAP (12 IR types) + INPUT_MAP + OUTPUT_MAP. S3 regression: the v1.1
spike l1-s3 produces byte-identical main.tf. Ready to ship v1.2.3.
2026-07-21 21:05:48 +00:00

3.3 KiB

phase, name, milestone, requirements, type, branch
phase name milestone requirements type branch
13 l1-catalog-for-ecs v1.2
REQ-31
feat phase/13-l1-catalog-for-ecs

Phase 13 — l1-catalog-for-ecs (v1.2) PLAN

Goal

Author six IR-typed L1 modules for an ECS Fargate microservice and expand the Terraform adapter's TYPE_MAP to compile them. Each L1 has an interface.json valid against schemas/ir.schema.json, is registered in modules-ir/registry.json, and produces a valid terraform plan fragment via the adapter. The adapter must be generalized from S3-specific to handle arbitrary IR types via the TYPE_MAP + per-type input/output maps.

Tasks

Wave 1 — Generalize the adapter (T-13.1, backend-engineer)

Expand adapters/terraform/adapter.py:

  • TYPE_MAP: add all 9 new IR types (aws:ec2:vpc, aws:ec2:subnet, aws:ec2:routetable, aws:ecs:cluster, aws:ecs:service, aws:ecs:task_definition, aws:iam:role, aws:elbv2:loadbalancer, aws:elbv2:listener, aws:elbv2:targetgroup, aws:ecr:repository).
  • Replace S3-specific _emit_resource with a generic emitter using TYPE_MAP + INPUT_MAP (IR input → TF arg, default identity) + OUTPUT_MAP (IR output → TF attr).
  • String inputs quoted; numbers/booleans bare.
  • Keep S3 behavior identical (v1.1 spike regression check).
  • Keep providers.tf + terraform.tf as-is.

Wave 2 — 6 L1 modules + registry (T-13.2, backend-engineer, D-049)

Create under modules-ir/l1/: l1-vpc, l1-ecs-cluster, l1-ecs-service, l1-iam-role, l1-alb, l1-ecr. Each with interface.json + README.md. Register all 6 in modules-ir/registry.json at 1.0.0.

L1 IR type(s) Terraform resource Key inputs Key outputs
l1-vpc aws:ec2:vpc, aws:ec2:subnet, aws:ec2:routetable aws_vpc, aws_subnet, aws_route_table, aws_internet_gateway, aws_route cidr, azs vpc_id, subnet_ids, igw_id
l1-ecs-cluster aws:ecs:cluster aws_ecs_cluster name cluster_arn, cluster_id
l1-ecs-service aws:ecs:service, aws:ecs:task_definition aws_ecs_service, aws_ecs_task_definition image, port, cpu, memory, env, cluster_arn, subnets, sg, lb_target_group service_arn, task_def_arn
l1-iam-role aws:iam:role aws_iam_role, aws_iam_role_policy_attachment role_name, assume_role_policy, managed_policies role_arn, role_id
l1-alb aws:elbv2:loadbalancer, aws:elbv2:listener, aws:elbv2:targetgroup aws_lb, aws_lb_listener, aws_lb_target_group name, subnets, sg, port, protocol lb_arn, listener_arn, target_group_arn
l1-ecr aws:ecr:repository aws_ecr_repository name repository_url, repository_arn

Multi-resource L1s (vpc, ecs-service, alb): interface.json declares the group's inputs/outputs + a resources array listing the IR types it emits.

Wave 3 — Verify (T-13.3)

For each L1: adapter + terraform validate on the generated TF (syntax check; full AWS plan is Phase 15). v1.1 spike regression: l1-s3 still adapts correctly.

Verification

  • All 6 interface.json validate against schemas/ir.schema.json.
  • modules-ir/registry.json lists all 6 at 1.0.0.
  • adapter.py TYPE_MAP has all new IR types.
  • v1.1 spike l1-s3 regression: adapter output unchanged.
  • Each L1's adapter output passes terraform validate.
  • scripts/verify_phase13.sh.

Ship

Merge phase/13-l1-catalog-for-ecsmain (--no-ff). Tag v1.2.3.