---
marp: true
theme: default
paginate: true
size: 16x9
header: "The Developer Experience"
footer: "Internal"
style: |
section {
font-family: "Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;
font-size: 22px;
color: #1B1B1B;
}
h1 { color: #D6002A; font-size: 34px; margin-bottom: 0.3em; }
h2 { color: #D6002A; font-size: 26px; margin-bottom: 0.2em; }
section.title { background: #1B1B1B; color: #fff; border-top: 8px solid #D6002A; }
section.title h1 { color: #fff; }
table { font-size: 18px; width: 100%; }
th { background: #F0F0F0; }
blockquote { border-left: 4px solid #D6002A; color: #2E2E2E; font-size: 20px; }
pre { font-size: 14px; line-height: 1.3; }
code { font-size: 14px; }
img { display: block; margin: 0 auto; max-height: 300px; }
.badge {
display: inline-block; padding: 2px 8px; border-radius: 4px;
font-size: 14px; font-weight: 600;
}
.testing { background: #DBEAFE; color: #1E3A5F; }
.planned { background: #fef3c7; color: #78350f; }
.agentic { background: #EDE9FE; color: #4C1D95; }
---
# The Developer Experience
### Agentic Cloud Delivery Platform
---
# Two Consumer Surfaces, One Platform
The platform serves **two kinds of consumer** — both converge on the **same contract, the same policy envelope, and the same evidence stream.**

- **Technical developer** — owns app code + a contract + a thin CI definition
- **Citizen developer** — declares intent in plain language; an AI agent produces a contract that passes the **same** safety envelope Agentic
The platform is **opinionated in what it accepts, regardless of who is declaring.** There is no "citizen developer mode" with weaker checks.
---
# The Contract — The Entire Consumer Surface
Three things. That is the entire consumer-side surface.
- **1. App code** — the consumer's service, at the top level of the repo
- **2. A contract** — a single YAML file: module, environment, inputs
```yaml
uses: acdl/pipelines/deploy.yaml@v1.6
module: microservice
environment: dev
inputs:
image: my-registry/my-microservice:latest
port: 8080
```
- **3. A one-line CI definition** — a thin `uses:` wrapper pointing at a versioned platform workflow
- The developer does **not**: write infrastructure modules, clone the platform repo, hold cloud credentials, or maintain a state backend
---
# The Developer Feedback Loop
Developers see **what the platform is doing**, in real time, in their own run logs. Testing
- **Streamed output by default** — the infrastructure plan, policy-check results, and each check record flow to stdout
- **PR comments after every successful pipeline stage** — a developer always knows where they stand without refreshing a dashboard
- **Clear, explainable halt reasons** — a policy violation, an insufficient confidence signal, or a missing attestation. **Never an opaque debugging exercise.**
- **Connection strings posted as PR comments** — human-readable, no hunting
- **Runtime secrets in encrypted Parameter Store** — KMS-encrypted, namespaced, **no raw secrets in logs**
- **Errors become GitHub issues, automatically** — a failed deploy opens an issue on the platform repo
---
# Versioned, Predictable Releases
Consumers control **when** they absorb platform improvements. Testing
- **Floating MAJOR + MINOR tags** (e.g. `@v1.6`) — a consumer automatically receives patch updates within the line
- **Semantic versioning with a clear contract:** interface → MAJOR, behavior → MINOR, lifecycle → PATCH
- **A consumer can pin to an exact version** for maximum stability, or float on MAJOR only (`@v1`) to absorb new features on their own cadence
- **Unversioned references (`@main`, bare) are discouraged** — the versioned tag is the only immutability lever
- **Automated release job** computes the next semver on merge to main, creates the tag, and updates the floating tags
---
# Friendly Onboarding
First impressions of a platform are made **when it fails for the first time.** The platform fails gracefully. Testing
When no environment is bound, the platform emits a **user-friendly onboarding prompt** instead of failing opaquely:
1. That no environment is bound to their repo yet
2. What the platform will provision on their behalf (account, network, state, role)
3. The expected turnaround for the platform team to grant the environment
4. How to request an environment
The pipeline then **exits without attempting a deployment** — no partial state, no confusing errors.
Citizen developer onboarding path: planned
---
# Safe Promotion Path
The contract is environment-agnostic by design. Promotion is **a workflow choice, not a contract edit** — the platform raises the bar automatically.
| **Approach A — One contract, one job per environment.** The environment is passed by each job and interpolated at runtime. ```yaml jobs: dev: uses: acdl/.github/workflows/deploy.yml@v1.6 with: { contract: .acdl/contract.yaml, environment: dev } qa: needs: dev uses: acdl/.github/workflows/deploy.yml@v1.6 with: { contract: .acdl/contract.yaml, environment: qa } ``` | **Approach B — Environment-specific contracts.** When inputs genuinely differ, each job points at its own contract file. ```yaml jobs: dev: uses: acdl/.github/workflows/deploy.yml@v1.6 with: { contract: .acdl/contract-dev.yaml } qa: needs: dev uses: acdl/.github/workflows/deploy.yml@v1.6 with: { contract: .acdl/contract-qa.yaml } ``` |