docs(init): validate v1.8 specification
---ci--- project: acdl phase: 0 milestone: v1.8 status: specify ---/ci--- v1.8 specification validated. 11 phases (28-38), 24 new requirements (REQ-76..99). Three tracks: P1 remediation (P1-3..P1-9 + S1), encryption + deletion protection by default + decommission alias, uptime monitoring + engineering standards + path documentation. Feature milestone, ship tag v1.8.0.
This commit is contained in:
@@ -236,6 +236,66 @@ to a production-grade platform. 12 user-directed scope axes (2026-07-22):
|
|||||||
Milestone COMPLETE gate: review → ship `v1.7.0` (feature milestone, next
|
Milestone COMPLETE gate: review → ship `v1.7.0` (feature milestone, next
|
||||||
minor per ship.md — v1.6 shipped `v1.6.0`) → audit.
|
minor per ship.md — v1.6 shipped `v1.6.0`) → audit.
|
||||||
|
|
||||||
|
## Objective for Milestone v1.8 (active)
|
||||||
|
|
||||||
|
P1 remediation + uptime monitoring + engineering standards + encryption
|
||||||
|
and deletion-protection by default + decommission alias + documentation.
|
||||||
|
The v1.7 milestone shipped production platform + contract ingestion but
|
||||||
|
left 8 P1 issues flagged for post-hoc review. v1.8 clears all of them
|
||||||
|
AND delivers three user-directed feature/NFR tracks (2026-07-22):
|
||||||
|
|
||||||
|
**Track 1 — P1 Remediation (Phases 28–30):**
|
||||||
|
Clear all 8 pending P1 issues from v1.5/v1.6/v1.7 verify reviews:
|
||||||
|
- P1-3: SSM uses AWS-managed key silently → fail loud without CMK config
|
||||||
|
- P1-4: WAF custom rules emit invalid HCL (attribute vs block syntax)
|
||||||
|
- P1-5: WAF default_action input silently ignored
|
||||||
|
- P1-6: consumer_invoke_policy.json has placeholder account ID
|
||||||
|
- P1-7: L2 composition outputs section not implemented in resolver
|
||||||
|
- P1-8: terraform/spike/*.tf overwritten by run_platform.sh (state
|
||||||
|
contamination)
|
||||||
|
- P1-9: GitHub API URLs hardcoded in contract_ingestor.py (Gitea fails
|
||||||
|
silently)
|
||||||
|
- S1: Deploy workflow static-key override not wired (passes ACDL_AWS_*
|
||||||
|
env vars to configure-aws-credentials which reads AWS_*/its own inputs)
|
||||||
|
|
||||||
|
**Track 2 — Encryption + Deletion Protection by Default (Phases 31–32):**
|
||||||
|
All primitives encrypted by default (CMK priority + SSE, managed KMS
|
||||||
|
fallback). Per-stack CMK (one key per L2 deployment, 90-day rotation,
|
||||||
|
no shared keys). Deletion protection on by default for every primitive.
|
||||||
|
L2 modules expose a feature flag to turn off deletion protection. A
|
||||||
|
decommission alias uses a 2-step pipeline (disable deletion protection
|
||||||
|
→ zero counts → destroy) with HITL SRE gates and CMDB-validated change
|
||||||
|
request ID.
|
||||||
|
|
||||||
|
**Track 3 — Uptime + Standards + Docs (Phases 33–36):**
|
||||||
|
A new uptime-kuma primitive (ECS Fargate) deployed by default after any
|
||||||
|
L2 module deploy (separate terraform state), with a feature flag to
|
||||||
|
disable. Monitored endpoints passed from L2 outputs. Alert channels
|
||||||
|
(Teams/email/SMS/GitHub issues). The uptime URL published to consumers
|
||||||
|
via PR comments. Engineering standards for L1 + L2 module authoring
|
||||||
|
(scanned from current modules, stored in modules/). READMEs for
|
||||||
|
schemas/, adapters/, pipelines/ paths documenting how to write, wire,
|
||||||
|
and test each.
|
||||||
|
|
||||||
|
## Milestone v1.8 Phases
|
||||||
|
|
||||||
|
| Phase | Name | Goal |
|
||||||
|
|-------|------|------|
|
||||||
|
| 28 | adapter-waf-and-resolver-outputs | Fix WAF HCL emission (nested rules blocks + default_action input) + implement L2 composition outputs in resolver + adapter output blocks. P1-4, P1-5, P1-7. |
|
||||||
|
| 29 | ssm-kms-and-invoke-policy | SSM publisher fails loud without CMK (escape hatch for local) + Terraform-rendered consumer_invoke_policy (no placeholder account ID). P1-3, P1-6. |
|
||||||
|
| 30 | run-platform-isolation-and-api-portability | Adapter output to per-run temp dir (remove committed spike .tf) + forge-agnostic API URLs + deploy.yml static-key override wired. P1-8, P1-9, S1. |
|
||||||
|
| 31 | encryption-by-default-and-per-stack-cmk | KMS-key primitive + per-stack CMK wired in L2 modules + encryption NFRs on all primitives + managed KMS fallback. |
|
||||||
|
| 32 | deletion-protection-by-default-and-l2-feature-flag | Deletion protection NFR on all primitives (default true) + L2 feature flag + contract schema update. |
|
||||||
|
| 33 | uptime-kuma-primitive | Uptime L1 primitive (ECS Fargate, feature flag, monitored endpoints, alert channels) + deploy-uptime pipeline stage (separate state) + URL published via PR comment. |
|
||||||
|
| 34 | decommission-alias-and-cmdb-validation | Decommission mode on deploy pipeline (2-step: disable deletion protection → zero counts, HITL SRE gates) + DynamoDB CMDB validation + consumer guide docs. |
|
||||||
|
| 35 | module-engineering-standards | modules/STANDARDS.md (L1+L2 authoring + review standards scanned from current modules) + catalog index fix + template update + automated standards test. |
|
||||||
|
| 36 | schemas-adapters-pipelines-readmes | schemas/README.md + pipelines/README.md + adapters/README.md (how to write, wire, test, dependencies). |
|
||||||
|
| 37 | verify | 4-layer verification of all v1.8 phases. |
|
||||||
|
| 38 | review-audit-complete | Multi-persona review + audit + milestone completion (tag v1.8.0). |
|
||||||
|
|
||||||
|
Milestone COMPLETE gate: review → ship `v1.8.0` (feature milestone, next
|
||||||
|
minor per run.md — v1.7 shipped `v1.7.0`) → audit.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
### v1.0 (Prior milestone — the demo)
|
### v1.0 (Prior milestone — the demo)
|
||||||
|
|||||||
@@ -182,6 +182,46 @@
|
|||||||
- **REQ-74:** The legacy consumer-repos directory is deleted entirely (a v1.2 artifact removed in v1.7; references in `.ciagent/` historical narrative are rewritten per D-048). A recursive grep for the legacy directory name (excluding `.git/`) returns 0 hits.
|
- **REQ-74:** The legacy consumer-repos directory is deleted entirely (a v1.2 artifact removed in v1.7; references in `.ciagent/` historical narrative are rewritten per D-048). A recursive grep for the legacy directory name (excluding `.git/`) returns 0 hits.
|
||||||
- **REQ-75:** A new RDS primitive (`modules/l1/rds/`) with an `engine` input (enum: postgres, mysql, etc.) demonstrates multi-engine variation (D-059). Every module (primitives + patterns) has a `modules/<name>/examples/` directory with `simple.yaml` + `complex.yaml` (+ variation files) validated against `schemas/contract.schema.json` in the platform-test pipeline schema-validation stage (D-058). Each module's `README.md` `## Examples` section references + excerpts the validated files. `docs/modules/index.md` + `docs/consumer-guide.md` + `docs/contracts/index.md` are updated with the new module names + examples.
|
- **REQ-75:** A new RDS primitive (`modules/l1/rds/`) with an `engine` input (enum: postgres, mysql, etc.) demonstrates multi-engine variation (D-059). Every module (primitives + patterns) has a `modules/<name>/examples/` directory with `simple.yaml` + `complex.yaml` (+ variation files) validated against `schemas/contract.schema.json` in the platform-test pipeline schema-validation stage (D-058). Each module's `README.md` `## Examples` section references + excerpts the validated files. `docs/modules/index.md` + `docs/consumer-guide.md` + `docs/contracts/index.md` are updated with the new module names + examples.
|
||||||
|
|
||||||
|
## v1.8 (Active — P1 remediation + uptime + engineering standards + encryption/deletion-protection by default + decommission + docs)
|
||||||
|
|
||||||
|
### Category: P1 Fixes
|
||||||
|
- **REQ-76:** WAF adapter emits custom `rules` as nested HCL blocks (not attribute syntax) and honors `default_action` input (allow/block) — P1-4, P1-5 closed.
|
||||||
|
- **REQ-77:** L2 composition `outputs[]` array is resolved by `contract_resolver.py` into `stack.outputs`; the adapter emits corresponding `output` blocks — P1-7 closed.
|
||||||
|
- **REQ-78:** SSM publisher fails loud when `ACDL_KMS_KEY_ID` is unset (no silent AWS-managed-key fallback); `ACDL_ALLOW_DEFAULT_KMS=1` escape hatch for local testing — P1-3 closed.
|
||||||
|
- **REQ-79:** `consumer_invoke_policy` is rendered via Terraform with the caller's live account ID (no `000000000000` placeholder) — P1-6 closed.
|
||||||
|
- **REQ-80:** `run_platform.sh` emits adapter output to a per-run temp dir, not committed `terraform/spike/*.tf`; the committed files are removed — P1-8 closed.
|
||||||
|
- **REQ-81:** `contract_ingestor.py` reads `GITHUB_API_BASE` env for forge-agnostic API URLs (GitHub + Gitea) — P1-9 closed.
|
||||||
|
- **REQ-82:** Deploy workflow static-key override is wired to `configure-aws-credentials` inputs (`access-key`/`secret-key`), not inert env vars — S1 closed.
|
||||||
|
|
||||||
|
### Category: Encryption by Default
|
||||||
|
- **REQ-83:** A per-stack CMK primitive (`kms-key`) exists with 90-day rotation enabled at creation; one key per L2 deployment; no shared keys across stacks.
|
||||||
|
- **REQ-84:** All primitives have encryption by default (`encryption_enabled` NFR, default true) + optional `kms_key_arn` input. CMK is prioritized; managed KMS is the fallback when no CMK is provided.
|
||||||
|
- **REQ-85:** L2 modules wire a per-stack CMK child + connect its `kms_key_arn` output to each child's `kms_key_arn` input.
|
||||||
|
|
||||||
|
### Category: Deletion Protection by Default
|
||||||
|
- **REQ-86:** `deletion_protection` NFR (boolean, default true) on every L1 primitive; the adapter emits `prevent_destroy` lifecycle meta-arg when true.
|
||||||
|
- **REQ-87:** L2 modules expose a `features.deletion_protection` flag (default true); consumers can disable via contract `inputs.deletion_protection: false`.
|
||||||
|
|
||||||
|
### Category: Uptime Monitoring
|
||||||
|
- **REQ-88:** An uptime-kuma L1 primitive exists (ECS Fargate) with: `feature_flag_enabled` (boolean, default true), `monitored_endpoints` (array of HTTP/DNS/TCP checks), `static_checks` (pre-defined health checks), `alert_channels` (Teams webhook, email, SMS, GitHub issues).
|
||||||
|
- **REQ-89:** Uptime is deployed by default after any L2 module deploy (separate terraform state, separate terraform run); L2 module outputs (endpoints) are passed to the uptime deployment as `monitored_endpoints`. The uptime URL is published to the consumer via PR comment.
|
||||||
|
- **REQ-90:** The `feature_flag_enabled` input (set from consumer contract `inputs.uptime_enabled`, default true) disables the uptime deployment entirely (no resources emitted).
|
||||||
|
- **REQ-91:** A `deploy-uptime` pipeline stage is declared in `pipelines/deploy.yaml` + both deploy workflow YAMLs (byte-identical).
|
||||||
|
|
||||||
|
### Category: Decommission + CMDB
|
||||||
|
- **REQ-92:** A decommission mode on the deploy pipeline (`mode: decommission`) implements a 2-step pipeline: (1) plan/apply to disable deletion protection with an HITL SRE gate, (2) plan/apply with all counts set to 0 with a second HITL SRE gate. Uses the existing deploy pipeline with different behavior.
|
||||||
|
- **REQ-93:** A DynamoDB `acdl-change-requests` table serves as the CMDB. The decommission alias accepts a `changeRequestId` input validated via a `validate_change_request` Lambda action (CR status must be `approved`).
|
||||||
|
- **REQ-94:** The decommission flow is documented in `docs/CONSUMER_GUIDE.md` (how to request a CR, trigger decommission, HITL gates, what happens).
|
||||||
|
|
||||||
|
### Category: Engineering Standards
|
||||||
|
- **REQ-95:** `modules/STANDARDS.md` exists with comprehensive L1 + L2 authoring + code review standards (scanned from current modules): required files, interface schema, input/output/NFR conventions, encryption + deletion protection as mandatory NFRs, naming, adapter extension pattern, code review checklist.
|
||||||
|
- **REQ-96:** `modules/README.md` catalog index includes all primitives (rds + uptime + kms-key added); `modules/README-TEMPLATE.md` updated with `## NFRs` section.
|
||||||
|
|
||||||
|
### Category: Path Documentation
|
||||||
|
- **REQ-97:** `schemas/README.md` documents how to write a schema, wire it into the platform, test it in CI, where to write tests, dependencies, and the existing schema catalog.
|
||||||
|
- **REQ-98:** `pipelines/README.md` documents how to write a pipeline contract, wire it into workflows, test it, dependencies, and the existing pipeline catalog.
|
||||||
|
- **REQ-99:** `adapters/README.md` documents how to write an adapter, wire it into the platform, test it, dependencies, and the existing adapter catalog.
|
||||||
|
|
||||||
## Out of Scope (v1.2)
|
## Out of Scope (v1.2)
|
||||||
|
|
||||||
| REQ | Original criterion | Clarified criterion (effective) | Decision |
|
| REQ | Original criterion | Clarified criterion (effective) | Decision |
|
||||||
@@ -315,4 +355,33 @@
|
|||||||
| REQ-72 | 26 | complete (v1.7.0) |
|
| REQ-72 | 26 | complete (v1.7.0) |
|
||||||
| REQ-73 | 26 | complete (v1.7.0) |
|
| REQ-73 | 26 | complete (v1.7.0) |
|
||||||
| REQ-74 | 27 | complete (v1.7.0) |
|
| REQ-74 | 27 | complete (v1.7.0) |
|
||||||
| REQ-75 | 27 | complete (v1.7.0) |
|
| REQ-75 | 27 | complete (v1.7.0) |
|
||||||
|
|
||||||
|
### v1.8 (active — P1 remediation + uptime + standards + encryption/deletion-protection by default + decommission + docs)
|
||||||
|
|
||||||
|
| Requirement | Phase | Status |
|
||||||
|
|-------------|-------|--------|
|
||||||
|
| REQ-76 | 28 | pending |
|
||||||
|
| REQ-77 | 28 | pending |
|
||||||
|
| REQ-78 | 29 | pending |
|
||||||
|
| REQ-79 | 29 | pending |
|
||||||
|
| REQ-80 | 30 | pending |
|
||||||
|
| REQ-81 | 30 | pending |
|
||||||
|
| REQ-82 | 30 | pending |
|
||||||
|
| REQ-83 | 31 | pending |
|
||||||
|
| REQ-84 | 31 | pending |
|
||||||
|
| REQ-85 | 31 | pending |
|
||||||
|
| REQ-86 | 32 | pending |
|
||||||
|
| REQ-87 | 32 | pending |
|
||||||
|
| REQ-88 | 33 | pending |
|
||||||
|
| REQ-89 | 33 | pending |
|
||||||
|
| REQ-90 | 33 | pending |
|
||||||
|
| REQ-91 | 33 | pending |
|
||||||
|
| REQ-92 | 34 | pending |
|
||||||
|
| REQ-93 | 34 | pending |
|
||||||
|
| REQ-94 | 34 | pending |
|
||||||
|
| REQ-95 | 35 | pending |
|
||||||
|
| REQ-96 | 35 | pending |
|
||||||
|
| REQ-97 | 36 | pending |
|
||||||
|
| REQ-98 | 36 | pending |
|
||||||
|
| REQ-99 | 36 | pending |
|
||||||
+137
-1
@@ -10,6 +10,7 @@
|
|||||||
- **v1.5 (complete, tag `v1.5.0`):** consumer happy path + zero-trust docs + reusable deploy workflow. README rewritten so the consumer model is unambiguous (consumer owns only contract + app code; the rest is the platform source). Platform-flow + consumer-guide diagrams converted to mermaid. Legacy surface + implementation nomenclature removed from docs. Credentials section rewritten for zero-trust OIDC + ABAC (with a static-key override + daily rotation). A generic `docs/CONSUMER_GUIDE.md` (all L2 modules, versioned `uses:`, consumer-scoped prereqs, run-time platform fetch) replaces the module-specific guide. A byte-identical reusable `deploy.yml` workflow (Gitea + GitHub) implements `pipelines/deploy.yaml` and is invoked by consumer repos via a versioned tag.
|
- **v1.5 (complete, tag `v1.5.0`):** consumer happy path + zero-trust docs + reusable deploy workflow. README rewritten so the consumer model is unambiguous (consumer owns only contract + app code; the rest is the platform source). Platform-flow + consumer-guide diagrams converted to mermaid. Legacy surface + implementation nomenclature removed from docs. Credentials section rewritten for zero-trust OIDC + ABAC (with a static-key override + daily rotation). A generic `docs/CONSUMER_GUIDE.md` (all L2 modules, versioned `uses:`, consumer-scoped prereqs, run-time platform fetch) replaces the module-specific guide. A byte-identical reusable `deploy.yml` workflow (Gitea + GitHub) implements `pipelines/deploy.yaml` and is invoked by consumer repos via a versioned tag.
|
||||||
- **v1.6 (complete, tag `v1.6.0`):** consumer-facing docs restructure + terminology normalization + environments concept. `docs/` becomes a Jekyll-style GitHub Pages site. `acdl_platform/` is renamed to `core/`. L2 → "modules", L1 → "primitives", "composition" → "pattern" in prose. README restructured: Features + Roadmap (no internal status), repository roles restated (consumer = app code + contracts + CI definitions), mermaid fixed (visible text, security-checks + infrastructure-apply stages, no tool names), credentials section minus go-gitea/waivers. Platform-managed environments concept + a minimal onboarding scaffold. `.ciagent/` + `.gitea/` references removed from all consumer-facing docs.
|
- **v1.6 (complete, tag `v1.6.0`):** consumer-facing docs restructure + terminology normalization + environments concept. `docs/` becomes a Jekyll-style GitHub Pages site. `acdl_platform/` is renamed to `core/`. L2 → "modules", L1 → "primitives", "composition" → "pattern" in prose. README restructured: Features + Roadmap (no internal status), repository roles restated (consumer = app code + contracts + CI definitions), mermaid fixed (visible text, security-checks + infrastructure-apply stages, no tool names), credentials section minus go-gitea/waivers. Platform-managed environments concept + a minimal onboarding scaffold. `.ciagent/` + `.gitea/` references removed from all consumer-facing docs.
|
||||||
- **v1.7 (complete, tag `v1.7.0`):** production platform + contract ingestion + pipeline maturation. Rename `static-assets` → `static-assets` (D-048 — incl. `.ciagent/` historical narrative). Author `cloudfront` + `waf` primitives; augment `static-assets` to a production-ready S3 + CloudFront (OAC) + WAF stack (D-049). Tagging-standard enforcement (Checkov custom rule, D-043 closure, D-054). Wiz adapter stub (D-052) + Kyverno K8s-native adapter (D-053). Platform Lambda + DynamoDB `acdl-contracts` table for contract ingestion (D-051) + cross-account IAM. Deploy outputs via SSM SecureString + GitHub PR comment (D-050). Uniform error reporting via the Lambda `report_error` action → GitHub issue on the platform repo (D-055); Gitea excluded. Stage comments after every successful pipeline stage. Three platform pipelines (platform-test unit+integration, primitives-plan, patterns-plan). Release job with semver + MAJOR.MINOR/MAJOR tag maintenance (D-057). `uses:`/`ref:` bumped to `@v1.6`; floating `v1.6` + `v1` tags created in Phase 22. Remove the legacy consumer-repos directory (a v1.2 artifact, removed in v1.7); add validated per-module examples (`modules/<name>/examples/`, D-058) including a new RDS primitive demonstrating multi-engine variation (D-059).
|
- **v1.7 (complete, tag `v1.7.0`):** production platform + contract ingestion + pipeline maturation. Rename `static-assets` → `static-assets` (D-048 — incl. `.ciagent/` historical narrative). Author `cloudfront` + `waf` primitives; augment `static-assets` to a production-ready S3 + CloudFront (OAC) + WAF stack (D-049). Tagging-standard enforcement (Checkov custom rule, D-043 closure, D-054). Wiz adapter stub (D-052) + Kyverno K8s-native adapter (D-053). Platform Lambda + DynamoDB `acdl-contracts` table for contract ingestion (D-051) + cross-account IAM. Deploy outputs via SSM SecureString + GitHub PR comment (D-050). Uniform error reporting via the Lambda `report_error` action → GitHub issue on the platform repo (D-055); Gitea excluded. Stage comments after every successful pipeline stage. Three platform pipelines (platform-test unit+integration, primitives-plan, patterns-plan). Release job with semver + MAJOR.MINOR/MAJOR tag maintenance (D-057). `uses:`/`ref:` bumped to `@v1.6`; floating `v1.6` + `v1` tags created in Phase 22. Remove the legacy consumer-repos directory (a v1.2 artifact, removed in v1.7); add validated per-module examples (`modules/<name>/examples/`, D-058) including a new RDS primitive demonstrating multi-engine variation (D-059).
|
||||||
|
- **v1.8 (active):** P1 remediation + uptime monitoring + engineering standards + encryption/deletion-protection by default + decommission alias + path documentation. Clears 8 pending P1 issues (P1-3..P1-9 + S1). Adds per-stack CMK + encryption-by-default for all primitives. Adds deletion-protection-by-default + L2 feature flag. Adds uptime-kuma primitive (ECS Fargate, deployed by default after L2, separate state, feature flag, alert channels). Adds decommission mode (2-step pipeline with HITL SRE gates + CMDB-validated change request). Adds `modules/STANDARDS.md` (L1+L2 authoring + review standards). Adds `schemas/README.md`, `pipelines/README.md`, `adapters/README.md`.
|
||||||
- **v1.0 demo URL:** https://git.cloudinit.dev/continuous-intelligence/acdl-evidence/raw/branch/main/index.html
|
- **v1.0 demo URL:** https://git.cloudinit.dev/continuous-intelligence/acdl-evidence/raw/branch/main/index.html
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -427,4 +428,139 @@ reference is never broken, and the release job (Phase 26) owns ongoing updates.
|
|||||||
- `docs/modules/index.md` links to all module READMEs (including cloudfront, waf, rds).
|
- `docs/modules/index.md` links to all module READMEs (including cloudfront, waf, rds).
|
||||||
- `bash scripts/run_ci.sh` exits 0; `python3 -m pytest tests/ -v` passes.
|
- `bash scripts/run_ci.sh` exits 0; `python3 -m pytest tests/ -v` passes.
|
||||||
|
|
||||||
After Phase 27: COMPLETE gate — review → ship `v1.7.0` → audit.
|
After Phase 27: COMPLETE gate — review → ship `v1.7.0` → audit. **DONE.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v1.8 (Active — P1 remediation + uptime + engineering standards + encryption/deletion-protection by default + decommission + docs)
|
||||||
|
|
||||||
|
The v1.8 milestone clears all pending P1 issues from v1.5–v1.7 verify
|
||||||
|
reviews AND delivers three user-directed tracks: encryption + deletion
|
||||||
|
protection by default (with a decommission alias), uptime monitoring
|
||||||
|
(uptime-kuma primitive deployed by default after L2 modules), and
|
||||||
|
engineering standards + path documentation. Ship tag at milestone
|
||||||
|
COMPLETE: **`v1.8.0`** (feature milestone, next minor per run.md — v1.7
|
||||||
|
shipped `v1.7.0`). Phase patches `v1.7.1`..`v1.7.9`.
|
||||||
|
|
||||||
|
### Phase 28 — adapter-waf-and-resolver-outputs
|
||||||
|
- **Description:** Fix WAF HCL emission: custom `rules` input emits nested `rules { ... }` blocks (not `rules = [...]` attribute syntax — P1-4). Honor `default_action` input (allow/block) instead of hardcoding `allow {}` (P1-5). Implement L2 composition `outputs[]` processing in `resolve_l2()` — build `stack.outputs` dict + adapter emits `output` blocks (P1-7). Tests for all three fixes.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** —
|
||||||
|
- **Requirements:** REQ-76, REQ-77
|
||||||
|
- **Success Criteria:**
|
||||||
|
- WAF with custom rules emits nested `rules {` blocks, not `rules = [`.
|
||||||
|
- WAF with `default_action: block` emits `block {}`; default (absent) emits `allow {}`.
|
||||||
|
- L2 resolution of `static-assets` yields `stack.outputs.distribution_domain_name`, `bucket_arn`, `web_acl_arn`.
|
||||||
|
- Adapter emits `output "distribution_domain_name" { value = ... }` blocks.
|
||||||
|
- `pytest` passes; `run_platform.sh --check-only` exits 0.
|
||||||
|
|
||||||
|
### Phase 29 — ssm-kms-and-invoke-policy
|
||||||
|
- **Description:** SSM publisher fails loud (`RuntimeError`) when `ACDL_KMS_KEY_ID` unset; `ACDL_ALLOW_DEFAULT_KMS=1` escape hatch for local testing (P1-3). Convert `consumer_invoke_policy.json` to a Terraform-rendered template using `data.aws_caller_identity` + `templatestring` — no `000000000000` placeholder (P1-6). Tests for both.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [28]
|
||||||
|
- **Requirements:** REQ-78, REQ-79
|
||||||
|
- **Success Criteria:**
|
||||||
|
- SSM publisher raises `RuntimeError` when `ACDL_KMS_KEY_ID` unset; succeeds with `ACDL_ALLOW_DEFAULT_KMS=1`.
|
||||||
|
- Rendered invoke policy contains the caller's live account ID, not `000000000000`.
|
||||||
|
- `pytest` passes; `run_ci.sh` exits 0.
|
||||||
|
|
||||||
|
### Phase 30 — run-platform-isolation-and-api-portability
|
||||||
|
- **Description:** `run_platform.sh` emits adapter output to `$WORK/tf` (per-run temp dir), not `terraform/spike/`; remove committed `terraform/spike/*.tf` (P1-8). `contract_ingestor.py` reads `GITHUB_API_BASE` env for forge-agnostic API URLs (GitHub + Gitea); `_forge_type()` branches search URL (P1-9). Deploy workflow `configure-aws-credentials` step restructured as single conditional step: OIDC when no static key, `access-key`/`secret-key` inputs when static key present (S1). Both deploy workflows remain byte-identical.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [29]
|
||||||
|
- **Requirements:** REQ-80, REQ-81, REQ-82
|
||||||
|
- **Success Criteria:**
|
||||||
|
- `run_platform.sh --check-only` writes to a temp dir; no `terraform/spike/*.tf` committed.
|
||||||
|
- `contract_ingestor.py` uses `GITHUB_API_BASE`; Gitea base URL produces correct API paths.
|
||||||
|
- Deploy workflow static-key override wired to `configure-aws-credentials` inputs.
|
||||||
|
- Both deploy workflows byte-identical; `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 31 — encryption-by-default-and-per-stack-cmk
|
||||||
|
- **Description:** Create `kms-key` L1 primitive (type `aws:kms:key`, inputs: description/region/deletion_window_days, outputs: kms_key_arn/kms_key_id, NFRs: enable_rotation default true, deletion_protection default true). Adapter emits `aws_kms_key` + `aws_kms_alias` + `enable_key_rotation = true`. Add `encryption_enabled` NFR (default true) + `kms_key_arn` input to all primitives. L2 modules wire a `kms-key` child + connect its output to all children. Managed KMS fallback when no CMK provided (with stderr warning).
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [30]
|
||||||
|
- **Requirements:** REQ-83, REQ-84, REQ-85
|
||||||
|
- **Success Criteria:**
|
||||||
|
- Every primitive has `encryption_enabled` NFR (default true) + optional `kms_key_arn` input.
|
||||||
|
- L2 resolution wires per-stack CMK to all children.
|
||||||
|
- Adapter emits encryption blocks (SSE, storage_encrypted, encryption_configuration) referencing the CMK.
|
||||||
|
- `enable_key_rotation = true` on the CMK; no shared keys across stacks.
|
||||||
|
- `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 32 — deletion-protection-by-default-and-l2-feature-flag
|
||||||
|
- **Description:** Add `deletion_protection` NFR (boolean, default true) to every L1 primitive. Adapter emits `lifecycle { prevent_destroy = true }` when true; omits it when false. L2 modules expose `features.deletion_protection` flag (default true); resolver propagates to each child's NFR. Consumers can set `inputs.deletion_protection: false` in contract. Update contract schema.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [31]
|
||||||
|
- **Requirements:** REQ-86, REQ-87
|
||||||
|
- **Success Criteria:**
|
||||||
|
- Every primitive has `deletion_protection` NFR defaulting to true.
|
||||||
|
- Adapter emits `prevent_destroy = true` when true; omits when false.
|
||||||
|
- L2 feature flag propagates to all children.
|
||||||
|
- `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 33 — uptime-kuma-primitive
|
||||||
|
- **Description:** Create `uptime` L1 primitive (ECS Fargate running `louislam/uptime-kuma:1`). Inputs: container_image, region, monitored_endpoints (array of {name, url, type, interval, timeout}), static_checks, alert_channels ({teams_webhook, email_addresses, sms_numbers, github_issue_repo}), feature_flag_enabled (default true), cpu, memory. Outputs: uptime_url, service_arn, task_definition_arn. NFRs: deletion_protection, encryption_enabled. Adapter emits ECS service + ALB + log group; no resources when feature_flag_enabled=false. Register in registry. Add `deploy-uptime` pipeline stage (separate state, after publish-outputs) to `pipelines/deploy.yaml` + both deploy workflows. `run_platform.sh` constructs synthetic uptime contract from L2 outputs + runs second terraform apply. Uptime URL published via PR comment. Feature flag from `inputs.uptime_enabled` (default true).
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [32]
|
||||||
|
- **Requirements:** REQ-88, REQ-89, REQ-90, REQ-91
|
||||||
|
- **Success Criteria:**
|
||||||
|
- Uptime primitive exists with feature flag, monitored endpoints, alert channels.
|
||||||
|
- Deployed by default after L2 module (separate state); endpoints passed from L2 outputs.
|
||||||
|
- Uptime URL published via PR comment.
|
||||||
|
- Feature flag disables deployment (no resources emitted).
|
||||||
|
- `deploy-uptime` stage in deploy contract + byte-identical workflows.
|
||||||
|
- `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 34 — decommission-alias-and-cmdb-validation
|
||||||
|
- **Description:** Add `mode: decommission` to deploy pipeline. Stages: validate-change-request (Lambda `validate_change_request` action queries DynamoDB `acdl-change-requests` table, asserts status=approved) → disable-deletion-protection (resolve contract with deletion_protection=false, terraform plan/apply, HITL SRE gate) → zero-counts (resolver `decommission_transform` zeroes all counts, terraform plan/apply, second HITL SRE gate) → confirm-decommission. Add `acdl-change-requests` DynamoDB table to terraform/platform/main.tf. Add `validate_change_request` to contract_ingestor.py. Document in `docs/CONSUMER_GUIDE.md`.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [33]
|
||||||
|
- **Requirements:** REQ-92, REQ-93, REQ-94
|
||||||
|
- **Success Criteria:**
|
||||||
|
- Decommission mode works via existing deploy pipeline with 2-step HITL SRE gates.
|
||||||
|
- CR ID validated against DynamoDB CMDB (status must be approved).
|
||||||
|
- `decommission_transform` zeroes all counts.
|
||||||
|
- Documented in consumer guide.
|
||||||
|
- `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 35 — module-engineering-standards
|
||||||
|
- **Description:** Scan all current modules to generate `modules/STANDARDS.md` — comprehensive L1+L2 authoring + code review standards: required files, interface schema, input/output/NFR conventions, encryption + deletion protection as mandatory NFRs, naming, multi-resource pattern, adapter extension pattern (TYPE_MAP + INPUT_MAP + OUTPUT_MAP + specialized branches), code review checklist. Fix `modules/README.md` catalog index (add rds + uptime + kms-key). Update `modules/README-TEMPLATE.md` with `## NFRs` section. Add `tests/test_module_standards.py` for automated enforcement.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [34]
|
||||||
|
- **Requirements:** REQ-95, REQ-96
|
||||||
|
- **Success Criteria:**
|
||||||
|
- `modules/STANDARDS.md` exists with L1+L2 authoring + review standards.
|
||||||
|
- Catalog index includes all primitives; template has NFRs section.
|
||||||
|
- Automated standards test passes for all modules.
|
||||||
|
- `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 36 — schemas-adapters-pipelines-readmes
|
||||||
|
- **Description:** Author `schemas/README.md` (how to write schemas, wire into platform, test in CI, dependencies, existing catalog), `pipelines/README.md` (how to write pipeline contracts, wire into workflows, test, dependencies, catalog), `adapters/README.md` (how to write adapters, wire into platform, test, dependencies, catalog). Add `tests/test_docs_coverage.py` to validate presence + required sections.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [35]
|
||||||
|
- **Requirements:** REQ-97, REQ-98, REQ-99
|
||||||
|
- **Success Criteria:**
|
||||||
|
- All 3 READMEs exist with comprehensive documentation.
|
||||||
|
- CI validates their presence.
|
||||||
|
- `pytest` + `run_ci.sh` green.
|
||||||
|
|
||||||
|
### Phase 37 — verify
|
||||||
|
- **Description:** 4-layer verification (structural, behavioral, security, quality) of all v1.8 phases. Re-verify each P1 (P1-3..P1-9 + S1) is resolved. Verify all new features (encryption, deletion protection, uptime, decommission, standards, docs) have dedicated tests.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [36]
|
||||||
|
- **Requirements:** —
|
||||||
|
- **Success Criteria:**
|
||||||
|
- All 4 layers pass; each P1 fix + each new feature has a dedicated test.
|
||||||
|
- `pytest` passes (~358 tests); `run_ci.sh` exits 0; `run_platform.sh --check-only` exits 0.
|
||||||
|
|
||||||
|
### Phase 38 — review-audit-complete
|
||||||
|
- **Description:** Multi-persona code review across the full v1.8 diff. Audit (reconstruction, file discipline, branch hygiene, commit discipline). Complete: update REQUIREMENTS.md (REQ-76..99), ROADMAP.md (v1.8 complete), PROJECT.md. Tag `v1.8.0`. Update floating `v1.8` + `v1` tags. Bump `uses:`/`ref:` from `@v1.6` to `@v1.8`.
|
||||||
|
- **Status:** pending
|
||||||
|
- **Depends on:** [37]
|
||||||
|
- **Requirements:** —
|
||||||
|
- **Success Criteria:**
|
||||||
|
- Review: 0 new P0/P1; all P1-3..P1-9 + S1 resolved; 3 new requirements delivered.
|
||||||
|
- Audit: clean; 0 outstanding issues.
|
||||||
|
- Tag `v1.8.0` created; floating tags updated.
|
||||||
|
|
||||||
|
After Phase 38: COMPLETE gate — review → ship `v1.8.0` → audit.
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
"slug": "acdl",
|
"slug": "acdl",
|
||||||
"name": "Agentic Cloud Delivery Platform",
|
"name": "Agentic Cloud Delivery Platform",
|
||||||
"milestone": "v1.7",
|
"milestone": "v1.8",
|
||||||
"status": "active"
|
"status": "active"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user