--- project: acdl milestone: v1.11 generated_at: 2026-07-28 generator: lead-developer verification_toolchain: typecheck: "terraform validate && python3 -m py_compile core/**/*.py && python3 -m jsonschema schemas/*.schema.json" test: "bash scripts/run_primitive_plan.sh --check-only # pipeline-driven (D-102); no per-module pytest" build: "terraform init && terraform plan" note: | ACDL has no package.json. The execute/verify/ship workflows substitute `terraform validate` + `python -m py_compile` + JSON Schema validation for npm run typecheck, a per-phase verify script (or the modules-lifecycle pipeline cell) for npm test, and `terraform init` + `terraform plan` for npm run build. v1.11 testing is pipeline-driven (D-102): the modules-lifecycle pipeline matrix-runs each L1 module's examples/{simple,complex}.yml contracts through apply→modify→destroy against live AWS. No per-module Python/pytest. This override is documented here as the single source of truth; the ci-* agents read PERSONAS.md before running verification commands. --- # ACDL — Persona Roster (project-level, v1.11 RESTART) > v1.11 is a restart (D-097). The v1.9 roster is superseded. Three > structural corrections: (1) stateless adapter (D-098), (2) terraform > owns lifecycle (D-101), (3) pipeline-driven testing (D-102). The roster > is simplified to the three active domains: data (terraform foundation), > backend (adapter/resolver), general (pipelines/workflows). ## Active personas ### lead-developer - **Domain:** coordination - **Active:** true - **Phase-specific:** false - **Reason:** Owns CIAgent metadata, cross-phase verification scripts, the v1.11 phase orchestration (D-107: P56a + P56b split), and arbitrates persona conflicts. Resolves the milestone decomposition and the STANDARDS.md §8 rewrite (the adapter extension pattern is replaced by the per-module terraform subdir pattern). ### backend-engineer - **Domain:** backend - **Active:** true - **Phase-specific:** false - **Reason:** Owns the adapter rewrite (D-098: stateless assembler — deletes TYPE_MAP/INPUT_MAP/OUTPUT_MAP + 39 type-specific branches, becomes a ~80-line assembler that emits `module "x" { source = "..." ... }` blocks) and the contract resolver env-aware state keys (D-106: `spike/{id}/{env}/terraform.tfstate`). The adapter holds no module content; the engine binding lives in the per-module `terraform/` subdir. Co-authoring expected on the adapter + `run_platform.sh` boundary (general adds `--apply`/`--destroy` modes that invoke the adapter). - **Territory:** `adapters/terraform/adapter.py` (rewrite to stateless assembler), `core/contract_resolver.py` (env-aware state keys, deterministic composition), `schemas/stack.schema.json` (if the stack instance shape changes), `tests/test_adapter*.py` (regression baseline — the s3 instance.json round-trip must still pass). ### data-engineer - **Domain:** data - **Active:** true - **Phase-specific:** false - **Reason:** Reactivated for v1.11. Owns the heaviest territory: the per-module `terraform/` subdirs (D-098/D-099/D-100 — the engine binding) for all 12 L1 modules, plus the single platform VPC (D-105: `terraform/platform` owns ONE VPC; the microservice composition drops its `vpc` child and references the platform VPC via data source). Each L1 module ships a real terraform module dir (versions/variables/locals/main/outputs.tf) owning its resource shape, nested blocks, and defaults. `locals.tf` is used heavily to centralize default interpolation (D-099). Multi-resource modules get the full 5-file split; trivial single-resource modules may inline locals in main.tf. This is the binding constraint — the stateless adapter cannot be written until the reference s3 module exists (D-107: P56a proves the design with s3 first). - **Territory:** `terraform/` (platform VPC, D-105), `modules/l1/*/terraform/` (per-module terraform subdirs — the engine binding), `modules/l1/*/interface.json` (defaults move from adapter to interface inputs), `modules/registry.json` (terraform_dir field), `modules/l2/microservice/composition.json` (drop the vpc child, D-105), `modules/STANDARDS.md` §8 (rewrite the adapter extension pattern → per-module terraform subdir pattern). ### general (lead-developer + backend-engineer pipeline work) - **Domain:** coordination + pipelines - **Active:** true - **Phase-specific:** false - **Reason:** Owns the pipeline-driven testing (D-102/D-103/D-104) and the terraform lifecycle modes (D-101). The modules-lifecycle pipeline (Gitea + GitHub, byte-identical) matrix-runs each L1 module's `examples/{simple,complex}.yml` contracts through apply→modify→destroy against live AWS. `run_platform.sh` gains `--apply` and `--destroy` modes; Python never runs terraform. `verify_deploy_microservice.py` is deleted (D-101). Co-authoring expected on the `run_platform.sh` boundary (backend-engineer rewrites the adapter that `run_platform.sh` invokes). - **Territory:** `pipelines/modules-lifecycle.yml`, `.gitea/workflows/modules-lifecycle.yml` + `.github/workflows/modules-lifecycle.yml` (byte-identical, D-102), `scripts/run_platform.sh` (`--apply`/`--destroy` modes, D-101), `scripts/run_primitive_plan.sh` (if extended for lifecycle), `scripts/run_pattern_plan.sh` (if extended), `pipelines/README.md` (document the new pipeline), `schemas/deploy-pipeline.schema.json` (if the lifecycle stages are added to the contract). ## Deactivated personas ### lambda-engineer (custom, v1.9 — deactivated for v1.11) - **Domain:** serverless - **Active:** false - **Phase-specific:** false - **Reason:** No per-module Python this milestone (D-102: testing is pipeline-driven, not pytest). The v1.9 Lambda (`core/lambda/contract_ingestor.py`) and the `terraform/platform/main.tf` Lambda/DynamoDB/KMS/Secrets definitions persist from v1.9 but are not touched in v1.11. The `acdl-sod-halt` SNS topic and the attestation matrix are out of scope. Removed from the roster for v1.11; reactivates if a future milestone touches the Lambda. ### platform-engineer (custom, v1.9 — folded into data-engineer for v1.11) - **Domain:** infra - **Active:** false - **Phase-specific:** false - **Reason:** The v1.11 scope (D-097..D-107) is terraform module authoring + adapter rewrite + pipelines — not the v1.9-era L1/L2 IR-typed module authoring or the AWS OIDC bootstrap. The platform-engineer's v1.9 territory (`adapters/terraform/**`, `modules/**`, `terraform/**`) is split: the adapter goes to backend-engineer (rewrite), the per-module terraform subdirs + platform VPC go to data-engineer (the heaviest v1.11 work). Folded into data-engineer for v1.11; reactivates if a future milestone does IR-shaped module authoring or OIDC bootstrap work. ### security-engineer (custom, v1.9 — deactivated for v1.11) - **Domain:** security - **Active:** false - **Phase-specific:** false - **Reason:** The v1.11 scope does not touch Wiz/Kyverno/Checkov adapters, the HITL matrix, separation-of-duties, or the audit ledger. The security-engineer's v1.9 territory persists but is not touched. Removed from the roster for v1.11; reactivates if a future milestone touches security adapters or HITL gates. ### frontend-engineer - **Domain:** frontend - **Active:** false - **Phase-specific:** false - **Reason:** The evidence timeline UI (`evidence-ui/**`) is unchanged from v1.0 and not touched in v1.11. Removed from the active roster; reactivates if a future milestone touches the timeline UI. ### data-engineer (v1.9 — was deactivated, reactivated for v1.11) - **Domain:** data - **Active:** true (reactivated) - **Phase-specific:** false - **Reason:** See the active `data-engineer` entry above. The v1.9 deactivation rationale ("No ORM/persistence framework") no longer applies — v1.11's data-engineer owns terraform module authoring, not a data persistence layer. ### infra-stub-engineer (custom, v1.0 only) - **Domain:** backend - **Active:** false - **Reason:** Owned L1 stub modules in the v1.0 demo. The demo is archived to `demo/`; real L1 modules are owned by data-engineer (v1.11). Not reactivated. ## Phase-specific overrides | Phase | Personas active | Notes | |-------|------------------|-------| | 56a adapter-rewrite-and-s3-reference-module | data-engineer (lead: s3 reference terraform module — proves the design), backend-engineer (lead: stateless adapter rewrite — emits module blocks for s3), general (run_platform.sh --apply/--destroy skeleton) | security/lambda/frontend idle | | 56b remaining-11-l1-module-terraform-subdirs | data-engineer (lead: author 11 L1 module terraform subdirs — vpc, ecs-cluster, ecs-service, iam-role, alb, ecr, cloudfront, waf, rds, kms-key, uptime), backend-engineer (adapter: confirm each module round-trips through the assembler), general (modules-lifecycle pipeline wiring) | security/lambda/frontend idle | | (modules-lifecycle pipeline) | general (lead: byte-identical Gitea+GitHub workflow + matrix apply→modify→destroy), data-engineer (examples/{simple,complex}.yml contracts as the modify variants), backend-engineer (adapter confirms the lifecycle cells resolve) | security/lambda/frontend idle | | (platform VPC + composition drop) | data-engineer (lead: terraform/platform VPC + microservice composition drops vpc child, D-105), backend-engineer (resolver: env-aware state keys, D-106) | general/security/lambda/frontend idle | | verify | lead-developer (lead: 4-layer verification), all active personas (review their territory) | — | | review-audit-complete | lead-developer (lead: review + audit + milestone completion), all active personas (review participation) | — | ## Domain priority (used by TaskDecomposer) `data → backend → general` Rationale: in v1.11, the terraform foundation (per-module `terraform/` subdirs + platform VPC) is the binding constraint — the stateless adapter cannot be written until the reference s3 module exists (D-107: P56a proves the design with s3 first). Backend (adapter/resolver) follows once the module shape is proven. General (pipelines/workflows) wires the lifecycle modes last, once the adapter + modules produce valid terraform. ## Conflict resolutions (lead-developer arbitration) - `backend-engineer` vs `data-engineer` over `modules/l1/*/interface.json`: data-engineer owns the interface defaults (defaults move from the adapter to the interface inputs, D-100); backend-engineer owns the adapter that reads them. Co-authoring is expected; conflict goes to lead-developer. - `backend-engineer` vs `general` over `scripts/run_platform.sh`: backend-engineer rewrites the adapter that `run_platform.sh` invokes; general adds the `--apply`/`--destroy` modes. The interface (the CLI flags + the adapter invocation) is co-authored; conflicts go to lead-developer. - `data-engineer` vs `general` over `modules/l1/*/examples/`: data-engineer owns the example contracts (the modify variants, D-103); general owns the pipeline that matrix-runs them. Co-authoring is expected; conflicts go to lead-developer. - `lead-developer` vs any: lead-developer owns `.ciagent/**` + `docs/**` meta + verification scripts + `modules/STANDARDS.md` §8 rewrite; persona engineers do not edit CIAgent metadata or the vision/architecture source docs. ## Territory enforcement mode `warn` — config.json has no `personas.territory_enforcement` field, so the default per execute.md is `warn`. Cross-territory edits are logged in the commit message but do not fail the task. v1.11's scope means co-authoring across territories is likely (e.g. backend + general on the adapter + `run_platform.sh` boundary; data + general on the examples + pipeline boundary); `warn` keeps it frictionless.