diff --git a/docs/presentations/README.md b/docs/presentations/README.md index 9b18fed..e17c6bc 100644 --- a/docs/presentations/README.md +++ b/docs/presentations/README.md @@ -155,6 +155,7 @@ docs/presentations/ └── assets/ ├── puppeteer-config.json ← no-sandbox config for mmdc ├── mmd/ ← mermaid source files (Step 2 input) + │ ├── sp-theme.json ← S&P Red/Black/White theme (mermaid-cli --configFile) │ ├── platform-works-01-contract-driven.mmd │ ├── platform-works-02-end-to-end-flow.mmd │ ├── platform-works-03-scope-boundary.mmd @@ -256,12 +257,18 @@ for f in mmd/*.mmd; do PUPPETEER_EXECUTABLE_PATH=/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome \ npx --yes @mermaid-js/mermaid-cli@latest \ -i "$f" -o "png/$name.png" \ - -p puppeteer-config.json -s 2 -b transparent + -p puppeteer-config.json -s 2 -b transparent \ + --configFile mmd/sp-theme.json done ``` The `puppeteer-config.json` passes `--no-sandbox` to the headless browser -(required when running as root in this environment). +(required when running as root in this environment). The `--configFile +mmd/sp-theme.json` applies the S&P Global Red/Black/White theme (dark +`#1B1B1B` accent nodes with `#D6002A` red borders, white supporting nodes, +`#F0F0F0` subgraph backgrounds). Each `.mmd` file also carries the same +theme inline via a `%%{init:...}%%` block so it renders correctly even +without the `--configFile` flag. ### Export a Marp deck to HTML (committed to repo) diff --git a/docs/presentations/assets/mmd/developer-experience-01b-scope-boundary.mmd b/docs/presentations/assets/mmd/developer-experience-01b-scope-boundary.mmd index f11f8e5..aadbc56 100644 --- a/docs/presentations/assets/mmd/developer-experience-01b-scope-boundary.mmd +++ b/docs/presentations/assets/mmd/developer-experience-01b-scope-boundary.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR subgraph UP ["Upstream — anything"] direction TB @@ -18,4 +20,8 @@ flowchart LR C --> D C --> E D --> F - F --> G \ No newline at end of file + F --> G +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class C,D,E accent + diff --git a/docs/presentations/assets/mmd/developer-experience-02-what-dev-does.mmd b/docs/presentations/assets/mmd/developer-experience-02-what-dev-does.mmd index 92aa160..92736b9 100644 --- a/docs/presentations/assets/mmd/developer-experience-02-what-dev-does.mmd +++ b/docs/presentations/assets/mmd/developer-experience-02-what-dev-does.mmd @@ -1,5 +1,11 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR A["1. App code
(top level of the repo)"] --> D["Push to main"] - B["2. Contract
(.acdl/contract.yaml)"] --> D + B["2. Contract
(.acdl/contract.yml)"] --> D C["3. CI definition
(.github/workflows/deploy.yml
— one 'uses:' line)"] --> D - D --> E["Platform does the rest"] \ No newline at end of file + D --> E["Platform does the rest"] +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class E accent + diff --git a/docs/presentations/assets/mmd/developer-experience-03-no-cloning.mmd b/docs/presentations/assets/mmd/developer-experience-03-no-cloning.mmd index 1c52292..ed65a63 100644 --- a/docs/presentations/assets/mmd/developer-experience-03-no-cloning.mmd +++ b/docs/presentations/assets/mmd/developer-experience-03-no-cloning.mmd @@ -1,6 +1,12 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR A["Consumer repo
app + contract + 'uses:'"] -->|triggers on push to main| B["Platform runner"] B -->|checks out the consumer repo| A B -->|checks out the ACDL platform repo
into the workspace| C["Platform code
(modules, adapters, schemas)"] C --> B - B -->|runs the pipeline against
the consumer's contract| D["Consumer's resources in AWS"] \ No newline at end of file + B -->|runs the pipeline against
the consumer's contract| D["Consumer's resources in AWS"] +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class B,C accent + diff --git a/docs/presentations/assets/mmd/developer-experience-04-promotion-journey.mmd b/docs/presentations/assets/mmd/developer-experience-04-promotion-journey.mmd index 4981816..c0b84f7 100644 --- a/docs/presentations/assets/mmd/developer-experience-04-promotion-journey.mmd +++ b/docs/presentations/assets/mmd/developer-experience-04-promotion-journey.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR A["dev\n≥ 0.50\nautonomous"] -->|promotion| B["qa\n≥ 0.75\nQA attests"] B -->|promotion| C["prod\n≥ 0.90\nSRE attests"] @@ -5,4 +7,7 @@ flowchart LR A -.->|"Testing\n(pilot-ready)"| A B -.->|"Planned"| B C -.->|"Planned"| C - D -.->|"Planned"| D \ No newline at end of file + D -.->|"Planned"| D +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px + diff --git a/docs/presentations/assets/mmd/platform-works-01-contract-driven.mmd b/docs/presentations/assets/mmd/platform-works-01-contract-driven.mmd index ecbc9a5..54bb7d1 100644 --- a/docs/presentations/assets/mmd/platform-works-01-contract-driven.mmd +++ b/docs/presentations/assets/mmd/platform-works-01-contract-driven.mmd @@ -1,3 +1,9 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR A["Consumer
writes a contract"] --> B["Platform resolves,
compiles, checks,
deploys, records"] - B --> C["Resources running in AWS
+ tamper-evident evidence"] \ No newline at end of file + B --> C["Resources running in AWS
+ tamper-evident evidence"] +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class B accent + diff --git a/docs/presentations/assets/mmd/platform-works-02-end-to-end-flow.mmd b/docs/presentations/assets/mmd/platform-works-02-end-to-end-flow.mmd index 194e015..0bfa35c 100644 --- a/docs/presentations/assets/mmd/platform-works-02-end-to-end-flow.mmd +++ b/docs/presentations/assets/mmd/platform-works-02-end-to-end-flow.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart TD subgraph R1 [" "] direction LR @@ -7,4 +9,8 @@ flowchart TD direction LR F["Policy
checks"] --> G["Confidence
signal"] --> H["Evidence
event"] --> I["Infrastructure
apply"] end - E --> F \ No newline at end of file + E --> F +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class C,D,E,G,H accent + diff --git a/docs/presentations/assets/mmd/platform-works-03-scope-boundary.mmd b/docs/presentations/assets/mmd/platform-works-03-scope-boundary.mmd index e4fa375..0551c04 100644 --- a/docs/presentations/assets/mmd/platform-works-03-scope-boundary.mmd +++ b/docs/presentations/assets/mmd/platform-works-03-scope-boundary.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR subgraph UP ["Upstream — anything"] direction TB @@ -22,4 +24,8 @@ flowchart LR E --> F E --> G F --> H - H --> I \ No newline at end of file + H --> I +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class D,E,F,G accent + diff --git a/docs/presentations/assets/mmd/platform-works-04-confidence-signal.mmd b/docs/presentations/assets/mmd/platform-works-04-confidence-signal.mmd index 8a9d8b2..cebe7f6 100644 --- a/docs/presentations/assets/mmd/platform-works-04-confidence-signal.mmd +++ b/docs/presentations/assets/mmd/platform-works-04-confidence-signal.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR subgraph IN ["6 weighted inputs"] direction TB @@ -12,4 +14,8 @@ flowchart LR G --> H{"Threshold\ngate"} H -->|Meets threshold| I["Proceed"] H -->|Below threshold| J["Halt +\nexplainable reason"] - H -->|Critical finding| J \ No newline at end of file + H -->|Critical finding| J +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class G,H,J accent + diff --git a/docs/presentations/assets/mmd/platform-works-05-attestation-flow.mmd b/docs/presentations/assets/mmd/platform-works-05-attestation-flow.mmd index 446c750..3eee146 100644 --- a/docs/presentations/assets/mmd/platform-works-05-attestation-flow.mmd +++ b/docs/presentations/assets/mmd/platform-works-05-attestation-flow.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR A["Deployment arrives\nat env gate"] --> B["Confidence signal\ncomputed"] B --> C{"Meets\nthreshold?"} @@ -10,4 +12,8 @@ flowchart LR H -->|Reject| J["Halt — rejection\nextends audit chain"] I --> K["Deployment\nproceeds"] F --> K - K --> L["Evidence written\nRPO=0"] \ No newline at end of file + K --> L["Evidence written\nRPO=0"] +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class C,E,I,K,L accent + diff --git a/docs/presentations/assets/mmd/road-to-north-star.mmd b/docs/presentations/assets/mmd/road-to-north-star.mmd index b2faead..0a1ce70 100644 --- a/docs/presentations/assets/mmd/road-to-north-star.mmd +++ b/docs/presentations/assets/mmd/road-to-north-star.mmd @@ -1,3 +1,5 @@ +%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1B1B", "primaryBorderColor": "#D6002A", "primaryTextColor": "#fff", "secondaryColor": "#fff", "secondaryBorderColor": "#D6002A", "secondaryTextColor": "#1B1B1B", "tertiaryColor": "#F0F0F0", "clusterBkg": "#F0F0F0", "lineColor": "#1B1B1B", "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif"}}}%% + flowchart LR A["v1.0\nDEMO\ncomplete"] --> B["v1.1–v1.8\nPLATFORM BUILD\ncomplete"] B --> C["v1.9\nPRESENTATIONS + PATCHES\ncomplete"] @@ -8,4 +10,8 @@ flowchart LR B -.->|"IR + OIDC + ABAC +\nmodule catalog +\nencryption + decommission"| B C -.->|"10-slide decks +\ntalking points +\nS&P theme"| C D -.->|"proposed phasing\nnot formally planned"| D - E -.->|"proposed phasing\nnot formally planned"| E \ No newline at end of file + E -.->|"proposed phasing\nnot formally planned"| E +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class F accent + diff --git a/docs/presentations/assets/mmd/sp-theme.json b/docs/presentations/assets/mmd/sp-theme.json new file mode 100644 index 0000000..ce08fc7 --- /dev/null +++ b/docs/presentations/assets/mmd/sp-theme.json @@ -0,0 +1,15 @@ +{ + "theme": "base", + "themeVariables": { + "primaryColor": "#1B1B1B", + "primaryBorderColor": "#D6002A", + "primaryTextColor": "#fff", + "secondaryColor": "#fff", + "secondaryBorderColor": "#D6002A", + "secondaryTextColor": "#1B1B1B", + "tertiaryColor": "#F0F0F0", + "clusterBkg": "#F0F0F0", + "lineColor": "#1B1B1B", + "fontFamily": "\"Akkurat Pro\", \"Helvetica Neue\", \"Arial\", sans-serif" + } +} \ No newline at end of file diff --git a/docs/presentations/assets/png/developer-experience-01b-scope-boundary.png b/docs/presentations/assets/png/developer-experience-01b-scope-boundary.png index ca26e43..32eb3aa 100644 Binary files a/docs/presentations/assets/png/developer-experience-01b-scope-boundary.png and b/docs/presentations/assets/png/developer-experience-01b-scope-boundary.png differ diff --git a/docs/presentations/assets/png/developer-experience-02-what-dev-does.png b/docs/presentations/assets/png/developer-experience-02-what-dev-does.png index 39ce66c..a6ffd5a 100644 Binary files a/docs/presentations/assets/png/developer-experience-02-what-dev-does.png and b/docs/presentations/assets/png/developer-experience-02-what-dev-does.png differ diff --git a/docs/presentations/assets/png/developer-experience-03-no-cloning.png b/docs/presentations/assets/png/developer-experience-03-no-cloning.png index 97c9872..adf58a8 100644 Binary files a/docs/presentations/assets/png/developer-experience-03-no-cloning.png and b/docs/presentations/assets/png/developer-experience-03-no-cloning.png differ diff --git a/docs/presentations/assets/png/developer-experience-04-promotion-journey.png b/docs/presentations/assets/png/developer-experience-04-promotion-journey.png index 152b2f9..88ea3ff 100644 Binary files a/docs/presentations/assets/png/developer-experience-04-promotion-journey.png and b/docs/presentations/assets/png/developer-experience-04-promotion-journey.png differ diff --git a/docs/presentations/assets/png/platform-works-01-contract-driven.png b/docs/presentations/assets/png/platform-works-01-contract-driven.png index 21629ea..d9b0b6c 100644 Binary files a/docs/presentations/assets/png/platform-works-01-contract-driven.png and b/docs/presentations/assets/png/platform-works-01-contract-driven.png differ diff --git a/docs/presentations/assets/png/platform-works-02-end-to-end-flow.png b/docs/presentations/assets/png/platform-works-02-end-to-end-flow.png index 534fd49..0d5cd35 100644 Binary files a/docs/presentations/assets/png/platform-works-02-end-to-end-flow.png and b/docs/presentations/assets/png/platform-works-02-end-to-end-flow.png differ diff --git a/docs/presentations/assets/png/platform-works-03-scope-boundary.png b/docs/presentations/assets/png/platform-works-03-scope-boundary.png index 218fe6d..0940889 100644 Binary files a/docs/presentations/assets/png/platform-works-03-scope-boundary.png and b/docs/presentations/assets/png/platform-works-03-scope-boundary.png differ diff --git a/docs/presentations/assets/png/platform-works-04-confidence-signal.png b/docs/presentations/assets/png/platform-works-04-confidence-signal.png index 56832ba..8e829d3 100644 Binary files a/docs/presentations/assets/png/platform-works-04-confidence-signal.png and b/docs/presentations/assets/png/platform-works-04-confidence-signal.png differ diff --git a/docs/presentations/assets/png/platform-works-05-attestation-flow.png b/docs/presentations/assets/png/platform-works-05-attestation-flow.png index 15d210f..5d1cc84 100644 Binary files a/docs/presentations/assets/png/platform-works-05-attestation-flow.png and b/docs/presentations/assets/png/platform-works-05-attestation-flow.png differ diff --git a/docs/presentations/assets/png/road-to-north-star.png b/docs/presentations/assets/png/road-to-north-star.png index e143424..ffcda60 100644 Binary files a/docs/presentations/assets/png/road-to-north-star.png and b/docs/presentations/assets/png/road-to-north-star.png differ diff --git a/docs/presentations/how-the-platform-works-marp.md b/docs/presentations/how-the-platform-works-marp.md index 9844538..ce98255 100644 --- a/docs/presentations/how-the-platform-works-marp.md +++ b/docs/presentations/how-the-platform-works-marp.md @@ -45,7 +45,7 @@ section.title h3 { color: #F0F0F0; font-weight: 400; font-size: 22px; margin-top # The Problem & The North Star -Story beat: Here's the problem we're solving and where we're going. +Here's the problem we're solving and where we're going. Four frictions slow every team: @@ -64,7 +64,7 @@ Four frictions slow every team: # Where ACDL Sits in Your World -Story beat: Now that we know the problem, here's where ACDL fits — and where it doesn't. +Now that we know the problem, here's where ACDL fits — and where it doesn't. ![w:1100](assets/png/platform-works-03-scope-boundary.png) @@ -77,7 +77,7 @@ Four frictions slow every team: # The Contract-Driven Model -Story beat: The contract is the boundary between upstream and ACDL. It's all a consumer writes. +The contract is the boundary between upstream and ACDL. It's all a consumer writes. A single YAML contract — **module, environment, inputs**. The platform owns everything else. @@ -92,7 +92,7 @@ A single YAML contract — **module, environment, inputs**. The platform owns ev # The End-to-End Flow -Story beat: Once the contract is written, here's what the platform does with it — every time. +Once the contract is written, here's what the platform does with it — every time. Every deployment runs the same stages, in the same order, with the same checks — no team-specific pipelines, no tribal runbooks. @@ -105,7 +105,7 @@ Every deployment runs the same stages, in the same order, with the same checks # Zero-Trust by Default -Story beat: Before any infrastructure is created, here's how access is scoped. +Before any infrastructure is created, here's how access is scoped. Consumer repositories hold **no long-lived cloud credentials.** Ever. @@ -120,7 +120,7 @@ Consumer repositories hold **no long-lived cloud credentials.** Ever. # Safety is Computed, Not Assumed -Story beat: Now let's look at how the platform decides whether a deployment is safe. +Now let's look at how the platform decides whether a deployment is safe. Every delivery action produces a **measurable, explainable confidence signal** — a weighted sum of observable facts, not a black box. Agentic @@ -141,7 +141,7 @@ Every delivery action produces a **measurable, explainable confidence signal** # Security by Construction -Story beat: Beyond the confidence signal, security defaults are on by construction — not by opt-in. +Beyond the confidence signal, security defaults are on by construction — not by opt-in. Security defaults that **do not require a team to opt in.** Checks run on **every** deployment, normalized to a single schema. Testing @@ -154,7 +154,7 @@ Security defaults that **do not require a team to opt in.** Checks run on **ever # Accountability & Audit -Story beat: Computed safety handles the gate. But humans still matter — here's how accountability works. +Computed safety handles the gate. But humans still matter — here's how accountability works. ![w:1100](assets/png/platform-works-05-attestation-flow.png) @@ -171,7 +171,7 @@ Security defaults that **do not require a team to opt in.** Checks run on **ever # Testing vs. Planned -Story beat: Let's be honest about what works today and what's on the roadmap. +Let's be honest about what works today and what's on the roadmap. \n
\n \n \n \n
\n `.split(/\n\s*/).join(""),this.wrapper=this.shadowRoot.querySelector(`div[${e}]`)??void 0;const t=this.svg;this.svg=this.wrapper?.querySelector(`svg[${i}]`)??void 0,this.svg!==t&&(this.svgComputedStyle=this.svg?window.getComputedStyle(this.svg):void 0),this.container=this.svg?.querySelector(`span[${n}]`)??void 0,this.observe()}disconnectedCallback(){this.svg=void 0,this.svgComputedStyle=void 0,this.wrapper=void 0,this.container=void 0,this.observe()}attributeChangedCallback(){this.observe()}flushSvgDisplay(){const{svg:t}=this;t&&(t.style.display="inline",requestAnimationFrame(()=>{t.style.display=""}))}observe(){this.containerObserver.disconnect(),this.wrapperObserver.disconnect(),this.wrapper&&this.wrapperObserver.observe(this.wrapper),this.container&&this.containerObserver.observe(this.container),this.svgComputedStyle&&this.observeSVGStyle(this.svgComputedStyle)}observeSVGStyle(t){const e=()=>{const i=(()=>{const e=t.getPropertyValue("--preserve-aspect-ratio");if(e)return e.trim();return`x${(({textAlign:t,direction:e})=>{if(t.endsWith("left"))return"Min";if(t.endsWith("right"))return"Max";if("start"===t||"end"===t){let i="rtl"===e;return"end"===t&&(i=!i),i?"Max":"Min"}return"Mid"})(t)}YMid meet`})();i!==this.svgPreserveAspectRatio&&(this.svgPreserveAspectRatio=i,this.updateSVGRect()),t===this.svgComputedStyle&&requestAnimationFrame(e)};e()}updateSVGRect(){let t=Math.ceil(this.containerSize?.width??0);const e=Math.ceil(this.containerSize?.height??0);void 0!==this.dataset.downscaleOnly&&(t=Math.max(t,this.wrapperSize?.width??0));const i=this.svg?.querySelector(":scope > foreignObject");if(i?.setAttribute("width",`${t}`),i?.setAttribute("height",`${e}`),this.svg&&(this.svg.setAttribute("viewBox",`0 0 ${t} ${e}`),this.svg.setAttribute("preserveAspectRatio",this.svgPreserveAspectRatio),this.svg.style.height=t<=0||e<=0?"0":""),this.container){const t=this.svgPreserveAspectRatio.toLowerCase();this.container.style.marginLeft=t.startsWith("xmid")||t.startsWith("xmax")?"auto":"0",this.container.style.marginRight=t.startsWith("xmi")?"auto":"0"}}}const r=(t,{attrs:e={},style:i})=>class extends t{constructor(...t){super(...t);for(const[t,i]of Object.entries(e))this.hasAttribute(t)||this.setAttribute(t,i);this._shadow()}static get observedAttributes(){return["data-auto-scaling"]}connectedCallback(){this._update()}attributeChangedCallback(){this._update()}_shadow(){if(!this.shadowRoot)try{this.attachShadow({mode:"open"})}catch(t){if(!(t instanceof Error&&"NotSupportedError"===t.name))throw t}return this.shadowRoot}_update(){const t=this._shadow();if(t){const e=i?``:"";let n="";const{autoScaling:s}=this.dataset;if(void 0!==s){n=`${n}`}t.innerHTML=e+n}}};let o;const a=()=>o??(o=!!document.createElement("div",{is:"marp-auto-scaling"}).outerHTML.startsWith("
{const t="Apple Computer, Inc."===navigator.vendor,e=t?[v]:[],i={then:e=>(t?(async()=>{if(void 0===c){const t=document.createElement("canvas");t.width=10,t.height=10;const e=t.getContext("2d"),i=new Image(10,10),n=new Promise(t=>{i.addEventListener("load",()=>t())});i.crossOrigin="anonymous",i.src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%201%201%22%3E%3CforeignObject%20width%3D%221%22%20height%3D%221%22%20requiredExtensions%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22width%3A%201px%3B%20height%3A%201px%3B%20background%3A%20red%3B%20position%3A%20relative%22%3E%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E",await n,e.drawImage(i,0,0),c=e.getImageData(5,5,1,1).data[3]<128}return c})().then(t=>{null==e||e(t?[v]:[])}):null==e||e([]),i)};return Object.assign(e,i)};let m,u;function v(t){const e="object"==typeof t&&t.target||document,i="object"==typeof t?t.zoom:t;window[g]||(Object.defineProperty(window,g,{configurable:!0,value:!0}),document.body.style.zoom=1.0001,document.body.offsetHeight,document.body.style.zoom=1,window.addEventListener("message",({data:t,origin:e})=>{if(e===window.origin)try{if(t&&"string"==typeof t&&t.startsWith(d)){const[,e]=t.split(","),i=Number.parseFloat(e);Number.isNaN(i)||(u=i)}}catch(t){console.error(t)}}));let n=!1;Array.from(e.querySelectorAll("svg[data-marpit-svg]"),t=>{var e,s,r,o;t.style.transform||(t.style.transform="translateZ(0)");const a=i||u||t.currentScale||1;m!==a&&(m=a,n=a);const l=t.getBoundingClientRect(),{length:c}=t.children;for(let i=0;i{null==t||t.postMessage(`${d}${n}`,"null"===window.origin?"*":window.origin)})}function w({once:t=!1,target:e=document}={}){const i=function(t=document){if(t[h])return t[h];let e=!0;const i=()=>{e=!1,delete t[h]};Object.defineProperty(t,h,{configurable:!0,value:i});let n=[],s=!1;(async()=>{try{n=await p()}finally{s=!0}})();const r=()=>{for(const e of n)e({target:t});s&&0===n.length||e&&window.requestAnimationFrame(r)};return r(),i}(e);return t?(i(),()=>{}):i}m=1,u=void 0;const b=Symbol(),y=(e=document)=>{if("undefined"==typeof window)throw new Error("Marp Core's browser script is valid only in browser context.");if(((e=document)=>{const i=window[l];i||customElements.define("marp-auto-scaling",s);for(const n of Object.keys(t)){const s=`marp-${n}`,o=t[n].proto();a()&&o!==HTMLElement?i||customElements.define(s,r(o,{style:t[n].style}),{extends:n}):(i||customElements.define(s,r(HTMLElement,t[n])),e.querySelectorAll(`${n}[is="${s}"]`).forEach(t=>{t.outerHTML=t.outerHTML.replace(new RegExp(`^<${n}`,"i"),`<${s}`).replace(new RegExp(`$`,"i"),``)}))}window[l]=!0})(e),e[b])return e[b];const i=w({target:e}),n=()=>{i(),delete e[b]},o=Object.assign(n,{cleanup:n,update:()=>y(e)});return Object.defineProperty(e,b,{configurable:!0,value:o}),o},f=document.currentScript;y(f?f.getRootNode():document)}();
\ No newline at end of file diff --git a/docs/presentations/how-the-platform-works.md b/docs/presentations/how-the-platform-works.md index e7b6661..4b298db 100644 --- a/docs/presentations/how-the-platform-works.md +++ b/docs/presentations/how-the-platform-works.md @@ -21,6 +21,8 @@ ## Slide 2 — The Problem & The North Star +Here's the problem we're solving and where we're going. + Software delivery scales with the **coordination surface around it**, not the engineering inside it. Most teams can write code; far fewer get the infrastructure right. Four frictions slow every team: @@ -44,6 +46,8 @@ Four frictions slow every team: Now that we know the problem, here's where ACDL fits — and where it doesn't. +Now that we know the problem, here's where ACDL fits — and where it doesn't. + - **Upstream is anything** — your IDE, an agentic SDLC, or a citizen developer vibe coding on a laptop. ACDL doesn't care how the contract was produced. - **ACDL is infrastructure only** — it provisions and governs AWS resources. It does not build, test, or deploy your application code. That's upstream. - **Not a general-purpose AI** — autonomy is narrow, scoped to delivery, bounded by strict policy envelopes. @@ -57,6 +61,8 @@ Now that we know the problem, here's where ACDL fits — and where it doesn't. The contract is the boundary between upstream and ACDL. It's all a consumer writes. +The contract is the boundary between upstream and ACDL. It's all a consumer writes. + A single YAML contract — **module, environment, inputs**. The platform owns everything else. ```mermaid @@ -82,6 +88,8 @@ The consumer does **not** write infrastructure modules, workflow logic, or adapt Once the contract is written, here's what the platform does with it — every time. +Once the contract is written, here's what the platform does with it — every time. + Every deployment runs the same stages, in the same order, with the same checks — no team-specific pipelines, no tribal runbooks. ```mermaid @@ -109,6 +117,8 @@ Two properties matter to leadership: Before any infrastructure is created, here's how access is scoped. +Before any infrastructure is created, here's how access is scoped. + Consumer repositories hold **no long-lived cloud credentials.** Ever. - **Authentication is OIDC federation** between the platform runners and the cloud provider. Each job mints a short-lived token; no credential is stored in the consumer repo or in a runner secret. *(Testing on GitHub Actions runners; planned for all platform runners.)* @@ -126,6 +136,8 @@ Consumer repositories hold **no long-lived cloud credentials.** Ever. Now let's look at how the platform decides whether a deployment is safe. +Now let's look at how the platform decides whether a deployment is safe. + Every delivery action produces a **measurable, explainable confidence signal** — a weighted sum of observable facts, not a black box. *(Agentic.)* - **Six weighted inputs** — policy conformance, validation, freshness, source provenance, history, and non-functional requirements (NFRs). The weights are **manually tuned**, the inputs are **observable**, and the breakdown is **auditable** — if a consumer asks "why 0.62?", the platform answers with a per-input breakdown. @@ -149,6 +161,8 @@ Every delivery action produces a **measurable, explainable confidence signal** Beyond the confidence signal, security defaults are on by construction — not by opt-in. +Beyond the confidence signal, security defaults are on by construction — not by opt-in. + Security defaults that **do not require a team to opt in.** Checks run on **every** deployment, normalized to a single schema regardless of which engine produced them. *(Testing.)* - **Infrastructure-as-code policy** (Checkov) — secrets in plaintext, public ingress, IAM wildcards, KMS key references, **required tagging standards** (`acdl:owner`, `acdl:contract`, `acdl:environment`, `acdl:cost-center`). All run *before* infra is created. @@ -168,6 +182,8 @@ Security defaults that **do not require a team to opt in.** Checks run on **ever Computed safety handles the gate. But humans still matter — here's how accountability works. +Computed safety handles the gate. But humans still matter — here's how accountability works. + - **Dev is fully autonomous.** The confidence signal (≥ 0.50) is the only gate. Queue-based handoffs are eliminated from lower environments. *(Testing, Agentic.)* - **qa, prod, and dr require deliberate human attestation** — not rubber stamps, but policy-mandated acts of accountability via protected deployment approvals. The approver reviews the contract, the planned Terraform changes, and the accumulated evidence. *(Planned.)* - **QA attests to infrastructure readiness — the contract, the planned Terraform changes, and the accumulated evidence. QA does not review application code (that's upstream).** @@ -189,6 +205,8 @@ Version control is a **coordination tool, not an evidentiary fortress.** True co Here's what success looks like when the North Star is reached. +Here's what success looks like when the North Star is reached. + - **Velocity without sacrificing safety.** Speed is in the ergonomics (a simple contract, a one-line `uses:`); safety is in the gates the consumer cannot bypass. - **Security, observability, and compliance as platform defaults** — not per-team effort, not post-hoc remediation. - **Auditability as a byproduct, not a project.** Every production change is traceable to a human attestation and a tamper-evident evidence event. @@ -218,6 +236,8 @@ For deep dives — these slides cover details omitted from the main 10. ## A1 — Platform-Managed Environments +For deep dives — these slides cover details omitted from the main 10. + A consumer provides **no AWS account, no VPC, no subnet, no state backend, no runner key.** The platform owns the blast radius. A named environment is a platform-owned bundle of: diff --git a/docs/presentations/the-developer-experience-marp.md b/docs/presentations/the-developer-experience-marp.md index a23bdee..1423b96 100644 --- a/docs/presentations/the-developer-experience-marp.md +++ b/docs/presentations/the-developer-experience-marp.md @@ -45,9 +45,9 @@ section.title h3 { color: #F0F0F0; font-weight: 400; font-size: 22px; margin-top --- -# Where ACDL Sits in Your World +# Where Agentic Cloud Delivery (ACDL) Sits in Your World -Story beat: Here's who uses the platform and where the boundary is. +Here's who uses the platform and where the boundary is. ![w:1100](assets/png/developer-experience-01b-scope-boundary.png) @@ -60,24 +60,27 @@ section.title h3 { color: #F0F0F0; font-weight: 400; font-size: 22px; margin-top # The Contract — The Entire Consumer Surface -Story beat: Now let's look at what a consumer actually writes — it's tiny. +Now let's look at what a consumer actually writes — it's tiny. 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 +- **2. A contract** — a single YAML file: id, name, environment, infrastructure ```yaml -uses: acdl/pipelines/deploy.yaml@v1.6 -module: microservice +id: msvc +name: microservice environment: dev -inputs: - cpu: 256 - memory: 512 - desired_count: 2 - port: 8080 +infrastructure: + microservice: + version: "1.0.0" + inputs: + cpu: 256 + memory: 512 + desired_count: 2 + port: 8080 ``` - **3. A one-line CI definition** — a thin `uses:` wrapper pointing at a versioned platform workflow @@ -87,7 +90,7 @@ inputs: # The Developer Feedback Loop -Story beat: Once you push, here's what you see — in real time, in your own logs. +Once you push, here's what you see — in real time, in your own logs. Developers see **what the platform is doing**, in real time. Testing @@ -102,11 +105,11 @@ Developers see **what the platform is doing**, in real time. Story beat: You control when you absorb platform improvements — no surprise upgrades. +You control when you absorb platform improvements — no surprise upgrades. 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 +- **Floating MAJOR + MINOR tags** (e.g. `@v1.10`) — 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 @@ -116,7 +119,7 @@ Consumers control **when** they absorb platform improvements. Story beat: First impressions matter — the platform fails gracefully, not opaquely. +First impressions matter — the platform fails gracefully, not opaquely. First impressions of a platform are made **when it fails for the first time.** The platform fails gracefully. Testing @@ -135,7 +138,7 @@ The pipeline then **exits without attempting a deployment** — no partial state # Safe Promotion Path -Story beat: Promotion is a workflow choice, not a contract edit — and the bar rises automatically. +Promotion is a workflow choice, not a contract edit — and the bar rises automatically. The contract is environment-agnostic. The platform raises the bar automatically. @@ -150,12 +153,12 @@ The contract is environment-agnostic. The platform raises the bar automatically. ```yaml jobs: dev: - uses: acdl/.github/workflows/deploy.yml@v1.6 - with: { contract: .acdl/contract.yaml, environment: dev } + uses: acdl/.github/workflows/deploy.yml@v1.10 + with: { contract: .acdl/contract.yml, environment: dev } qa: needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.6 - with: { contract: .acdl/contract.yaml, environment: qa } + uses: acdl/.github/workflows/deploy.yml@v1.10 + with: { contract: .acdl/contract.yml, environment: qa } ``` @@ -166,11 +169,11 @@ jobs: ```yaml jobs: dev: - uses: acdl/.github/workflows/deploy.yml@v1.6 + uses: acdl/.github/workflows/deploy.yml@v1.10 with: { contract: .acdl/contract-dev.yaml } qa: needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.6 + uses: acdl/.github/workflows/deploy.yml@v1.10 with: { contract: .acdl/contract-qa.yaml } ``` @@ -189,14 +192,14 @@ td { font-size: 14px; } # Safe Decommission -Story beat: Tearing down is as deliberate as deploying — and just as gated. +Tearing down is as deliberate as deploying — and just as gated. Tearing down a stack is **as deliberate as deploying one.** Testing ```yaml -uses: acdl/.github/workflows/deploy.yml@v1.8 +uses: acdl/.github/workflows/deploy.yml@v1.10 with: - contract: .acdl/contract.yaml + contract: .acdl/contract.yml mode: decommission changeRequestId: "CHG0678912" ``` @@ -212,7 +215,7 @@ The per-stack encryption key enters a **grace window** (default 30 days) so encr # Self-Service Module Catalog -Story beat: You don't author infrastructure — you pick from pre-built, security-reviewed building blocks. +You don't author infrastructure — you pick from pre-built, security-reviewed building blocks. Developers pick from **pre-built, security-reviewed building blocks.** Testing @@ -229,7 +232,7 @@ Developers pick from **pre-built, security-reviewed building blocks.** Story beat: Here's what this delivers to the organization. +Here's what this delivers to the organization. - **Velocity without sacrificing safety.** Speed is in the ergonomics (a simple contract, a one-line `uses:`); safety is in the gates the consumer cannot bypass. - **Security, observability, and compliance as platform defaults** — not per-team effort, not post-hoc remediation. @@ -255,6 +258,7 @@ Developers pick from **pre-built, security-reviewed building blocks.** Testing +- **Live-AWS is a one-off spike per milestone** — `terraform init/validate/plan` verifies the adapter. No BAU cloud spend. +- **No running infrastructure between milestones** — state in S3 (one bucket), outbox in DynamoDB (one table), both query-only. +- **Cost drivers** are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents). + +**Verification Coverage** — 6 cloud capabilities are design-verified + locally emulated, deploy-unverified (IAM drift): +DynamoDB contracts table · Lambda contract-ingestor · ECS service live · CloudFront prod stack · uptime-kuma · OIDC role + +**The operating model:** local-first development, milestone-scoped verification, zero BAU cloud spend. \ No newline at end of file diff --git a/docs/presentations/the-developer-experience.html b/docs/presentations/the-developer-experience.html index 97770b1..59b85d9 100644 --- a/docs/presentations/the-developer-experience.html +++ b/docs/presentations/the-developer-experience.html @@ -107,10 +107,10 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
The Developer Experience
-

Where ACDL Sits in Your World

-

Story beat: Here's who uses the platform and where the boundary is.

+

Where Agentic Cloud Delivery (ACDL) Sits in Your World

+

Here's who uses the platform and where the boundary is.

  • Technical developer — owns app code + a contract + a thin CI definition
  • @@ -166,24 +166,27 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
    The Developer Experience

    The Contract — The Entire Consumer Surface

    -

    Story beat: Now let's look at what a consumer actually writes — it's tiny.

    +

    Now let's look at what a consumer actually writes — it's tiny.

    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
    • +
    • 2. A contract — a single YAML file: id, name, environment, infrastructure
    -
    uses: acdl/pipelines/deploy.yaml@v1.6
    -module: microservice
    +
    id: msvc
    +name: microservice
     environment: dev
    -inputs:
    -  cpu: 256
    -  memory: 512
    -  desired_count: 2
    -  port: 8080
    +infrastructure:
    +  microservice:
    +    version: "1.0.0"
    +    inputs:
    +      cpu: 256
    +      memory: 512
    +      desired_count: 2
    +      port: 8080
     
    • 3. A one-line CI definition — a thin uses: wrapper pointing at a versioned platform workflow
    • @@ -237,10 +240,10 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
      The Developer Experience

      The Developer Feedback Loop

      -

      Story beat: Once you push, here's what you see — in real time, in your own logs.

      +

      Once you push, here's what you see — in real time, in your own logs.

      Developers see what the platform is doing, in real time. Testing

      • Streamed output by default — the infrastructure plan, policy-check results, and each check record flow to stdout
      • @@ -298,13 +301,13 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
        The Developer Experience

        Versioned, Predictable Releases

        -

        Story beat: You control when you absorb platform improvements — no surprise upgrades.

        +

        You control when you absorb platform improvements — no surprise upgrades.

        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
        • +
        • Floating MAJOR + MINOR tags (e.g. @v1.10) — 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
        • @@ -358,10 +361,10 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
          The Developer Experience

          Friendly Onboarding

          -

          Story beat: First impressions matter — the platform fails gracefully, not opaquely.

          +

          First impressions matter — the platform fails gracefully, not opaquely.

          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:

            @@ -420,10 +423,10 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
            The Developer Experience

            Safe Promotion Path

            -

            Story beat: Promotion is a workflow choice, not a contract edit — and the bar rises automatically.

            +

            Promotion is a workflow choice, not a contract edit — and the bar rises automatically.

            The contract is environment-agnostic. The platform raises the bar automatically.

            @@ -432,23 +435,23 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }

            Approach A — One contract, one job per environment. Environment passed by each job.

            jobs:
               dev:
            -    uses: acdl/.github/workflows/deploy.yml@v1.6
            -    with: { contract: .acdl/contract.yaml, environment: dev }
            +    uses: acdl/.github/workflows/deploy.yml@v1.10
            +    with: { contract: .acdl/contract.yml, environment: dev }
               qa:
                 needs: dev
            -    uses: acdl/.github/workflows/deploy.yml@v1.6
            -    with: { contract: .acdl/contract.yaml, environment: qa }
            +    uses: acdl/.github/workflows/deploy.yml@v1.10
            +    with: { contract: .acdl/contract.yml, environment: qa }
             
            @@ -502,14 +505,14 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
            The Developer Experience

            Safe Decommission

            -

            Story beat: Tearing down is as deliberate as deploying — and just as gated.

            +

            Tearing down is as deliberate as deploying — and just as gated.

            Tearing down a stack is as deliberate as deploying one. Testing

            -
            uses: acdl/.github/workflows/deploy.yml@v1.8
            +
            uses: acdl/.github/workflows/deploy.yml@v1.10
             with:
            -  contract: .acdl/contract.yaml
            +  contract: .acdl/contract.yml
               mode: decommission
               changeRequestId: "CHG0678912"
             
            @@ -567,10 +570,10 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
            The Developer Experience

            Self-Service Module Catalog

            -

            Story beat: You don't author infrastructure — you pick from pre-built, security-reviewed building blocks.

            +

            You don't author infrastructure — you pick from pre-built, security-reviewed building blocks.

            Developers pick from pre-built, security-reviewed building blocks. Testing

            • Primitives — single-purpose resources (S3, VPC, ECS, IAM, load balancer, container registry, CloudFront, WAF, RDS), each with documented inputs/outputs, usage, compliance extension points, and versioning
            • @@ -631,7 +634,7 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
              The Developer Experience

              The Desired Outcomes

              -

              Story beat: Here's what this delivers to the organization.

              +

              Here's what this delivers to the organization.

              • Velocity without sacrificing safety. Speed is in the ergonomics (a simple contract, a one-line uses:); safety is in the gates the consumer cannot bypass.
              • Security, observability, and compliance as platform defaults — not per-team effort, not post-hoc remediation.
              • @@ -701,6 +704,7 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
              • Local Reproducibility (detail)
              • The Road to the North Star (phased roadmap)
              • Glossary
              • +
              • Operating Model & Cost
              • Internal
                @@ -750,7 +754,7 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
                The Developer Experience

                A1 — The Citizen Developer Experience

                A non-technical consumer ships a production deployment by declaring intent — without authoring a workflow, a configuration file, or an infrastructure module.

                @@ -814,7 +818,7 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
                The Developer Experience

                A2 — No Platform Code, No Cloning

                Consumers uses: a versioned central workflow. The platform fetches itself at run time. The consumer never touches platform internals.

                @@ -873,7 +877,7 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
                The Developer Experience

                A3 — Local Reproducibility

                The entire CI pipeline runs from the shell, not just in CI. Testing

                @@ -985,7 +989,7 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } .agentic { background: #EDE9FE; color: #4C1D95; } -;" data-marpit-pagination-total="16"> +;" data-marpit-pagination-total="17">
                The Developer Experience

                A5 — Glossary

            Approach B — Environment-specific contracts. When inputs differ per environment.

            jobs:
               dev:
            -    uses: acdl/.github/workflows/deploy.yml@v1.6
            +    uses: acdl/.github/workflows/deploy.yml@v1.10
                 with: { contract: .acdl/contract-dev.yaml }
               qa:
                 needs: dev
            -    uses: acdl/.github/workflows/deploy.yml@v1.6
            +    uses: acdl/.github/workflows/deploy.yml@v1.10
                 with: { contract: .acdl/contract-qa.yaml }
             
            @@ -1028,10 +1032,75 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; } + + + +
            NFR Non-Functional Requirement — encryption, tagging, observability standards
            IRIntermediate Representation — the engine-agnostic stack definition between contract and Terraform
            Internal
            +
            +
            The Developer Experience
            +

            A6 — Operating Model & Cost

            +

            ACDL runs at zero cloud cost for day-to-day development.

            +
              +
            • Local emulators are the primary tier — the full pipeline runs in-process, no AWS credentials, no Checkov, no DynamoDB. Testing
            • +
            • Live-AWS is a one-off spike per milestoneterraform init/validate/plan verifies the adapter. No BAU cloud spend.
            • +
            • No running infrastructure between milestones — state in S3 (one bucket), outbox in DynamoDB (one table), both query-only.
            • +
            • Cost drivers are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents).
            • +
            +

            Verification Coverage — 6 cloud capabilities are design-verified + locally emulated, deploy-unverified (IAM drift):
            +DynamoDB contracts table · Lambda contract-ingestor · ECS service live · CloudFront prod stack · uptime-kuma · OIDC role

            +

            The operating model: local-first development, milestone-scoped verification, zero BAU cloud spend.

            +
            Internal
            +
            \ No newline at end of file diff --git a/docs/presentations/the-developer-experience.md b/docs/presentations/the-developer-experience.md index 5c75af6..1c4f214 100644 --- a/docs/presentations/the-developer-experience.md +++ b/docs/presentations/the-developer-experience.md @@ -17,21 +17,36 @@ The consumer surface is intentionally tiny. The platform's surface is large and --- -## Slide 2 — Where ACDL Sits in Your World +## Slide 2 — Where Agentic Cloud Delivery (ACDL) Sits in Your World -Story beat: Here's who uses the platform and where the boundary is. +Here's who uses the platform and where the boundary is. The platform serves **two kinds of consumer** through two coordinated paths — but both converge on the **same contract, the same policy envelope, and the same evidence stream.** +**Agentic Cloud Delivery (ACDL)** sits between upstream (anything that produces a contract) and downstream (AWS resources running + the consumer's image pipeline). + ```mermaid -flowchart TD - U1["Anything upstream
            (IDE / agentic SDLC / vibe coding)"] --> T["Technical developer
            writes app + contract"] - U1 --> C["Citizen developer
            declares intent"] - T --> K["Contract YAML"] - C --> AI["An AI agent maps intent
            to a reviewed-skill contract"] - AI --> K - K --> ACDL["ACDL — infrastructure only
            resolve → check → plan → policy
            → confidence → evidence → apply"] - ACDL --> AWS["AWS resources provisioned + governed"] +flowchart LR + subgraph UP ["Upstream — anything"] + direction TB + A["Technical dev\n(app code + contract)"] + B["Citizen dev\n(intent → AI agent\n→ contract)"] + end + subgraph ACDL ["ACDL — infrastructure only"] + C["Same contract\nSame pipeline\nSame safety"] + D["Provision\nAWS resources"] + E["Evidence\nhash-chained"] + end + subgraph DOWN ["Downstream"] + F["AWS resources\nrunning"] + G["Consumer pipeline\ndeploys image"] + end + A --> C + B --> C + C --> D + C --> E + D --> F + F --> G ``` - **Technical developer** — owns app code + a contract + a thin CI definition. Uses the full module catalog and inputs. @@ -47,23 +62,26 @@ The platform is **opinionated in what it accepts, regardless of who is declaring ## Slide 3 — The Contract — The Entire Consumer Surface -Story beat: Now let's look at what a consumer actually writes — it's tiny. +Now let's look at what a consumer actually writes — it's tiny. 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 +2. **A contract** — a single YAML file: id, name, environment, infrastructure 3. **A one-line CI definition** — a thin `uses:` wrapper pointing at a versioned platform workflow ```yaml -uses: acdl/pipelines/deploy.yaml@v1.6 -module: microservice +id: msvc +name: microservice environment: dev -inputs: - cpu: 256 - memory: 512 - desired_count: 2 - port: 8080 +infrastructure: + microservice: + version: "1.0.0" + inputs: + cpu: 256 + memory: 512 + desired_count: 2 + port: 8080 ``` The developer does **not**: @@ -80,7 +98,7 @@ The developer does **not**: ## Slide 4 — The Developer Feedback Loop -Story beat: Once you push, here's what you see — in real time, in your own logs. +Once you push, here's what you see — in real time, in your own logs. Developers see **what the platform is doing**, in real time. Testing @@ -96,11 +114,11 @@ Developers see **what the platform is doing**, in real time. Testing -- **Floating MAJOR + MINOR tags** (e.g. `@v1.6`) — a consumer automatically receives patch updates within the line. +- **Floating MAJOR + MINOR tags** (e.g. `@v1.10`) — 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 a consumer has. @@ -112,7 +130,7 @@ Consumers control **when** they absorb platform improvements. Testing @@ -133,7 +151,7 @@ The pipeline then **exits without attempting a deployment** — no partial state ## Slide 7 — Safe Promotion Path -Story beat: Promotion is a workflow choice, not a contract edit — and the bar rises automatically. +Promotion is a workflow choice, not a contract edit — and the bar rises automatically. The contract is environment-agnostic. The platform raises the bar automatically. @@ -149,12 +167,12 @@ flowchart LR ```yaml jobs: dev: - uses: acdl/.github/workflows/deploy.yml@v1.6 - with: { contract: .acdl/contract.yaml, environment: dev } + uses: acdl/.github/workflows/deploy.yml@v1.10 + with: { contract: .acdl/contract.yml, environment: dev } qa: needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.6 - with: { contract: .acdl/contract.yaml, environment: qa } + uses: acdl/.github/workflows/deploy.yml@v1.10 + with: { contract: .acdl/contract.yml, environment: qa } ``` **Approach B — Environment-specific contracts.** When inputs genuinely differ per environment, each job points at its own contract file. The pipeline, policy, and confidence model stay identical. @@ -162,11 +180,11 @@ jobs: ```yaml jobs: dev: - uses: acdl/.github/workflows/deploy.yml@v1.6 + uses: acdl/.github/workflows/deploy.yml@v1.10 with: { contract: .acdl/contract-dev.yaml } qa: needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.6 + uses: acdl/.github/workflows/deploy.yml@v1.10 with: { contract: .acdl/contract-qa.yaml } ``` @@ -189,14 +207,14 @@ Whichever approach a team picks, the platform applies the same rising bar: ## Slide 8 — Safe Decommission -Story beat: Tearing down is as deliberate as deploying — and just as gated. +Tearing down is as deliberate as deploying — and just as gated. Tearing down a stack is **as deliberate as deploying one.** Testing ```yaml -uses: acdl/.github/workflows/deploy.yml@v1.8 +uses: acdl/.github/workflows/deploy.yml@v1.10 with: - contract: .acdl/contract.yaml + contract: .acdl/contract.yml mode: decommission changeRequestId: "CHG0678912" ``` @@ -214,7 +232,7 @@ The per-stack encryption key enters a **grace window** (default 30 days) so encr ## Slide 9 — Self-Service Module Catalog -Story beat: You don't author infrastructure — you pick from pre-built, security-reviewed building blocks. +You don't author infrastructure — you pick from pre-built, security-reviewed building blocks. Developers pick from **pre-built, security-reviewed building blocks.** Testing @@ -230,7 +248,7 @@ Developers pick from **pre-built, security-reviewed building blocks.**