---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.
3.3 KiB
phase, name, milestone, requirements, type, branch
| phase | name | milestone | requirements | type | branch | |
|---|---|---|---|---|---|---|
| 13 | l1-catalog-for-ecs | v1.2 |
|
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_resourcewith a generic emitter usingTYPE_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.tfas-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.jsonvalidate againstschemas/ir.schema.json. modules-ir/registry.jsonlists all 6 at 1.0.0.adapter.pyTYPE_MAPhas all new IR types.- v1.1 spike
l1-s3regression: adapter output unchanged. - Each L1's adapter output passes
terraform validate. scripts/verify_phase13.sh.
Ship
Merge phase/13-l1-catalog-for-ecs → main (--no-ff). Tag v1.2.3.