From eef8761658e41777e12327c13caabb6bf730e679 Mon Sep 17 00:00:00 2001 From: Jon Chery Date: Wed, 29 Jul 2026 21:30:41 +0000 Subject: [PATCH] docs(P19): complete documentation-sync-v1.14 phase (v1.13.23) ---ci--- project: acdl phase: 19 milestone: v1.14 status: complete requirements: covered: [REQ-153] partial: [] ---/ci--- --- .ciagent/ARCHITECTURE.md | 91 ++++++++++++++++++++++++++++++++++++- .ciagent/COST.md | 6 +-- .ciagent/GRILL.md | 6 +++ README.md | 2 +- docs/architecture.md | 2 +- docs/consumer-guide.md | 24 +++++----- docs/pipeline/index.md | 2 +- docs/pipeline/versioning.md | 2 +- 8 files changed, 115 insertions(+), 20 deletions(-) diff --git a/.ciagent/ARCHITECTURE.md b/.ciagent/ARCHITECTURE.md index 5f43d2e..9635a81 100644 --- a/.ciagent/ARCHITECTURE.md +++ b/.ciagent/ARCHITECTURE.md @@ -570,4 +570,93 @@ emulator + live-AWS terraform init/validate/plan. 7. CloudFront OAC + WAF deprecated arg names (AWS provider v5): `signing_behavior`, `signing_protocol`, `origin_access_control_id`, `s3_origin_config.origin_access_identity`, `origin_id`, `rule` - (singular), `scope=CLOUDFRONT` (uppercase). \ No newline at end of file + (singular), `scope=CLOUDFRONT` (uppercase). + +## v1.11 Addendum — Stateless Adapter + Pipeline-Driven Lifecycle Testing + +**Stateless adapter (D-098).** `adapters/terraform/adapter.py` rewritten +from a 918-line monolith (3 constant tables `TYPE_MAP`/`INPUT_MAP`/ +`OUTPUT_MAP`, 39 type-specific branches) to a ~80-line stateless assembler. +Each L1 module ships a real `terraform/` module dir +(`versions.tf`/`variables.tf`/`locals.tf`/`main.tf`/`outputs.tf`) owning +its resource shape, nested blocks, and defaults. The adapter reads the +registry, emits a root `main.tf` instantiating each L1 as +`module "x" { source = "..." }` with resolved inputs and wired refs. + +**Terraform owns lifecycle (D-101).** `scripts/run_platform.sh` gains +`--apply` and `--destroy` modes. Python never runs terraform. +`scripts/verify_deploy_microservice.py` is deleted. + +**Pipeline-driven testing (D-102).** A `modules-lifecycle` pipeline +(Gitea + GitHub, byte-identical) matrix-runs each L1 module's +`examples/{simple,complex}.yml` contracts through apply→modify→destroy +against live AWS. No per-module Python/pytest. The "test" = the pipeline +cell going green. + +**Single platform VPC (D-105).** `terraform/platform/main.tf` owns ONE +VPC; the microservice composition references it via +`terraform_remote_state` (data source). State keys are deterministic and +env-aware (`spike/{contract.id}/{contract.environment}/terraform.tfstate`). + +**ACDL_LIFECYCLE_MODE (v1.12, REQ-134).** The lifecycle pipeline defaults +to plan-only (fast, no AWS mutation, no cost). A CI variable +`ACDL_LIFECYCLE_MODE` (default `plan`) overrides to `full` for the real +apply→modify→destroy. + +## v1.12 Addendum — Presentation Refinement + CAP-013 Fix + +**CAP-013 adapter dedup fix (REQ-129).** Multi-resource L1s (ecs-service, +alb) with stack outputs + cross-module refs now dedup to ONE module block +named by the composition child id, with expanded sub-ids rewritten via +`id_remap`. `terraform validate` succeeds for the microservice stack. + +**CAP-017/018 probe fixes (REQ-130).** CAP-017's probe no longer requires +`locals.tf` for modules that legitimately omit it. CAP-018's probe +instantiates `LocalLambdaStub` with the required `outbox` arg. + +## v1.13 Addendum — Presentation Polish + Config Schema Migration + +**Config.json schema migration (v1.13.1).** Regenerated +`.ciagent/config.json` to the updated CIAgent v2 config structure (drop +removed fields, migrate `gitea`→`release.gitea`, add +`secrets`/`ship`/`backend`/`ideation`/`personas`/`logging`/`telemetry` +sections). + +**Presentation polish (v1.13.0, v1.13.2).** Action headlines, story-arc +restructure, larger fonts, 6 new mermaid diagrams, badge cleanup, +platform-architecture diagram. Docs-only NFR patches. + +## v1.14 Addendum — NFR Refinement (bug fixes, security, stubs, tests, docs) + +**Bug fixes (Wave 1, P1-P6).** Adapter dedup rejects unregistered modules +with ValueError (P1). Static-assets composition wires cloudfront inputs +(P2). L2 lifecycle scripts document remote-state design (P3). Regression +gate adds `terraform fmt -check` syntax probe (P4). Adapter dedup-merge + +remote-state-key unit tests (P5). ALB target group name_prefix derives +from var.name (P6). + +**Security (Wave 2, P7-P12).** 6 swallowed-error sites narrowed to +specific exceptions (P7). Account ID externalized to +`ACDL_AWS_ACCOUNT_ID` env (P8). IAM policy scoped to `acdl-*` ARNs (P9). +Contract ingestor validates contractId/environment/error (P10). Environment +schema adds `additionalProperties: false` + format validation (P11). +`.gitignore` credential-pattern catch-all (P12). + +**Stub/test/CI/hygiene (Wave 3, P13-P17).** Kyverno `--kube-version` flag +removed (P13, G-103). Orphan artifacts + dead config cleaned (P14). 7 +untested scripts gain test coverage (P15). Gitea workflow parity +documented + script `set` flags fixed (P16). Config.json persona + +branching strategy + ollama-cloud aligned (P17). + +**Standards/docs/VPC (Wave 4, P18-P20).** STANDARDS.md reconciled (P18). +Documentation synced: ARCHITECTURE.md addenda, stale `@v1.6-1.9` → `@v1.13`, +GRILL G-005/G-008 resolved, COST.md window extended, D-083 deferral +recorded (P19). Platform VPC CIDR parameterized + data-driven subnet +count (P20). + +**D-083 deferral (explicit).** The audit ledger build-out (S3 Object Lock ++ JWS detached signatures + SQS DLQ + async worker + daily checkpoints) +remains deferred (D-096, v1.14). The hash-chain + DynamoDB outbox is the +v1.14 audit record. JWS per-event authenticity is not implemented; a +forged event is only detectable by re-reading the whole chain. The +deferral is documented here explicitly per the v1.14 grill (E-001). \ No newline at end of file diff --git a/.ciagent/COST.md b/.ciagent/COST.md index 11d3e5b..64537d0 100644 --- a/.ciagent/COST.md +++ b/.ciagent/COST.md @@ -1,8 +1,8 @@ -# ACDL AWS Cost Report (v1.0 → v1.10) +# ACDL AWS Cost Report (v1.0 → v1.14) -> **Query date:** 2026-07-28 +> **Query date:** 2026-07-29 (updated v1.14 P19) > **Source:** AWS Cost Explorer (`ce:GetCostAndUsage`) -> **Window:** 2026-07-21 → 2026-07-28 (v1.0 ship → v1.10 complete) +> **Window:** 2026-07-21 → 2026-07-29 (v1.0 ship → v1.14 active) > **Account:** 581513795199 (us-east-1) > **Closes:** G-008 (no cost documentation despite live AWS resources) diff --git a/.ciagent/GRILL.md b/.ciagent/GRILL.md index 44e530b..0002018 100644 --- a/.ciagent/GRILL.md +++ b/.ciagent/GRILL.md @@ -6,7 +6,13 @@ Two escalations must be resolved before the leadership pitch: - **G-005 (risks):** 6 cloud capabilities (CAP-017..022) are deploy-unverified. + **RESOLVED (v1.11):** CAP-017..022 are now Verified live-aws via the + modules-lifecycle pipeline (apply/modify/destroy exit 0). The IAM-drift + framing is removed. See CAPABILITY_INVENTORY.md. - **G-008 (budget):** No cost documentation exists despite live AWS resources. + **RESOLVED (v1.11):** COST.md now exists, documenting the v1.0→v1.10 spend + window + the v1.11 cost projection. The v1.14 P19 phase extends the + window to v1.11–v1.14. The project is reclassified as an **OSS reference implementation** (G-003), not a sponsored product. The grill's sponsor/ROI/budget/timeline axes apply diff --git a/README.md b/README.md index 84c82a9..8e77dfe 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ The workflow implements the same stages as `pipelines/contract.yml` (validate-contract → resolve-stack → security checks → infrastructure plan → policy checks → confidence → evidence event → apply). A consumer repo invokes the reusable workflow via a **versioned tag** (floating MAJOR + -MINOR, e.g. `acdl/.github/workflows/deploy.yml@v1.6`). The workflow checks +MINOR, e.g. `acdl/.github/workflows/deploy.yml@v1.13`). The workflow checks out the consumer repo, then checks out the ACDL platform repo into the runner workspace, and runs `scripts/run_platform.sh` against the consumer's contract — the consumer never clones the platform repo or invokes its diff --git a/docs/architecture.md b/docs/architecture.md index e56d63d..1d0e3d2 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -230,7 +230,7 @@ change to the modules/stack/confidence/audit. - A MAJOR bump requires a new registry entry (immutable publication); the old entry enters a 12-month deprecation window. - The central deploy pipeline is referenced by a floating MAJOR + MINOR tag - (e.g. `@v1.6`); patch fixes flow within the tag, breaking changes land + (e.g. `@v1.13`); patch fixes flow within the tag, breaking changes land under the next MINOR tag. See [Versioning](pipeline/versioning) for the consumer-facing details. diff --git a/docs/consumer-guide.md b/docs/consumer-guide.md index 0110d14..33d15f2 100644 --- a/docs/consumer-guide.md +++ b/docs/consumer-guide.md @@ -19,7 +19,7 @@ definitions. ```mermaid flowchart LR - A["your repo
(app code + contracts + CI definitions)"] -->|uses: acdl/.github/workflows/deploy.yml@v1.9| B + A["your repo
(app code + contracts + CI definitions)"] -->|uses: acdl/.github/workflows/deploy.yml@v1.13| B B["platform runners
(modules + pipelines + adapters + schemas)"] -->|contract -> resolver -> stack -> adapter
-> security checks -> infrastructure plan -> policy checks
-> confidence -> apply -> evidence event| C C["your resources in AWS"] ``` @@ -27,7 +27,7 @@ flowchart LR ## Versioning the `uses:` reference The central deployment pipeline is **always versioned with floating MAJOR -and MINOR tags** (e.g. `acdl/pipelines/contract.yml@v1.9`). Version +and MINOR tags** (e.g. `acdl/pipelines/contract.yml@v1.13`). Version constraints cannot be expressed inside the contract, so the tag in `uses:` is the only immutability lever a consumer has. See [Versioning](pipeline/versioning) for the full rationale. @@ -47,7 +47,7 @@ platform-managed. See [Environments](environments/). environment is bound, your first pipeline run emits a friendly onboarding prompt. See [Environments](environments/). - **Authorization to reference the central pipeline.** Onboarding grants - your repo the right to `uses: acdl/.github/workflows/deploy.yml@v1.9`. + your repo the right to `uses: acdl/.github/workflows/deploy.yml@v1.13`. Contact the platform team if you have not been onboarded. ## Step 1 — Create a consumer repo @@ -94,7 +94,7 @@ ACDL deployment workflow with a **versioned tag** (floating MAJOR + MINOR): ```yaml jobs: deploy: - uses: acdl/.github/workflows/deploy.yml@v1.9 + uses: acdl/.github/workflows/deploy.yml@v1.13 with: contract: .acdl/contract.yml environment: dev @@ -140,7 +140,7 @@ name: microservice | Field | Type | Required | Description | |-------|------|----------|-------------| -| `uses` | string | yes | Reference to the central deployment pipeline, **versioned** with a floating MAJOR+MINOR tag (e.g. `acdl/pipelines/contract.yml@v1.9`). Bare or `@main` references are discouraged. See [Versioning](pipeline/versioning). | +| `uses` | string | yes | Reference to the central deployment pipeline, **versioned** with a floating MAJOR+MINOR tag (e.g. `acdl/pipelines/contract.yml@v1.13`). Bare or `@main` references are discouraged. See [Versioning](pipeline/versioning). | | `module` | string | yes | Module name from the registry — any primitive or module (e.g. `static-assets`, `microservice`, `s3`). See the [module catalog](modules/). | | `environment` | string | yes | The platform-managed environment to deploy to (e.g. `dev`). See [Environments](environments/). | | `inputs` | object | yes | Module-specific inputs (see the module's README). | @@ -177,14 +177,14 @@ on: branches: [main] jobs: deploy: - uses: acdl/.github/workflows/deploy.yml@v1.9 + uses: acdl/.github/workflows/deploy.yml@v1.13 with: contract: .acdl/contract.yml ``` That is the entire consumer-side workflow. When you push to `main`: -1. The platform runner resolves `uses: acdl/.github/workflows/deploy.yml@v1.9` +1. The platform runner resolves `uses: acdl/.github/workflows/deploy.yml@v1.13` to the reusable workflow **at the pinned tag**. 2. A **platform-provided runner** checks out **your** repo. 3. The runner checks out the **ACDL platform repo** into the workspace — @@ -326,8 +326,8 @@ per-module extension points. Common examples: | Contract schema | `schemas/contract.schema.json` | JSON Schema for consumer contracts. | | Stack schema | `schemas/stack.schema.json` | JSON Schema for the resolved stack instance. | | Module catalog | [modules/](modules/) | All primitives and modules. | -| Sample contract | `contracts/static-assets.yaml` | The reference example contract (uses `@v1.9`). | -| Sample contract | `contracts/microservice.yaml` | The microservice example contract (uses `@v1.9`). | +| Sample contract | `contracts/static-assets.yaml` | The reference example contract (uses `@v1.13`). | +| Sample contract | `contracts/microservice.yaml` | The microservice example contract (uses `@v1.13`). | | Module examples | `modules//examples/` | Validated per-module example contracts (`simple.yaml` + `complex.yaml`). | | Contract resolver | `core/contract_resolver.py` | Resolves contracts to stack instances. | | Angine adapter | `adapters/terraform/adapter.py` | Compiles stack instances to infrastructure. | @@ -353,7 +353,7 @@ destruction: use `mode: decommission` with the `changeRequestId` input: ```yaml - uses: acdl/.github/workflows/deploy.yml@v1.8 + uses: acdl/.github/workflows/deploy.yml@v1.13 with: contract: .acdl/contract.yml mode: decommission @@ -421,7 +421,7 @@ name: static-assets ``` **Shape 2 — single contract + `environment` workflow input:** the -reusable deploy workflow (`acdl/.github/workflows/deploy.yml@v1.9`) +reusable deploy workflow (`acdl/.github/workflows/deploy.yml@v1.13`) declares an `environment` input. When non-empty, it overrides the contract's `environment` field at load time (before interpolation), so the same contract can be promoted by passing a different environment: @@ -436,7 +436,7 @@ on: workflow_dispatch: required: true jobs: deploy-qa: - uses: acdl/.github/workflows/deploy.yml@v1.9 + uses: acdl/.github/workflows/deploy.yml@v1.13 with: environment: qa contract: .acdl/contract.yml diff --git a/docs/pipeline/index.md b/docs/pipeline/index.md index fecb96b..d5a738e 100644 --- a/docs/pipeline/index.md +++ b/docs/pipeline/index.md @@ -39,7 +39,7 @@ It is exposed to consumer repos as a **reusable workflow**: - `.github/workflows/deploy.yml` — GitHub Actions (production) A consumer repo invokes the reusable workflow via a **versioned tag** -(floating MAJOR + MINOR, e.g. `acdl/.github/workflows/deploy.yml@v1.6`). +(floating MAJOR + MINOR, e.g. `acdl/.github/workflows/deploy.yml@v1.13`). The workflow checks out the consumer repo, then checks out the ACDL platform repo into the runner workspace, and runs `scripts/run_platform.sh` against the consumer's contract. The consumer never clones the platform repo or diff --git a/docs/pipeline/versioning.md b/docs/pipeline/versioning.md index 185ab89..ac354e8 100644 --- a/docs/pipeline/versioning.md +++ b/docs/pipeline/versioning.md @@ -26,7 +26,7 @@ tag** in a consumer's CI workflow definition: ```yaml jobs: deploy: - uses: acdl/.github/workflows/deploy.yml@v1.6 + uses: acdl/.github/workflows/deploy.yml@v1.13 with: contract: .acdl/contract.yml ```