---ci---
project: acdl
phase: 0
milestone: v1.9
status: research
---/ci---
RESEARCH.md v1.9 addendum:
- RA-1: interpolation prior art + ${env.<field>} syntax choice (D-081)
- RA-2: GitHub/Gitea Actions workflow_call environment input + per-env jobs (D-082)
- RA-3: Wiz GraphQL API shape + PolicyCheckResult mapping (REQ-110)
- RA-4: attestation matrix freshness validation + signed artifacts (D-084)
- RA-5: design doc drift audit (hitl_matrix + audit_ledger)
- RA-6: P1-1 adapter hardcoded defaults audit (D-085)
New decisions surfaced: D-087 (recursive expansion), D-088 (env override
pre-validation), D-089 (signature skip when signing key unset).
PERSONAS.md updated for v1.9: milestone field, lambda-engineer
reactivated (SNS topic), phase-specific overrides for phases 39-43,
domain priority updated.
14 KiB
project, milestone, generated_at, generator, verification_toolchain
| project | milestone | generated_at | generator | verification_toolchain | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| acdl | v1.9 | 2026-07-23 | lead-developer |
|
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-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.9)
- Domain: serverless
- Active: true
- Phase-specific: true (reactivated for v1.9; 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.9 Phase 42 (acdl-sod-halt SNS topic for
route_halt_artifact, defined interraform/platform/main.tf). 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 toacdl-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 readaudit.jsonpublished toacdl-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 todemo/in Phase 06; real L1 modules (modules-ir/l1/**, nowmodules/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 viacore/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) | — |
Domain priority (used by TaskDecomposer)
coordination → security → platform → backend → lambda → frontend
Rationale: in v1.9, the security commitments (HITL gates, attestation matrix, SoD halt artifact, Wiz/Kyverno adapters) and the design-doc accuracy are the binding constraints; platform owns the P1-1 adapter parameterization + L1 interface inputs; backend owns the contract interpolation + per-env CI jobs + the deploy workflow env input; lambda owns the SNS topic Terraform; frontend is unchanged from v1.0 (evidence timeline).
Conflict resolutions (lead-developer arbitration)
backend-engineervsplatform-engineeroverschemas/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-engineervssecurity-engineerovercore/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-engineervssecurity-engineeroveradapters/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-engineervsplatform-engineeroverterraform/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-engineervslambda-engineerovercore/lambda/contract_ingestor.pyvsscripts/run_platform.sh+.github/workflows/deploy.ymlerror-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-developervs 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.