--- project: acdl milestone: v1.11 generated_at: 2026-07-28 generator: lead-developer supersedes: v1.9 PERSONAS.md (lambda-engineer reactivated for v1.11; new cost-engineer persona added for the AWS spend tier) verification_toolchain: typecheck: "terraform validate && python3 -m py_compile core/**/*.py && python3 -m jsonschema schemas/*.schema.json" test: "scripts/verify_phaseNN.sh" build: "terraform init" note: | ACDL has no package.json. The execute/verify/ship workflows substitute `terraform validate` + `python -m py_compile` + JSON Schema validation (`python -m jsonschema` or `ajv`) for npm run typecheck, a per-phase verify script for npm test, and `terraform init` for npm run build. 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.9) ## Active personas ### lead-developer - **Domain:** coordination - **Active:** true - **Phase-specific:** false - **Frameworks:** (none) - **Constraints:** pragmatic, battle-tested defaults, no-cross-territory-edits, vision-is-source-of-truth-for-why - **Territory:** `.ciagent/**`, `scripts/verify_phase*.sh`, `README.md`, `docs/**` (meta only — not architecture authoring), `.gitignore` - **Reason:** Owns CIAgent metadata, cross-phase verification scripts, and the v1.7 phase orchestration. Resolves the 12-scope-axis decomposition (D-048→D-060) and arbitrates persona conflicts. ### backend-engineer - **Domain:** backend - **Active:** true - **Phase-specific:** false - **Frameworks:** python, json-schema, gitea-actions, act_runner, bash, yaml, github-actions - **Constraints:** contract-schema-first, fail-fast-with-reason-codes, no-long-lived-credentials, severity-to-penalty-mapping-immutable - **Territory:** `core/confidence_signal.py`, `core/contract_resolver.py`, `core/outbox_writer.py`, `core/output_publisher.py`, `core/environment_check.py`, `schemas/**` (contract + IR + PolicyCheckResult + tagging-standard + pipeline), `contracts/**` (sample contracts), `.gitea/workflows/**` + `.github/workflows/**` (pipeline + deploy + platform-test + primitives-plan + patterns-plan + release), `pipelines/**`, `scripts/run_ci.sh`, `scripts/run_platform.sh`, `scripts/post_stage_comment.sh`, `scripts/run_primitive_plan.sh`, `scripts/run_pattern_plan.sh` - **Reason:** Owns the contract schema, contract→IR resolution, the confidence signal (6 inputs + severity mapping), the DynamoDB outbox writer, the output publisher (SSM + GitHub comment), the central pipeline workflows (CI + deploy + platform-test + primitives-plan + patterns-plan + release), and the deploy-pipeline DX (stage comments, error-report step). ### platform-engineer (custom) - **Domain:** infra - **Active:** true - **Phase-specific:** false - **Frameworks:** terraform, aws-iam, aws-s3, aws-dynamodb, aws-lambda, aws-cloudfront, aws-waf, aws-ssm, aws-secretsmanager, oidc, json-schema - **Constraints:** ir-is-engine-agnostic, adapter-is-only-engine-specific-code, state-in-s3+dynamodb-single-region, oidc-only-no-long-lived-keys (waiver D-034 for bootstrap), terraform-plan-only-in-spike, cross-account-iam-scoped-via-abac - **Territory:** `adapters/terraform/**`, `modules/**` (l1 + l2 + registry.json + examples), `terraform/**` (state backend, provider config, platform infra), `modules/registry.json` - **Reason:** Owns the Target Stack IR, the L1/L2 IR-typed modules (incl. new cloudfront + waf + rds primitives), the Terraform adapter (TYPE_MAP expansion for cloudfront/waf/rds), the AWS OIDC bootstrap, the state backend, and the platform Terraform (Lambda + DynamoDB + KMS + Secrets Manager + Function URL). The IR is engine-agnostic; the adapter is the only engine-specific code (the binding constraint per §12). ### security-engineer (custom) - **Domain:** security - **Active:** true - **Phase-specific:** false - **Frameworks:** aws-iam, oidc, checkov, kyverno, wiz, json-schema - **Constraints:** least-privilege, separation-of-duties-identity-distinctness, no-secrets-in-skill-markdown, audit-chain-extends-not-tears-up, critical-finding-hard-overrides-confidence, required-tags-enforced - **Territory:** `core/hitl_matrix_design.md`, `core/audit_ledger_design.md`, `adapters/terraform/policy/**` (Checkov adapter + custom rules), `adapters/wiz/**` (Wiz adapter), `adapters/kyverno/**` (Kyverno adapter + sample policies), `core/separation_of_duties.py`, `schemas/tagging-standard.json`, `schemas/policy_check_result.schema.json` (engine enum) - **Reason:** Owns the HITL matrix design, separation-of-duties, the audit ledger design, the Checkov→PolicyCheckResult adapter + the custom tagging rule (D-054, D-043 closure), the Wiz adapter (D-052), the Kyverno adapter (D-053), and the tagging standard. Enforces the "Safety is Computed, Not Assumed" + "Audit truth lives outside the repository" vision tenets. ### lambda-engineer (custom, v1.9, reactivated v1.11) - **Domain:** serverless - **Active:** true - **Phase-specific:** true (reactivated for v1.11 Phases 56/57/58; removed after milestone COMPLETE) - **Frameworks:** python, aws-lambda, boto3, dynamodb, aws-secretsmanager, aws-sns, github-api, gitea-api - **Constraints:** lambda-is-stateless, dynamodb-is-the-state-store, secrets-from-secrets-manager-never-logged, idempotent-actions, cross-account-iam-via-abac, forge-agnostic-api-urls, sns-topic-arn-from-env - **Territory:** `core/lambda/**` (contract_ingestor.py + handler), `terraform/platform/main.tf` (Lambda + Function URL + DynamoDB + KMS + Secrets Manager + IAM + acdl-change-requests table + acdl-sod-halt SNS topic), `terraform/platform/consumer_invoke_policy.json`, `terraform/platform/variables.tf` - **Reason:** Reactivated for v1.11 Phase 57 — CAP-018 (Lambda contract-ingestor deployed + invocable) needs the lambda-engineer to verify the live Lambda Function URL responds to an ingest request with a real record written to `acdl-contracts`. The persona is removed from the roster after v1.11 milestone COMPLETE (the code persists, but the persona is no longer active). ### frontend-engineer - **Domain:** frontend - **Active:** true - **Phase-specific:** false - **Frameworks:** vanilla-js, dom-api, fetch-api - **Constraints:** no-frameworks, single-file, fetch-from-same-origin-raw-url, relative-url-for-audit-json - **Territory:** `evidence-ui/**` (the timeline UI; pushed to `acdl-evidence`) - **Reason:** Owns the evidence timeline UI (`index.html`). Carried over from v1.0; the UI continues to render the audit stream. The v1.7 spike writes events to the DynamoDB outbox; the UI continues to read `audit.json` published to `acdl-evidence`. ### cost-engineer (custom, v1.11) - **Domain:** finops - **Active:** true - **Phase-specific:** true (created for v1.11 Phase 59; removed after milestone COMPLETE) - **Frameworks:** aws-cost-explorer, aws-billing, boto3-ce, markdown - **Constraints:** document-real-spend-not-estimates, cost-avoidance-via-local-emulators-primary-tier, teardown-is-mandatory-pre-complete (D-096), no-permanent-live-spend-beyond-milestone-window, per-service-breakdown-not-lump-sum - **Territory:** `.ciagent/COST.md` (new), `scripts/query_aws_spend.py` (new, Phase 59), `.ciagent/REGRESSION_REPORT.md` (cost-section addendum only) - **Reason:** Created for v1.11 Phase 59 (REQ-119, G-008 escalation). Owns the Cost Explorer query + the COST.md document + the teardown-cost-ceiling guidance for downstream clones. Distinct from platform-engineer (which owns infra-as-code but not the spend accounting) and from lead-developer (which owns `.ciagent/` metadata but the cost doc is a finops deliverable, not pure metadata). Removed after milestone COMPLETE; COST.md persists but the persona is inactive going forward. ## Deactivated personas ### infra-stub-engineer (custom, v1.0 only) - **Domain:** backend - **Active:** false - **Reason:** Owned L1 stub modules (`modules/l1/**`) in the v1.0 demo. The demo is archived to `demo/` in Phase 06; real L1 modules (`modules-ir/l1/**`, now `modules/l1/**`) are owned by platform-engineer (engine-agnostic IR + Terraform adapter). The stub engineer is no longer needed. - **Phase-specific:** false (was v1.0) - **Territory (would have been):** `demo/modules/l1/**` ### data-engineer - **Domain:** data - **Active:** false - **Reason:** No ORM/persistence framework. The v1.7 contract-ingestion table is DynamoDB but accessed via boto3 inside `core/lambda/contract_ingestor.py` (owned by lambda-engineer); the outbox is DynamoDB accessed via `core/outbox_writer.py` (owned by backend-engineer); the audit ledger is S3 Object Lock + JWS (owned by security-engineer). No schema-migration layer, no ORM, no data-engineer territory. - **Phase-specific:** false - **Frameworks:** (would have been: drizzle, prisma) - **Constraints:** (would have been: schema-first, type-safe-orm) - **Territory:** (would have been: `**/db/**`, `**/migrations/**`) ## Phase-specific overrides | Phase | Personas active | Notes | |-------|------------------|-------| | 28 adapter-waf-and-resolver-outputs | platform-engineer (lead: WAF HCL fix + adapter output blocks), backend-engineer (resolver outputs processing) | security/lambda/frontend idle | | 29 ssm-kms-and-invoke-policy | backend-engineer (lead: SSM fail-loud), lambda-engineer (Terraform-rendered invoke policy), security-engineer (CMK enforcement review) | platform/frontend idle | | 30 run-platform-isolation-and-api-portability | backend-engineer (lead: run_platform.sh temp dir + deploy.yml static-key), lambda-engineer (forge-agnostic API URLs) | platform/security/frontend idle | | 31 encryption-by-default-and-per-stack-cmk | platform-engineer (lead: kms-key primitive + adapter expansion + L2 wiring), security-engineer (encryption NFR enforcement review) | backend/lambda/frontend idle | | 32 deletion-protection-by-default-and-l2-feature-flag | platform-engineer (lead: prevent_destroy emission + L2 feature flag), backend-engineer (contract schema update) | security/lambda/frontend idle | | 33 uptime-kuma-primitive | platform-engineer (lead: uptime primitive + adapter + separate state), backend-engineer (deploy-uptime pipeline stage + run_platform.sh + PR comment) | security/lambda/frontend idle | | 34 decommission-alias-and-cmdb-validation | backend-engineer (lead: decommission pipeline mode + run_platform.sh + consumer docs), lambda-engineer (validate_change_request + acdl-change-requests table), security-engineer (HITL SRE gates review) | platform/frontend idle | | 35 module-engineering-standards | lead-developer (lead: STANDARDS.md + catalog fix + template), platform-engineer (standards content review), backend-engineer (automated standards test) | security/lambda/frontend idle | | 36 schemas-adapters-pipelines-readmes | lead-developer (lead: 3 READMEs), backend-engineer (pipelines + schemas README content), platform-engineer (adapters README content) | security/lambda/frontend idle | | 37 verify | lead-developer (lead: 4-layer verification), all personas (review their territory) | — | | 38 review-audit-complete | lead-developer (lead: review + audit + milestone completion), all personas (review participation) | — | | 39 design-doc-refresh-and-p1-1-parameterization | security-engineer (lead: hitl_matrix_design.md + audit_ledger_design.md refresh), platform-engineer (lead: P1-1 adapter defaults → L1 interface.json inputs), backend-engineer (contract_resolver.py + env schema adjacent review) | lambda/frontend idle | | 40 contract-interpolation | backend-engineer (lead: _expand_vars in contract_resolver.py + environment.schema.json + sample contracts), platform-engineer (interface.json adjacent review) | security/lambda/frontend idle | | 41 per-environment-ci-jobs | backend-engineer (lead: deploy.yml environment input + run_platform.sh --environment + per-env contracts + caller-workflow docs), security-engineer (HITL gate structure review) | platform/lambda/frontend idle | | 42 stub-implementation | security-engineer (lead: route_halt_artifact SNS + hitl_gates.py + attestation_matrix.py + Wiz real client + Kyverno fleshed out), backend-engineer (run_platform.sh HITL gate wiring), lambda-engineer (acdl-sod-halt SNS topic in terraform/platform/main.tf) | platform/frontend idle | | 43 verify-review-audit-complete | lead-developer (lead: 4-layer verify + review + audit + milestone completion), all personas (review participation) | — | | 56 iam-re-bootstrap-and-deploy-grant | security-engineer (lead: least-privilege policy scope + IAM_POLICY.md), platform-engineer (terraform/bootstrap + spike_runner_policy.json extension + OIDC role re-creation) | backend/lambda/cost/frontend idle | | 57 live-deploy-verify-microservice | platform-engineer (lead: terraform apply microservice stack + ECS/ALB/VPC/ECR live), lambda-engineer (Lambda ingest probe + DynamoDB acdl-contracts describe), security-engineer (deploy escalation review) | backend/cost/frontend idle | | 58 live-deploy-verify-static-assets-uptime | platform-engineer (lead: terraform apply static-assets + CloudFront+WAF+S3 + uptime-kumo + poll loop), security-engineer (WAF ACL attachment review) | backend/lambda/cost/frontend idle | | 59 cost-documentation-from-billing | cost-engineer (lead: Cost Explorer query + COST.md + teardown-cost-ceiling guidance), lead-developer (.ciagent/ metadata review) | platform/backend/lambda/security/frontend idle | | 60 pre-mortem-doc | lead-developer (lead: PRE_MORTEM.md), security-engineer (failure-mode input — IAM drift + cost spike) | platform/backend/lambda/cost/frontend idle | | 61 teardown-deployed-stacks | platform-engineer (lead: D-070 decommission mode 2-step + HITL SRE gates), security-engineer (delete_data escalation review), lambda-engineer (Lambda + DynamoDB teardown if not torn down by terraform destroy) | backend/cost/frontend idle | | 62 decks-to-deploy-verified-reality | lead-developer (lead: CAPABILITY_INVENTORY.md + PROJECT.md + decks + HTML re-render + PPTX), cost-engineer (cost appendix slide content), security-engineer (deploy-unverified→Verified transition review) | platform/backend/lambda/frontend idle | | 63 verify-review-audit-complete | lead-developer (lead: 4-layer verify + review + ship v1.11.0 + audit + milestone completion), all personas (review participation) | — | ## Domain priority (used by TaskDecomposer) `coordination → security → platform → backend → lambda → cost → frontend` Rationale: in v1.11, the binding constraints are the IAM re-bootstrap (security owns least-privilege policy scope), the live terraform apply (platform owns the stacks), the Lambda ingest verification (lambda owns the live probe), the cost documentation (cost owns the spend query + COST.md), and the deck rewrite (lead-developer owns `.ciagent/` + the deck edits). frontend is unchanged from v1.0 (evidence timeline, idle this milestone). ## Conflict resolutions (lead-developer arbitration) - `backend-engineer` vs `platform-engineer` over `schemas/ir.schema.json` + `schemas/stack.schema.json`: platform-engineer owns the IR (engine-agnostic but infra-shaped); backend-engineer owns the contract schema and the contract→IR resolution. Co-authoring is expected; conflict goes to lead-developer. - `backend-engineer` vs `security-engineer` over `core/confidence_signal.py`: security-engineer owns the severity→penalty mapping + critical-override semantics; backend-engineer owns the 6-input weighted sum + per-env thresholds. Co-owned; conflicts go to lead-developer. - `platform-engineer` vs `security-engineer` over `adapters/terraform/policy/**`: security-engineer owns the Checkov→PolicyCheckResult adapter + custom rules + the Wiz/Kyverno adapters (policy is a security concern); platform-engineer owns the Terraform adapter (engine translation). No overlap. - `lambda-engineer` vs `platform-engineer` over `terraform/platform/main.tf`: lambda-engineer owns the Lambda + DynamoDB + Secrets Manager definitions; platform-engineer reviews the Terraform structure + state backend. Co-authoring expected; conflicts go to lead-developer. - `backend-engineer` vs `lambda-engineer` over `core/lambda/contract_ingestor.py` vs `scripts/run_platform.sh` + `.github/workflows/deploy.yml` error-report step: lambda-engineer owns the Lambda handler; backend-engineer owns the workflow step that invokes it. The interface (the JSON payload) is co-authored; conflicts go to lead-developer. - `lead-developer` vs any: lead-developer owns `.ciagent/**` + `docs/**` meta + verification scripts; 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 IAM + deploy + teardown scope means co-authoring across territories is likely (e.g. security + platform on `spike_runner_policy.json`; lambda + platform on `terraform/platform/main.tf`); `warn` keeps it frictionless.