ship: phase-06 archive-demo-and-reorient (v1.1.1)

---ci---
project: acdl
phase: 6
milestone: v1.1
status: shipped
release:
  tag: v1.1.1
---/ci---

Squash merge of phase/06-archive-demo-and-reorient. v1.0 demo archived
under demo/; new v1.1 top-level layout scaffolded (platform/, schemas/,
adapters/, terraform/, modules-ir/); README rewritten for the real
platform. verify_phase06.sh green: archived demo runs end-to-end from
demo/, no stray v1.0 dirs at repo root.
This commit is contained in:
Jon Chery
2026-07-21 18:28:11 +00:00
51 changed files with 454 additions and 44 deletions
+1 -1
View File
@@ -80,7 +80,7 @@ milestone COMPLETE: `v1.2.0` (feature milestone, next minor per ship.md).
### Phase 06 — archive-demo-and-reorient
- **Description:** Move the v1.0 demo (`modules/`, `scripts/`, `evidence-ui/`, `contracts/`, demo `.gitea/workflows/`) to `demo/`. Establish the new repo layout (`platform/`, `schemas/`, `adapters/`, `terraform/`, `modules-ir/`). Rewrite README to reflect the real platform. Verify the demo still runs from `demo/` (regression check).
- **Status:** pending
- **Status:** complete (v1.1.1)
- **Depends on:** —
- **Requirements:** (no new REQ; repo hygiene)
- **Success Criteria:**
+2 -1
View File
@@ -6,4 +6,5 @@ __pycache__/
state.json
audit.json
*.tmp
.DS_Store
.DS_Store
runner-data/
+39 -42
View File
@@ -1,55 +1,52 @@
# ACDL — Agentic Cloud Delivery Platform
A 30-minute executive demo proving that infrastructure can be delivered
**automatically, safely, and with a complete audit trail** — without the
usual weeks of manual tickets, reviews, and copy-pasted configuration.
Consumers declare intent; the platform delivers safe production deployment
through an agentic stack — automatically, safely, and with a complete audit
trail. A merged change progresses through lower environments end-to-end
without a platform engineer joining a thread; a non-technical consumer ships
a production deployment by declaring intent, without authoring a workflow,
a configuration file, or a Terraform module.
The demo runs entirely on **local stubs** (no AWS/GCP/Azure, no external LLM
APIs). It shows intent and safety behavior rather than provisioning real
cloud resources.
- **Vision** (the why): [`docs/vision.md`](docs/vision.md)
- **Architecture** (the how): [`docs/architecture.md`](docs/architecture.md)
- **Decisions**: [`.ciagent/PROJECT.md`](.ciagent/PROJECT.md)
- **Target architecture**: [`.ciagent/ARCHITECTURE.md`](.ciagent/ARCHITECTURE.md)
- **Phase plan**: [`.ciagent/ROADMAP.md`](.ciagent/ROADMAP.md)
## Four acts
## Status
1. **Act 1 — The Friction:** the old manual 2-week deployment process.
2. **Act 2 — Developer Self-Service:** commit a valid `contract.yaml` for
`l2-commodity-price-feed`, watch Dev auto-run, QA + Prod approval gates,
then the evidence timeline.
3. **Act 3 — Citizen Developer:** open a GitHub/Gitea Issue with natural-
language intent; the Python keyword parser generates the same
`contract.yaml` and triggers the identical pipeline.
4. **Act 4 — The Safety Net:** commit a malicious `contract.yaml`
(`public-ingress: true`) for `l2-regulatory-reporting`; the pipeline
halts in Dev because the confidence signal drops below 0.50, and the
rejection is visible on the evidence stream.
- **v1.1 (active):** architecture finalization + v1 spike. Finalize the
architecture to v1.0 (resolve the 11 open design decisions) and prove the
locked commitments with one end-to-end implementation spike
(`l1-s3` + `l2-static-asset` + Terraform adapter → real `terraform plan`
against AWS).
- **v1.0 demo (complete, archived):** tag `v1.1.0`. The 30-minute
stub-driven executive demo is preserved under `demo/` as the intent
reference; it is not the platform.
## Repositories
## Repository layout
All under the `continuous-intelligence` Gitea org at
`https://git.cloudinit.dev`:
| Path | Purpose | Populated |
|------|---------|-----------|
| `platform/` | Platform code: confidence signal, contract resolver, outbox, HITL/ledger designs | Phase 07+ |
| `schemas/` | JSON Schemas: IR, PolicyCheckResult, contract | Phase 07 |
| `adapters/` | Substrate adapters (Terraform adapter in v1; the only substrate-specific code per §12) | Phase 09 |
| `terraform/` | State backend + provider config (S3 state + DynamoDB lock) | Phase 08+ |
| `modules-ir/` | IR-typed L1/L2 modules (`l1-s3`, `l2-static-asset`) | Phase 0910 |
| `scripts/` | v1.1 verify scripts (`verify_phaseNN.sh`) | Phase 06+ |
| `demo/` | Archived v1.0 executive demo (tag `v1.1.0`); runs locally via `demo/scripts/run_demo.sh --no-upload` | complete |
| `.ciagent/` | CIAgent metadata (plans, decisions, personas, roadmap, research) | active |
| `docs/` | Upstream vision + architecture sources | active |
- `acdl` (this repo) — platform + stubs + reusable workflows
- `acdl-contracts` — developer surface (`contract.yaml` + issue trigger)
- `acdl-evidence` — audit timeline (served via raw file URLs; Gitea has no
native Pages — see `.ciagent/ARCHITECTURE.md` Gitea API Surface table)
## Running the archived demo
## Project metadata
See `.ciagent/PROJECT.md` for the full spec, `.ciagent/ROADMAP.md` for the
5-phase breakdown, `.ciagent/REQUIREMENTS.md` for traceable requirements,
and `.ciagent/PERSONAS.md` for the active persona roster.
## Phase 01 verification
After running `scripts/gitea_setup.sh` (which creates `acdl-contracts` and
`acdl-evidence` in the org and pushes the placeholder `index.html`), run:
The v1.0 demo is an archived artifact. To re-run it locally:
```bash
ACDL_GITEA_TOKEN=<token> scripts/verify_phase01.sh
bash demo/scripts/run_demo.sh --no-upload
```
The script confirms:
- both new repos exist via the Gitea API
- the raw `index.html` URL on `acdl-evidence` returns HTTP 200
- the `qa` and `prod` branches exist on `acdl-contracts`
Exit 0 = Phase 01 success criteria met.
The demo deck is at [`demo/ACDL_DEMO.md`](demo/ACDL_DEMO.md). The demo runs
entirely on local stubs — no AWS, no AI — and shows intent and safety
behavior rather than provisioning real cloud resources. It is the reference
of intent for the real platform; it is not the platform itself.
+368
View File
@@ -0,0 +1,368 @@
---
marp: true
theme: default
paginate: true
size: 16:9
header: 'ACDL · Agentic Cloud Delivery Platform'
footer: 'Executive Demo · v1.0'
style: |
/* S&P Global-inspired palette */
:root {
--sp-red: #C8102E;
--sp-red-dark: #8E0B20;
--sp-ink: #1A1A1A;
--sp-slate: #4A4A4A;
--sp-gray: #6E6E6E;
--sp-line: #D6D6D6;
--sp-bg: #FFFFFF;
--sp-tint: #F4F4F4;
}
section {
font-size: 24px;
color: var(--sp-ink);
background: var(--sp-bg);
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
padding: 50px 60px;
}
section.title {
text-align: center;
background: var(--sp-red);
color: #FFFFFF;
display: flex;
flex-direction: column;
justify-content: center;
}
section.title h1 {
color: #FFFFFF;
font-size: 64px;
margin-bottom: 0;
border: none;
}
section.title h2 {
color: #FFFFFF;
border: none;
font-weight: 400;
}
section.title strong { color: #FFFFFF; }
h1 {
color: var(--sp-red);
font-size: 40px;
font-weight: 700;
margin-bottom: 12px;
}
h2 {
color: var(--sp-red);
border-bottom: 3px solid var(--sp-red);
padding-bottom: 6px;
font-weight: 700;
}
h3 {
color: var(--sp-red-dark);
font-weight: 600;
margin-top: 24px;
}
ul, ol { color: var(--sp-slate); }
li { margin-bottom: 6px; }
strong { color: var(--sp-ink); }
table {
font-size: 18px;
width: 100%;
border-collapse: collapse;
margin: 12px 0;
}
th {
background: var(--sp-red);
color: #FFFFFF;
text-align: left;
padding: 10px 12px;
font-weight: 600;
border: 1px solid var(--sp-red-dark);
}
td {
padding: 8px 12px;
border: 1px solid var(--sp-line);
color: var(--sp-slate);
}
tr:nth-child(even) td { background: var(--sp-tint); }
pre {
font-size: 13px;
background: var(--sp-tint);
border-left: 4px solid var(--sp-red);
padding: 14px 16px;
border-radius: 0;
color: var(--sp-ink);
}
code {
background: var(--sp-tint);
color: var(--sp-red-dark);
padding: 1px 5px;
border-radius: 2px;
font-family: 'Menlo', 'Consolas', monospace;
}
pre code {
background: none;
color: var(--sp-ink);
padding: 0;
}
blockquote {
border-left: 5px solid var(--sp-red);
background: var(--sp-tint);
padding: 10px 16px;
color: var(--sp-slate);
font-style: italic;
border-radius: 0;
}
header {
color: var(--sp-red);
font-weight: 700;
font-size: 14px;
}
footer {
color: var(--sp-gray);
font-size: 12px;
}
section::after {
color: var(--sp-red);
font-weight: 700;
}
---
<!-- _class: title -->
# ACDL
## Agentic Cloud Delivery Platform
Automatic. Safe. Audited. — in 30 minutes, on stubs.
v1.0 · GitHub Actions · stub-driven
<!--
30-min exec demo. Emphasize: we prove INTENT and SAFETY, not provision real infra.
Everything runs as local stubs on Linux via GitHub Actions. No AWS.
-->
---
# The Problem
### Today, deploying infrastructure takes **weeks**
- Ticket → triage queue → copy-paste config → peer review → security review → waiting for central IT to release
> Two weeks of human latency for a service that should take minutes.
### What we want instead
- Developer commits a **contract** → pipeline runs
- Safety **computed** automatically (confidence signal)
- Manual gates only where they matter (QA, Prod)
- Every step written to a tamper-evident **evidence stream**
<!--
Set the pain. Ask: who has lived this? Then pivot to the vision.
-->
---
# How It Works
```
┌────────────── acdl-contracts ──────────────┐
Developer ──▶│ commit contract.yaml │
└───────┬───────────────────────────────────┘
│ (push)
Citizen ┌─────────┴──────────┐
│ "ingest gas pricing into data lake"
Claude agent ──▶ contract.yaml ─┘
│ (push)
┌─────────────────┐
│ reusable │
│ GitHub Actions │
│ pipeline │
└────────┬────────┘
┌─────────────┼─────────────┐
▼ ▼ ▼
Dev (auto) QA (approval) Prod (approval)
evidence_writer ─▶ audit.json (hash-chained) ─▶ Pages timeline
```
Two entry paths, **one** pipeline, **one** audit trail — developer via GitHub, citizen developer via their own Claude agent.
<!--
Two surfaces: developers push contracts directly to GitHub; citizen developers prompt a Claude agent they own, which writes and pushes the contract for them.
Both converge on one GitHub Actions pipeline with three stages.
-->
---
# The Safety Story
### Computed, not requested
| Signal | Behavior |
|--------|----------|
| **Base confidence** | 0.90 |
| **On policy violation** | drop to 0.40 + reason code |
| **Gate threshold** | ≥ 0.50 to proceed past Dev |
### Policy (v1)
- `public-ingress: true``POLICY_VIOLATION:PUBLIC_INGRESS`
### Evidence
- Each event appended to `audit.json` with SHA-256 link to previous (`prev_hash` + `hash`)
- Published to Pages → vanilla-JS timeline
<!--
Safety is computed by the platform, not asked of the developer.
Threshold 0.50 is exact → 0.90 passes, 0.40 halts. That's what makes the three scenarios deterministic.
-->
---
# Scenario 1 — Developer Self-Service
### Trigger
Developer commits a valid `contract.yaml` requesting **`l2-commodity-price-feed`** via **GitHub**.
### What you'll see
- **Dev:** policy ✅ → apply api-gateway, lambda, s3 → confidence **0.90** → proceed
- **QA:** pipeline pauses → click **Approve**
- **Prod:** pipeline pauses → click **Approve**
- **Finalize:** `audit.json` committed → Pages timeline updates
### Evidence outcome
Timeline shows: contract received → policy pass → apply × 3 → confidence 0.90 → QA → Prod → published.
<!--
Normal developer flow: human writes the contract, pushes to GitHub, the GitHub Action pipeline runs.
Narrate: developer commits and walks away; platform does the rest.
Pause visibly at each gate so the audience sees human-in-the-loop.
End by refreshing the Pages timeline.
-->
---
# Scenario 1 — Journey
```mermaid
flowchart LR
classDef gh fill:#F4F4F4,stroke:#1A1A1A,stroke-width:2px,color:#1A1A1A
classDef stage fill:#C8102E,stroke:#8E0B20,stroke-width:1px,color:#FFFFFF
classDef gate fill:#FFFFFF,stroke:#1A1A1A,stroke-width:2px,color:#1A1A1A
classDef evidence fill:#F4F4F4,stroke:#C8102E,stroke-width:1px,color:#1A1A1A
D["Developer"]:::gh -->|"writes contract.yaml"| GH["GitHub<br/>acdl-contracts"]:::gh
GH -->|"push triggers<br/>GitHub Action"| DEV["Dev<br/>(autonomous)"]:::stage
DEV -->|"policy ✅ · confidence 0.90"| QA["QA<br/>approval gate"]:::gate
QA -->|"approve"| PROD["Prod<br/>approval gate"]:::gate
PROD -->|"approve"| FIN["Finalize<br/>commit audit.json"]:::stage
FIN --> TL["GitHub Pages<br/>timeline"]:::evidence
```
<!--
Point to the two approval gates — QA and Prod — both human clicks.
The whole chain from commit to timeline is one GitHub Actions workflow.
-->
---
# Scenario 2 — Citizen Developer
### Trigger
Non-technical user prompts their **own Claude agent** in natural language:
> "I need a new service to ingest real-time natural gas pricing data into our data lake."
### What you'll see
- Claude agent parses intent, writes `contract.yaml` for **`l2-commodity-price-feed`**, pushes a branch
- Issue **closed**; branch push triggers the **identical** pipeline from Scenario 1
- Citizen developer follows the run all the way to **Prod**
### Evidence outcome
Timeline is **indistinguishable** from Scenario 1 — the agentic surface is first-class, not a bolt-on.
<!--
Punchline: same timeline, same safety, same audit — different entry.
The citizen developer owns and drives their own Claude agent; they are the actor, not the platform.
Normal developers (Scenario 1) keep using GitHub directly — two surfaces, one pipeline, one audit.
-->
---
# Scenario 2 — Journey
```mermaid
flowchart LR
classDef cit fill:#F4F4F4,stroke:#C8102E,stroke-width:2px,color:#1A1A1A
classDef agent fill:#C8102E,stroke:#8E0B20,stroke-width:1px,color:#FFFFFF
classDef stage fill:#1A1A1A,stroke:#1A1A1A,stroke-width:1px,color:#FFFFFF
classDef gate fill:#FFFFFF,stroke:#1A1A1A,stroke-width:2px,color:#1A1A1A
classDef evidence fill:#F4F4F4,stroke:#C8102E,stroke-width:1px,color:#1A1A1A
CD["Citizen developer"]:::cit -->|"natural-language<br/>prompt"| CL["Claude agent<br/>(citizen-owned)"]:::agent
CL -->|"generates<br/>contract.yaml"| GH["GitHub<br/>acdl-contracts"]:::cit
GH -->|"push triggers<br/>GitHub Action"| DEV["Dev<br/>(autonomous)"]:::stage
DEV -->|"policy ✅ · confidence 0.90"| QA["QA<br/>approval gate"]:::gate
QA -->|"approve"| PROD["Prod<br/>approval gate"]:::gate
PROD -->|"approve"| FIN["Finalize<br/>commit audit.json"]:::stage
FIN --> TL["GitHub Pages<br/>timeline"]:::evidence
```
<!--
Highlight the red Claude-agent node — owned by the citizen, not by the platform.
From GitHub onward the journey is identical to Scenario 1.
-->
---
# Scenario 3 — The Safety Net
### Trigger
Developer commits a **malicious** `contract.yaml` for `l2-regulatory-reporting` via **GitHub**:
```yaml
stack: l2-regulatory-reporting
public-ingress: true
```
### What you'll see
- **Dev:** `policy_checker``POLICY_VIOLATION:PUBLIC_INGRESS`
- `confidence_signal` drops 0.90 → **0.40**
- `0.40 < 0.50` → pipeline **halts in Dev**
- Rejection reason written to the evidence stream
### Evidence outcome
Timeline shows the attempted deploy, the violation, the confidence drop, and the **halt** — visible and explained.
<!--
The safety money shot. The platform said NO, and said WHY, on the record.
No human had to catch it — the confidence signal computed the risk.
Contrast with The Problem's old-world review queue.
-->
---
# Scenario 3 — Journey
```mermaid
flowchart LR
classDef gh fill:#F4F4F4,stroke:#1A1A1A,stroke-width:2px,color:#1A1A1A
classDef stage fill:#C8102E,stroke:#8E0B20,stroke-width:1px,color:#FFFFFF
classDef halt fill:#1A1A1A,stroke:#1A1A1A,stroke-width:1px,color:#FFFFFF
classDef evidence fill:#F4F4F4,stroke:#C8102E,stroke-width:1px,color:#1A1A1A
D["Developer"]:::gh -->|"writes malicious<br/>contract.yaml"| GH["GitHub<br/>acdl-contracts"]:::gh
GH -->|"push triggers<br/>GitHub Action"| DEV["Dev<br/>(autonomous)"]:::stage
DEV -->|"POLICY_VIOLATION:PUBLIC_INGRESS<br/>confidence 0.90 → 0.40"| HALT["Halt in Dev<br/>+ rejection reason"]:::halt
HALT --> TL["GitHub Pages<br/>timeline"]:::evidence
```
<!--
The black halt node is the whole point — pipeline stops, evidence records why.
Notice there are no QA/Prod gates on this path; the journey ends at Dev.
-->
View File
View File
View File
View File
+44
View File
@@ -0,0 +1,44 @@
#!/usr/bin/env bash
# scripts/verify_phase06.sh - Phase 06 archive regression + layout check.
# Lives at TOP-LEVEL scripts/ (v1.1 verify scripts), NOT demo/scripts/.
set -u
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
fail() { echo "FAIL: $*" >&2; exit 1; }
ok() { echo "ok: $*"; }
# --- Check 1: demo/ contains the full v1.0 demo tree ---
for d in demo/modules demo/scripts demo/evidence-ui demo/contracts \
demo/contracts-repo demo/.gitea/workflows; do
[ -d "$d" ] || fail "missing $d"
done
[ -f demo/ACDL_DEMO.md ] || fail "missing demo/ACDL_DEMO.md"
[ -f demo/scripts/run_demo.sh ] || fail "missing demo/scripts/run_demo.sh"
ok "demo/ contains the full v1.0 demo"
# --- Check 2: regression - the archived demo still runs from demo/ ---
out=$(ACDL_GITEA_TOKEN= bash demo/scripts/run_demo.sh --no-upload 2>&1); rc=$?
[ "$rc" -eq 0 ] || { echo "$out" >&2; fail "demo/scripts/run_demo.sh --no-upload exited $rc"; }
ok "demo/scripts/run_demo.sh --no-upload exits 0"
# --- Check 3: new top-level dirs exist and are scaffolded ---
for d in platform schemas adapters terraform modules-ir; do
[ -d "$d" ] || fail "missing new top-level dir $d"
[ -f "$d/.gitkeep" ] || fail "missing $d/.gitkeep"
done
ok "new top-level dirs exist: platform/ schemas/ adapters/ terraform/ modules-ir/"
# --- Check 4: no stray v1.0 dirs left at repo root ---
for stray in modules evidence-ui contracts contracts-repo ACDL_DEMO.md; do
[ -e "$stray" ] && fail "stray $stray left at repo root (should be under demo/)"
done
[ -e ".gitea" ] && fail "stray .gitea/ left at repo root (moved to demo/.gitea/)"
ok "no stray v1.0 dirs at repo root"
# --- Check 5: README reflects the real platform ---
grep -q "Agentic Cloud Delivery Platform" README.md || fail "README missing platform name"
grep -q "demo/" README.md || fail "README does not reference the archived demo/"
grep -qi "vision\|architecture" README.md || fail "README missing vision/architecture links"
ok "README reflects the real platform (name + demo/ ref + vision/arch links)"
echo "Phase 06: ALL CHECKS PASS"
View File