---
ci---
project: acdl
phase: 67
milestone: v1.12
status: execute
---
/ci---
CAP-013 (REQ-129): adapter dedup logic collapsed multi-resource L1s
(ecs-service, alb) to one module block named after the first sub-resource
id, but stack outputs + cross-module refs used the expanded sub-ids
(e.g. service-service, alb-targetgroup). terraform validate failed:
'No module call name'. Fix: name merged module by the composition child
id (common-prefix heuristic), build id_remap, rewrite stack-output 'from'
ids + ref: input targets through id_remap before emitting. terraform
validate now succeeds for the microservice stack. Adapter 236->192 lines
(still < 200 line gate).
CAP-017 (REQ-130): regression probe required locals.tf for every L1 module,
but the rds module legitimately omits it (no local.* refs). Fix: make
locals.tf conditional on the module referencing local.* values.
CAP-018 (REQ-130): regression probe called LocalLambdaStub() with no args,
but the dataclass requires an outbox field (since P53). Fix: construct a
FlatFileOutbox and pass it.
Regression gate (D-091) re-run: 22/22 Verified, 0 Broken. The decks can
now honestly claim 22/22 Verified (PRE_MORTEM.md FM-3 mitigation).
Layer 1 (Structural): all 8 plan-referenced files exist; imports resolve;
no TODO/stub placeholders; all declared exports present. PASS.
Layer 2 (Behavioral): 518 tests pass (513 fast + 5 slow); REQ-112..115
all complete; regression gate 16/16 Verified. PASS.
Layer 3 (Security/STRIDE): all 6 threats low-severity; auto-accepted.
No creds logged; loopback-only binding; monkey-patches scoped to local
tier. PASS.
Layer 4 (Quality): 0 P0, 0 P1, 1 P2 (post-hoc: expand regression
registry to uptime-kuma + RDS stacks). Gate can't be bypassed; local
E2E can't mutate cloud; no injection vectors. PASS.
Verdict: VERIFY PASS. v1.10 ready to ship.
---ci---
project: acdl
phase: 0
milestone: v1.10
status: verify
requirements:
covered: [REQ-112, REQ-113, REQ-114, REQ-115]
partial: []
lessons:
- The regression gate (D-091) is the durable fix for the diff-scoped
VERIFY defect; it must run at every milestone completion to catch
capability decay before it hides behind docs-only NFR patches.
- Local emulating adapters (D-092) make the platform testable without
cloud credentials; the local tier is now the regression baseline.
- 6 IAM-gated cloud resources cannot be auto-verified (chicken-and-egg);
the terraform plan path is the strongest verification possible
without terraform apply (a deploy-class autonomy escalation).
---/ci---
The platform is now fully locally testable without cloud credentials.
The headline E2E (contract -> resolver -> adapter -> S3 state -> ECS
service -> DynamoDB outbox -> contract-ingestor Lambda) runs end-to-end
against the local emulating tier (D-092, REQ-113).
Four local emulating adapters in core/local_emulators.py:
- FlatFileOutbox: flat-file DynamoDB outbox emulator (hash-chained JSONL;
resumable across instances; chain verification).
- LocalEcsEmulator: local ECS Fargate HTTP 200 emulator (free-port
binding on 127.0.0.1; health check; clean destroy).
- LocalS3StateBackend: rewrites the terraform S3 backend to a local
backend (per-stack tfstate in a temp folder).
- LocalLambdaStub: invokes the contract_ingestor handler in-process
(patches _get_dynamodb / _get_secrets_client / urllib.urlopen;
DynamoDB writes redirected to the FlatFileOutbox).
run_platform.sh gains a --local flag that short-circuits to the local
emulating tier (no AWS, no Checkov, no DynamoDB).
Regression gate (D-091) now covers 12 capabilities (was 10): +CAP-011
(local E2E microservice) + CAP-012 (local E2E static-assets).
Verified: 513 fast tests pass (was 502; +11 new). 2 slow local E2E
tests pass. run_regression.sh reports 12/12 Verified. run_platform.sh
--local exits 0 with LOCAL E2E OK. No AWS credentials required.
---ci---
project: acdl
phase: 53
milestone: v1.10
status: verify
requirements:
covered: [REQ-113]
partial: []
decisions: [D-092]
regression:
- { capability: CAP-011, status: Verified }
- { capability: CAP-012, status: Verified }
---/ci---