Files
acdl/.ciagent/PERSONAS.md
T
Jon Chery 7f1eff622d docs(P22-38): research findings + 6 phase plans
---ci---
project: acdl
phase: 22-38
milestone: v1.8
status: research
---/ci---

v1.8 research: 6 targets investigated + 5 decisions surfaced (D-073..D-077).

TARGET 1: uptime-kuma on ECS Fargate (image louislam/uptime-kuma:1,
port 3001, EFS volume, ALB, monitor seeding via post-deploy API script).
TARGET 2: Terraform prevent_destroy lifecycle (2-step decommission pattern).
TARGET 3: AWS KMS rotation (enable_key_rotation=true, annual AWS-managed;
90-day is roadmap item D-075).
TARGET 4: Forge-agnostic API URLs (GITHUB_API_BASE + _forge_type helper).
TARGET 5: DynamoDB as CMDB (acdl-change-requests table + validate_change_request).
TARGET 6: Module engineering standards scan (codified patterns from 12 modules).

PERSONAS.md updated for v1.8: lambda-engineer reactivated (D-068 CMDB +
D-065 API portability). 11 phase-specific overrides added.
2026-07-22 22:01:13 +00:00

12 KiB

project, milestone, generated_at, generator, verification_toolchain
project milestone generated_at generator verification_toolchain
acdl v1.8 2026-07-22 lead-developer
typecheck test build note
terraform validate && python3 -m py_compile core/**/*.py && python3 -m jsonschema schemas/*.schema.json scripts/verify_phaseNN.sh terraform init 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.8)

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-substrate-agnostic, adapter-is-only-substrate-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 substrate-agnostic; the adapter is the only substrate-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.8)

  • Domain: serverless
  • Active: true
  • Phase-specific: true (reactivated for v1.8; removed after milestone COMPLETE)
  • Frameworks: python, aws-lambda, boto3, dynamodb, aws-secretsmanager, 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
  • Territory: core/lambda/** (contract_ingestor.py + handler), terraform/platform/main.tf (Lambda + Function URL + DynamoDB + KMS + Secrets Manager + IAM + acdl-change-requests table), terraform/platform/consumer_invoke_policy.json, terraform/platform/variables.tf
  • Reason: Reactivated for v1.8 Phase 29 (Terraform-rendered invoke policy), Phase 30 (forge-agnostic API URLs in contract_ingestor.py), Phase 34 (validate_change_request Lambda action + acdl-change-requests DynamoDB table). The Lambda is stateless; all state is in DynamoDB. Forge-agnostic API URLs (GitHub + Gitea) via GITHUB_API_BASE env var. Removed from the roster after 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.

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 (substrate-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)

Domain priority (used by TaskDecomposer)

coordination → security → platform → backend → lambda → frontend

Rationale: in v1.8, the security commitments (encryption by default, KMS rotation, deletion protection, CMDB validation, HITL SRE gates) and the platform commitments (kms-key primitive, uptime primitive, adapter expansion, prevent_destroy emission) are the binding constraints; backend wires the pipeline + decommission mode + API portability; lambda owns the CMDB validation + forge-agnostic APIs; frontend is unchanged from v1.0 (evidence timeline).

Conflict resolutions (lead-developer arbitration)

  • backend-engineer vs platform-engineer over schemas/ir.schema.json + schemas/stack.schema.json: platform-engineer owns the IR (substrate-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 (substrate 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.7's broad scope means co-authoring across territories is likely (e.g. lambda + platform on terraform/platform/main.tf); warn keeps it frictionless.