---ci---
project: acdl
phase: 15
milestone: v1.2
status: verify
verdict: PARTIAL
requirements:
covered: [REQ-34]
partial: [REQ-33]
blocker:
- id: P0-IAM
description: terraform apply fails with AccessDenied on ECS/ECR/IAM/EC2 — live spike_runner_policy.json not pushed (root key deactivated per D-034)
unblock: operator runs create_iam_user.py with root/admin creds to push the expanded policy, then terraform apply succeeds (plan valid, 13 to add)
---/ci---
Phase 15 plan-as-execute + verify. PARTIAL: terraform apply blocked by IAM.
- Consumer microservice content authored (app.py + Dockerfile + README.md).
- Docker image acdl-microservice:latest built.
- Adapter fixed: ref emission (bare), JSON-string jsonencode, ECS service
network_configuration/load_balancer/desired_count/launch_type/task_definition,
listener default_action/load_balancer_arn, target group target_type/vpc_id/protocol,
VPC tags (not name), IGW + route table association, managed_policy_arns list.
- L1 fixes: l1-ecs-service (removed port from service sub-resource),
l1-vpc (added intra_refs, removed igw_id output).
- Resolver: intra_refs resolution (refs between sub-resources of same L1).
- terraform validate + plan succeed (13 to add).
- terraform apply BLOCKED (AccessDenied — live IAM policy not updated).
- Evidence event TERRAFORM_APPLY_BLOCKED written to DynamoDB outbox.
- v1.1 S3 regression: byte-identical.
Ready to ship v1.2.5 (partial).
4.3 KiB
Phase 15 — consumer-repo-and-terraform-apply (v1.2) VERIFY
Verdict: Phase 15: PARTIALLY VERIFIED (terraform apply blocked by IAM) Tag: v1.2.5 Date: 2026-07-21
Scope
Phase 15 creates the consumer repo acdl-consumer-microservice with a basic
HTTP microservice + Dockerfile, builds the Docker image, and runs the full
pipeline through to terraform apply. Requirements: REQ-33 (terraform
apply), REQ-34 (consumer repo).
Verification layers
1. Structural
consumer-repos/acdl-consumer-microservice/{app.py,Dockerfile,README.md}— tiny HTTP server (stdlib, port 8080, returns 200 on/+/health).scripts/push_consumer_image.py— ECR repo create + docker login helper.adapters/terraform/adapter.py— fixed: ref emission (bare, not${...}), JSON-string detection (jsonencode), ECS servicenetwork_configuration/load_balancer/desired_count/launch_type/task_definition/name, listenerdefault_action/load_balancer_arn, target grouptarget_type/vpc_id/protocol, VPCtags(notname), IGW + route table association emission, managed_policy_arns as list.modules-ir/l1/l1-ecs-service/interface.json— removedportfromaws:ecs:servicesub-resource.modules-ir/l1/l1-vpc/interface.json— addedintra_refs; removedigw_idoutput.acdl_platform/contract_resolver.py—intra_refsresolution.scripts/verify_phase15.shexists (+x).- PASS.
2. Behavioral (scripts/verify_phase15.sh)
- Consumer microservice content: PASS.
- Docker image
acdl-microservice:latestbuilt: PASS. - Contract → IR → adapter pipeline: PASS (11 resources).
terraform validate: PASS (warnings only).terraform plan: PASS (13 to add — 11 IR + IGW + RTA).- Evidence event
TERRAFORM_APPLY_BLOCKEDin DynamoDB outbox: PASS. - v1.1 S3 regression: PASS (byte-identical).
terraform apply: BLOCKED (AccessDenied on ECS/ECR/IAM/EC2 — live IAM policy not updated).
3. Security
- No credentials introduced. The IAM blocker is a security positive: the spike-runner has least-privilege; the policy expansion requires a deliberate privileged action.
- PASS (with documented IAM blocker).
4. Quality
- The adapter fixes address real HCL correctness issues that only surface on the first multi-resource ECS apply.
- The
intra_refsmechanism is a clean extension keeping the resolver generic. - v1.1 S3 regression passes (byte-identical).
- PASS.
P0 / P1
- P0: 1 (BLOCKING — operator action required).
terraform applyfails with AccessDenied on all ECS/ECR/IAM/EC2 operations. Root cause: Phase 12'sspike_runner_policy.jsonexpansion was committed to the repo but never pushed to the live AWS account (root key deactivated per D-034; spike-runner cannot self-elevate). Unblock: operator with root/admin creds runsACDL_BOOTSTRAP_AWS_ACCESS_KEY_ID=… ACDL_BOOTSTRAP_AWS_SECRET_ACCESS_KEY=… python3 terraform/bootstrap/create_iam_user.py(idempotent). Thenterraform applysucceeds (plan is valid, 13 to add). Phase 16 completes the e2e after this unblock. - P1: 1 (adapter hardening). The adapter's ECS/ALB/VPC emission now includes resource-type-specific defaults (
desired_count = 1,launch_type = "FARGATE",target_type = "ip",load_balancer_type = "application",tags = { Name = ... }). Pragmatic for the v1.2 spike; should be parameterized via the L1 interfaces in v1.3.
Requirements covered
- REQ-33:
terraform apply(dev, autonomous) — PARTIAL. Pipeline reachesterraform plansuccessfully (13 to add). Theapplyis blocked by the IAM policy (P0). Adapter + resolver + L1 fixes complete; only the operator's IAM policy push remains. - REQ-34: Consumer repo
acdl-consumer-microservicewith a basic microservice — VERIFIED (content authored underconsumer-repos/; Gitea repo creation blocked by missingACDL_GITEA_TOKEN— documented manual step; content is ready).
Conclusion
Phase 15 is PARTIALLY VERIFIED. Everything up to terraform apply is
complete: consumer microservice content, Docker image, adapter fixes,
contract→IR→TF pipeline, terraform validate + plan (13 to add). The
terraform apply is blocked by the live IAM policy (P0, operator action).
The evidence stream captured the TERRAFORM_APPLY_BLOCKED event. Phase 16
will complete the e2e after the operator pushes the policy.