# ACDL — Requirements ## v1 ### Category: Repos & Org - **REQ-01:** All demo code lives under the `continuous-intelligence` Gitea org at `https://git.cloudinit.dev`. - **REQ-09:** Three repos exist: `acdl` (platform + stubs + reusable workflows), `acdl-contracts` (developer surface), `acdl-evidence` (Pages audit timeline). ### Category: L1 Modules - **REQ-02:** 8 L1 module folders exist under `acdl/modules/l1/`: `l1-eks-fargate`, `l1-iam-role`, `l1-lambda`, `l1-api-gateway`, `l1-eventbridge`, `l1-sqs`, `l1-s3`, `l1-cloudwatch`. - **REQ-03:** Each L1 module has a `manifest.yaml` (declaring inputs) and a `mock_apply.sh` that echoes success, sleeps 1s, and exits 0. ### Category: L2 Modules - **REQ-04:** 4 L2 modules exist under `acdl/modules/l2/`: `l2-invoice-service`, `l2-commodity-price-feed`, `l2-energy-analytics-api`, `l2-regulatory-reporting`, each composing the specified L1s. - **REQ-05:** L2 modules compose L1 primitives into deployable shapes with a maximum depth of 5. ### Category: Core Scripts - **REQ-06:** `mock_executor.sh` reads an L2 composition, invokes each L1 `mock_apply.sh`, and writes `state.json`. - **REQ-07:** `policy_checker.py` reads `contract.yaml` and fails with `POLICY_VIOLATION:PUBLIC_INGRESS` on `public-ingress: true`; otherwise passes. - **REQ-08:** `confidence_signal.py` returns a base score of 0.90 and drops to 0.40 (with reason code) when policy fails; gate threshold is ≥ 0.50. ### Category: Evidence Stream - **REQ-11:** `evidence_writer.py` appends events to `audit.json` and links each event to the previous via a SHA-256 hash chain (`prev_hash` + own `hash`). - **REQ-13:** `acdl-evidence` is Pages-enabled and serves `audit.json` plus `index.html`. ### Category: Pipeline - **REQ-10:** The reusable pipeline runs Dev (autonomous), pauses at QA (manual approval), pauses at Prod (manual approval), then finalizes by committing `audit.json` to `acdl-evidence`. - **REQ-12:** Opening an Issue in `acdl-contracts` runs `l3b_agent_stub.py`, commits a generated `contract.yaml` to a new branch, closes the Issue, and triggers the main pipeline. ### Category: Demo Acts - **REQ-14:** `index.html` uses vanilla JS to fetch `audit.json` from the Pages URL and render events as a timeline. - **REQ-15:** All four demo acts (Friction, Developer Self-Service, Citizen Developer, Safety Net) reproduce deterministically in a dry run. ## v2 (None — v1 covers the complete demo.) ## Clarifications (Phase 01) | REQ | Original criterion | Clarified criterion (effective) | Decision | |-----|--------------------|----------------------------------|----------| | REQ-09 | Three repos exist | Three repos exist (`acdl`, `acdl-contracts`, `acdl-evidence`) under `continuous-intelligence`; new repos use `default_branch: "main"`, `auto_init: true` | D-015 | | REQ-10 | "Pages returns 200 with placeholder `index.html`" on `acdl-evidence` | Gitea has no Pages; substitute: an HTTP GET against the raw file URL `https://git.cloudinit.dev/continuous-intelligence/acdl-evidence/raw/branch/main/index.html` returns 200 with the placeholder HTML body | D-012, D-016 | | REQ-10 | "`qa` and `prod` environments exist on `acdl-contracts`" | Gitea has no environments API and ignores `environment:` blocks; substitute: the reusable workflow defines `qa-gate` and `prod-gate` jobs gated by `workflow_dispatch` approval inputs (D-004 fallback); a `qa` and `prod` branch may be created on `acdl-contracts` as a visible stand-in for environments | D-013 | ## Out of Scope | Feature | Reason | |---------|--------| | Real cloud provisioning (AWS/GCP/Azure) | Demo explicitly stubs all infrastructure; no cloud access available. | | Real LLM inference / external AI APIs | Spec forbids external AI; L3B is a keyword parser. | | Production-grade infrastructure | Demo target is a 30-minute executive show, not a production system. | | Adversarial tamper-proofing of evidence | Hash chain is demonstrative; not cryptographically secure against a determined attacker. | | Multi-tenant isolation | Out of demo scope. | ## Traceability | Requirement | Phase | Status | |-------------|-------|--------| | REQ-01 | 1 | complete (v1.0.1) | | REQ-02 | 2 | covered (pending VERIFY) | | REQ-03 | 2 | covered (pending VERIFY) | | REQ-04 | 3 | pending | | REQ-05 | 3 | pending | | REQ-06 | 3 | pending | | REQ-07 | 3 | pending | | REQ-08 | 3 | pending | | REQ-09 | 1 | complete (v1.0.1) | | REQ-10 | 4 | partial (skeleton in Phase 01 v1.0.1; full impl in Phase 04) | | REQ-11 | 3 | pending | | REQ-12 | 4 | partial (skeleton in Phase 01 v1.0.1; full impl in Phase 04) | | REQ-13 | 5 | pending | | REQ-14 | 5 | pending | | REQ-15 | 5 | pending |