fee59944fd
---ci---
project: acdl
phase: 0
milestone: v1.7
status: specify
---/ci---
v1.7 milestone: production platform + contract ingestion + pipeline
maturation. 12 user-directed scope axes (2026-07-22):
1. rename static-asset -> static-assets (D-048)
2. production-ready static-assets stack (cloudfront + waf, D-049)
3. DX-friendly deploy outputs (SSM + PR comment, D-050)
4. central pipeline error reporting via Lambda (D-055)
5. PR comments after every successful stage
6. three platform pipelines (platform-test, primitives-plan, patterns-plan)
7. release job with semver + MAJOR.MINOR/MAJOR tag updates (D-057)
8. platform Lambda + DynamoDB contract ingestion (D-051)
9. tagging standards (Checkov custom rule, D-054, D-043 closure)
10. Wiz adapter (D-052)
11. Kyverno adapter (D-053)
12. remove consumer-repos + validated per-module examples (D-058) + RDS
primitive (D-059)
6 phases (22-27), 14 requirements (REQ-62..REQ-75).
Ship tag: v1.7.0 (feature milestone, next minor; v1.6 shipped v1.6.0).
127 lines
11 KiB
Markdown
127 lines
11 KiB
Markdown
---
|
|
project: acdl
|
|
milestone: v1.7
|
|
generated_at: 2026-07-22
|
|
generator: lead-developer
|
|
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.7)
|
|
|
|
## 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.7)
|
|
- **Domain:** serverless
|
|
- **Active:** true
|
|
- **Phase-specific:** true (created for v1.7; removed after milestone COMPLETE)
|
|
- **Frameworks:** python, aws-lambda, boto3, dynamodb, aws-secretsmanager, github-api
|
|
- **Constraints:** lambda-is-stateless, dynamodb-is-the-state-store, secrets-from-secrets-manager-never-logged, idempotent-actions, cross-account-iam-via-abac
|
|
- **Territory:** `core/lambda/**` (contract_ingestor.py + handler), `terraform/platform/main.tf` (Lambda + Function URL + DynamoDB + KMS + Secrets Manager + IAM), `terraform/platform/consumer_invoke_policy.json`
|
|
- **Reason:** Owns the platform Lambda for contract ingestion (D-051) + error reporting (D-055). The Lambda is stateless; all state is in DynamoDB. The Lambda holds a GitHub token (Secrets Manager) scoped to the platform repo. Cross-account invocation is scoped via ABAC. Created for v1.7; the role is 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 |
|
|
|-------|------------------|-------|
|
|
| 22 rename-and-production-static-assets-stack | lead-developer, platform-engineer (lead: rename + cloudfront/waf primitives + adapter), backend-engineer (contract schema + pipelines), security-engineer (review new primitives) | lambda/frontend idle |
|
|
| 23 tagging-standards-and-security-adapters | security-engineer (lead: tagging rule + Wiz + Kyverno), platform-engineer (custom rule loading), backend-engineer (schema enum) | lambda/frontend idle |
|
|
| 24 platform-lambda-and-contract-ingestion | lambda-engineer (lead: Lambda + DynamoDB + Terraform), platform-engineer (Terraform infra review), security-engineer (cross-account IAM review), backend-engineer (onboarding docs) | frontend idle |
|
|
| 25 deploy-pipeline-dx-outputs-and-error-reporting | backend-engineer (lead: outputs + stage comments + error-report step), lambda-engineer (report_error action), security-engineer (no-secrets-in-logs review) | platform/frontend idle |
|
|
| 26 platform-pipelines-and-release-automation | backend-engineer (lead: 3 pipelines + release job), lead-developer (verification scripts) | platform/security/lambda/frontend idle |
|
|
| 27 remove-consumer-repos-and-module-documentation-examples | lead-developer (lead: examples + docs), platform-engineer (RDS primitive + adapter), backend-engineer (schema-validation) | security/lambda/frontend idle |
|
|
|
|
## Domain priority (used by TaskDecomposer)
|
|
|
|
`coordination → security → platform → backend → lambda → frontend`
|
|
|
|
Rationale: in v1.7, the security commitments (tagging, Wiz, Kyverno, cross-account IAM) and the platform commitments (CloudFront, WAF, RDS, Lambda, DynamoDB) are the binding constraints; backend wires the pipeline + outputs; lambda owns the ingestion + error reporting; frontend surfaces the evidence (unchanged from v1.0).
|
|
|
|
## 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. |