From 4b8577df2efc3b03e427dc2269f9b875f919912e Mon Sep 17 00:00:00 2001 From: Jon Chery Date: Wed, 29 Jul 2026 14:43:29 +0000 Subject: [PATCH] =?UTF-8?q?docs(P71):=20polish=20leadership=20decks=20?= =?UTF-8?q?=E2=80=94=20action=20headlines,=20trim,=206=20new=20diagrams=20?= =?UTF-8?q?(v1.13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Polish both leadership decks (how-the-platform-works + the-developer-experience) across all 4 pipeline layers (source md, marp, html, talking points). Story-arc restructure (per storytelling best practices): - Intro ~10% / Body ~80% / Conclusion ~10%; 3-5 body points per deck - One idea per slide; action headlines replace category names - Before/after 2-slide sequence (problem -> north star) on platform deck - Main 10 slides kept; detail pushed to expanded appendix (8 + 7) Word reduction + natural flow: - Remove all transition lines (flow carried by headlines) - Bullets <= 12 words, 3-4 per main slide (was 5-6) - Cut parentheticals, sub-clauses, redundant restatements Design + visuals: - Larger fonts: body 22 -> 26px, h1 34 -> 40px, h2 26 -> 32px, blockquote 20 -> 24px - 6 new mermaid diagrams -> PNGs: - platform-works-02-frictions (2x2 quadrant) - platform-works-03-north-star (before/after) - platform-works-07-zero-trust (OIDC + ABAC flow) - developer-experience-05-catalog (primitives -> modules) - developer-experience-07-decommission (6-node gate flow) - developer-experience-08-semver (floating/pinned/major timeline) - At most 1 diagram per main slide; no diagrams on title/conclusion - High contrast preserved, no animations, maturity badges intact Verify: - Marp renders both decks clean (HTML re-rendered, committed) - Talking-points sections == Marp slide count per deck - No stale "deploy-unverified" claims (only closed-status disclosure) - 522 tests pass (no code touched; only docs/presentations/ files changed) - 22/22 Verified framing preserved verbatim from v1.12 ---ci--- project: acdl phase: 71 milestone: v1.13 status: complete ---/ci--- --- .../mmd/developer-experience-05-catalog.mmd | 25 + .../developer-experience-07-decommission.mmd | 14 + .../mmd/developer-experience-08-semver.mmd | 28 + .../mmd/platform-works-02-frictions.mmd | 19 + .../mmd/platform-works-03-north-star.mmd | 23 + .../mmd/platform-works-07-zero-trust.mmd | 12 + .../png/developer-experience-05-catalog.png | Bin 0 -> 14615 bytes .../developer-experience-07-decommission.png | Bin 0 -> 19246 bytes .../png/developer-experience-08-semver.png | Bin 0 -> 39701 bytes .../png/platform-works-02-frictions.png | Bin 0 -> 20020 bytes .../png/platform-works-03-north-star.png | Bin 0 -> 57410 bytes .../png/platform-works-07-zero-trust.png | Bin 0 -> 24121 bytes .../how-the-platform-works-marp.md | 243 ++-- .../how-the-platform-works-talking-points.md | 248 ++-- .../presentations/how-the-platform-works.html | 824 ++++++-------- docs/presentations/how-the-platform-works.md | 299 +++-- .../the-developer-experience-marp.md | 246 ++-- ...the-developer-experience-talking-points.md | 234 ++-- .../the-developer-experience.html | 1001 ++++++++--------- .../presentations/the-developer-experience.md | 296 ++--- 20 files changed, 1721 insertions(+), 1791 deletions(-) create mode 100644 docs/presentations/assets/mmd/developer-experience-05-catalog.mmd create mode 100644 docs/presentations/assets/mmd/developer-experience-07-decommission.mmd create mode 100644 docs/presentations/assets/mmd/developer-experience-08-semver.mmd create mode 100644 docs/presentations/assets/mmd/platform-works-02-frictions.mmd create mode 100644 docs/presentations/assets/mmd/platform-works-03-north-star.mmd create mode 100644 docs/presentations/assets/mmd/platform-works-07-zero-trust.mmd create mode 100644 docs/presentations/assets/png/developer-experience-05-catalog.png create mode 100644 docs/presentations/assets/png/developer-experience-07-decommission.png create mode 100644 docs/presentations/assets/png/developer-experience-08-semver.png create mode 100644 docs/presentations/assets/png/platform-works-02-frictions.png create mode 100644 docs/presentations/assets/png/platform-works-03-north-star.png create mode 100644 docs/presentations/assets/png/platform-works-07-zero-trust.png diff --git a/docs/presentations/assets/mmd/developer-experience-05-catalog.mmd b/docs/presentations/assets/mmd/developer-experience-05-catalog.mmd new file mode 100644 index 0000000..64b4cca --- /dev/null +++ b/docs/presentations/assets/mmd/developer-experience-05-catalog.mmd @@ -0,0 +1,25 @@ +%%{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 PRIM ["Primitives"] + direction TB + P1["S3"] + P2["VPC"] + P3["ECS"] + P4["IAM"] + P5["ALB"] + P6["ECR"] + P7["CloudFront"] + P8["WAF"] + P9["RDS"] + end + subgraph MOD ["Modules — composed patterns"] + direction TB + M1["Static site\nCDN + WAF + S3"] + M2["Microservice\nVPC + ECS + ALB + ECR"] + end + PRIM --> MOD +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class P1,P2,P3,P4,P5,P6,P7,P8,P9 supporting +class M1,M2 accent \ No newline at end of file diff --git a/docs/presentations/assets/mmd/developer-experience-07-decommission.mmd b/docs/presentations/assets/mmd/developer-experience-07-decommission.mmd new file mode 100644 index 0000000..8fad265 --- /dev/null +++ b/docs/presentations/assets/mmd/developer-experience-07-decommission.mmd @@ -0,0 +1,14 @@ +%%{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["Validate CR\n(CMDB)"] + B["Disable\nprevent_destroy"] + C["SRE\napprove"] + D["Zero counts\n+ destroy"] + E["SRE\napprove"] + F["Key enters\ngrace window"] + A --> B --> C --> D --> 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 A,B,D,F supporting +class C,E accent \ No newline at end of file diff --git a/docs/presentations/assets/mmd/developer-experience-08-semver.mmd b/docs/presentations/assets/mmd/developer-experience-08-semver.mmd new file mode 100644 index 0000000..78c55f2 --- /dev/null +++ b/docs/presentations/assets/mmd/developer-experience-08-semver.mmd @@ -0,0 +1,28 @@ +%%{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 FLOAT ["@v1.12 — floating MAJOR+MINOR"] + direction LR + F1["v1.12.0"] + F2["v1.12.1"] + F3["v1.12.2"] + F1 --> F2 --> F3 + end + subgraph PIN ["@v1.12.2 — pinned exact"] + direction LR + P1["v1.12.2"] + P2["v1.12.2"] + P3["v1.12.2"] + P1 --> P2 --> P3 + end + subgraph MAJ ["@v1 — float MAJOR only"] + direction LR + M1["v1.12.0"] + M2["v1.13.0"] + M3["v1.14.0"] + M1 --> M2 --> M3 + end +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class F1,F2,F3,M1,M2,M3 accent +class P1,P2,P3 supporting \ No newline at end of file diff --git a/docs/presentations/assets/mmd/platform-works-02-frictions.mmd b/docs/presentations/assets/mmd/platform-works-02-frictions.mmd new file mode 100644 index 0000000..e6fd2e2 --- /dev/null +++ b/docs/presentations/assets/mmd/platform-works-02-frictions.mmd @@ -0,0 +1,19 @@ +%%{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 ROW1 [" "] + direction LR + A["Cognitive load\nauthoring infra correctly"] + B["Operational work\nmerged → running"] + end + subgraph ROW2 [" "] + direction LR + C["Red tape\ntickets, approvals, handoffs"] + D["Scalability\nthroughput without headcount"] + end + A ~~~ B + C ~~~ D + A ~~~ C + B ~~~ D +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +class A,B,C,D accent \ No newline at end of file diff --git a/docs/presentations/assets/mmd/platform-works-03-north-star.mmd b/docs/presentations/assets/mmd/platform-works-03-north-star.mmd new file mode 100644 index 0000000..1d060f7 --- /dev/null +++ b/docs/presentations/assets/mmd/platform-works-03-north-star.mmd @@ -0,0 +1,23 @@ +%%{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 TODAY ["Today"] + direction TB + A["Merged change"] + B["Waits in queue"] + C["Ticket + approvals"] + D["Manual promotion"] + A --> B --> C --> D + end + subgraph ACDL ["With ACDL"] + direction TB + E["Declare intent\n(one YAML contract)"] + F["Platform delivers\nsafely, autonomously"] + G["Traceable to\nhuman attestation"] + E --> F --> G + end + TODAY -.before.-> ACDL +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class A,B,C,D supporting +class E,F,G accent \ No newline at end of file diff --git a/docs/presentations/assets/mmd/platform-works-07-zero-trust.mmd b/docs/presentations/assets/mmd/platform-works-07-zero-trust.mmd new file mode 100644 index 0000000..e454873 --- /dev/null +++ b/docs/presentations/assets/mmd/platform-works-07-zero-trust.mmd @@ -0,0 +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\n(no credentials)"] + B["OIDC federation\nshort-lived token"] + C["ABAC session policy\nrepo identity + tags"] + D["Tagged resources\nonly"] + A --> B --> C --> D +classDef accent fill:#1B1B1B,color:#fff,stroke:#D6002A,stroke-width:2px +classDef supporting fill:#fff,color:#1B1B1B,stroke:#D6002A,stroke-width:1px +class A,D supporting +class B,C accent \ No newline at end of file diff --git a/docs/presentations/assets/png/developer-experience-05-catalog.png b/docs/presentations/assets/png/developer-experience-05-catalog.png new file mode 100644 index 0000000000000000000000000000000000000000..da1ab43ef696c5a822dd7f1788ad1c58ad9c440f GIT binary patch literal 14615 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 literal 0 HcmV?d00001 diff --git a/docs/presentations/assets/png/developer-experience-07-decommission.png b/docs/presentations/assets/png/developer-experience-07-decommission.png new file mode 100644 index 0000000000000000000000000000000000000000..1687f7addb4fddceb04eb8cc87a74691fb1244d0 GIT binary patch literal 19246 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 literal 0 HcmV?d00001 diff --git a/docs/presentations/assets/png/developer-experience-08-semver.png b/docs/presentations/assets/png/developer-experience-08-semver.png new file mode 100644 index 0000000000000000000000000000000000000000..238a6bea1976475f860d20421e33d09009195143 GIT binary patch literal 39701 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 Jt|~TR{|yj$<7)r_ literal 0 HcmV?d00001 diff --git a/docs/presentations/assets/png/platform-works-02-frictions.png b/docs/presentations/assets/png/platform-works-02-frictions.png new file mode 100644 index 0000000000000000000000000000000000000000..fef8934a250ca08bc4fbcffee604b47ccb2249f6 GIT binary patch literal 20020 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 literal 0 HcmV?d00001 diff --git a/docs/presentations/assets/png/platform-works-03-north-star.png b/docs/presentations/assets/png/platform-works-03-north-star.png new file mode 100644 index 0000000000000000000000000000000000000000..f44e4165b73bc142ce4f2538631ef6fab90f398c GIT binary patch literal 57410 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 Ua7RXLA-Yc0E1H){N~Qt-28hq6761SM literal 0 HcmV?d00001 diff --git a/docs/presentations/assets/png/platform-works-07-zero-trust.png b/docs/presentations/assets/png/platform-works-07-zero-trust.png new file mode 100644 index 0000000000000000000000000000000000000000..d670e6901be3522c672c035fbbe6fff28f4647aa GIT binary patch literal 24121 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 XBro`HR%A^k@CgM>&seu!8yWpy8>>*4 literal 0 HcmV?d00001 diff --git a/docs/presentations/how-the-platform-works-marp.md b/docs/presentations/how-the-platform-works-marp.md index 726e666..c122f4b 100644 --- a/docs/presentations/how-the-platform-works-marp.md +++ b/docs/presentations/how-the-platform-works-marp.md @@ -8,21 +8,20 @@ footer: "Internal" style: | section { font-family: "Akkurat Pro", "Helvetica Neue", "Arial", sans-serif; - font-size: 22px; + font-size: 26px; color: #1B1B1B; } - h1 { color: #D6002A; font-size: 34px; margin-bottom: 0.3em; } - h2 { color: #D6002A; font-size: 26px; margin-bottom: 0.2em; } + h1 { color: #D6002A; font-size: 40px; margin-bottom: 0.3em; } + h2 { color: #D6002A; font-size: 32px; 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%; } + table { font-size: 22px; width: 100%; } th { background: #F0F0F0; } - blockquote { border-left: 4px solid #D6002A; color: #2E2E2E; font-size: 20px; } + blockquote { border-left: 4px solid #D6002A; color: #2E2E2E; font-size: 24px; } img { display: block; margin: 0 auto; max-height: 300px; } - em.story { color: #6B7280; font-size: 16px; font-style: italic; } .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; - font-size: 14px; font-weight: 600; + font-size: 16px; font-weight: 600; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } @@ -43,91 +42,73 @@ section.title h3 { color: #F0F0F0; font-weight: 400; font-size: 22px; margin-top --- -# The Problem & The North Star +# Four frictions slow every team -Here's the problem we're solving and where we're going. +![w:1100](assets/png/platform-works-02-frictions.png) -Four frictions slow every team: - -- **Cognitive load** — authoring infrastructure correctly; the long tail of services inconsistent in security and observability -- **Operational work** — promoting a change from "merged" to "running in production." Manual work that **scales with the system, not the change** -- **Red tape** — tickets, approvals, and handoffs that scale with the organization. A merged change waits in a queue -- **Scalability without increasing headcount** — throughput scales without linearly scaling platform engineers - -> Consumers **declare intent**; the platform delivers **safe production deployment** — automatically, safely, with a complete audit trail. - -- A merged change progresses **without a platform engineer joining a thread or approving a ticket** -- A **non-technical consumer** ships by declaring intent — no workflow, no config file, no infrastructure module -- Every production change is **traceable to a human attestation and an immutable evidence stream** +- **Cognitive load** — services inconsistent in security and observability +- **Operational work** — manual promotion scaling with the system +- **Red tape** — tickets and handoffs scaling with the organization +- **Scalability** — throughput without scaling platform engineers --- -# Where ACDL Sits in Your World +# Declare intent; the platform delivers safe production -Now that we know the problem, here's where ACDL fits — and where it doesn't. +![w:1100](assets/png/platform-works-03-north-star.png) + +- A merged change progresses **without a ticket or thread** +- A **non-technical consumer** ships by declaring intent +- Every production change is **traceable to a human attestation** + +--- + +# ACDL owns infrastructure, not your app ![w:1100](assets/png/platform-works-03-scope-boundary.png) -- **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 -- **Not a permissive delivery highway** — no escape hatches to bypass the confidence framework +- **Upstream is anything** — IDE, agentic SDLC, or vibe coding +- **ACDL is infrastructure only** — provisions and governs AWS resources +- **Not a general-purpose AI** — autonomy is narrow, policy-bounded +- **Not a permissive highway** — no escape hatches --- -# The Contract-Driven Model - -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. +# One YAML file. The platform owns everything else. ![w:850](assets/png/platform-works-01-contract-driven.png) -- **Which module** — a catalog of pre-built, security-reviewed building blocks -- **Which environment** — the platform raises the safety bar automatically as sensitivity rises -- **Which inputs** — infrastructure values that vary per deployment (cpu, memory, port, desired_count) -- The consumer provides **no AWS account, no VPC, no state backend** — the platform owns the blast radius +- **Module** — pre-built, security-reviewed building blocks +- **Environment** — `dev`, `qa`, `prod`, `dr`; bar rises with sensitivity +- **Inputs** — cpu, memory, port, desired_count +- Consumer provides **no AWS account, no VPC, no state backend** --- -# The End-to-End Flow - -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. +# Same stages, same checks, every deployment ![w:1100](assets/png/platform-works-02-end-to-end-flow.png) -- **Security and policy checks run *before* any infrastructure is created** -- **Every stage produces a record** that feeds the confidence signal and the evidence stream — there is no "unchecked" path +- **Security and policy checks run *before* any infra is created** +- **Every stage produces a record** — no "unchecked" path --- -# Zero-Trust by Default +# No long-lived credentials. Blast radius contained. -Before any infrastructure is created, here's how access is scoped. +![w:1100](assets/png/platform-works-07-zero-trust.png) -Consumer repositories hold **no long-lived cloud credentials.** Ever. - -- **Authentication — OIDC federation.** Each job mints a short-lived token; no credential is stored in the consumer repo or in a runner secret. Testing (GitHub Actions) Planned: all runners -- **Authorization — attribute-based (ABAC), not role-based.** Two attribute classes scope every action: - - **Repository identity** — the role's trust policy binds to the exact consumer repo + branch - - **Resource tags** — every resource is tagged `acdl:owner` + `acdl:contract`; the session policy grants access **only to matching tags** - -**The effect:** a consumer can only touch the resources it created. Blast radius is contained. One consumer can never affect another. +- **OIDC federation** — short-lived token per job, no stored credential Testing (GitHub Actions) Planned: all runners +- **ABAC, not role-based** — repo identity + resource tags scope every action +- **A consumer can only touch its own tagged resources.** One consumer can never affect another. --- -# Safety is Computed, Not Assumed +# Safety is a measurable signal, not a black box -Now let's look at how the platform decides whether a deployment is safe. +![w:900](assets/png/platform-works-04-confidence-signal.png) -Every delivery action produces a **measurable, explainable confidence signal** — a weighted sum of observable facts, not a black box. Agentic - -![w:1100](assets/png/platform-works-04-confidence-signal.png) - -- **Six weighted inputs** — manually tuned, auditable. If a consumer asks "why 0.62?", the platform answers with a per-input breakdown -- **Per-environment thresholds** that rise with sensitivity: +- **Six weighted inputs** — manually tuned, auditable per-input breakdown Agentic | Environment | Threshold | Attester | |---|---|---| @@ -135,82 +116,32 @@ Every delivery action produces a **measurable, explainable confidence signal** | qa | ≥ 0.75 | QA Planned | | prod | ≥ 0.90 | SRE Planned | -- **A single critical finding hard-blocks** — critical findings are not averaged away +- **A single critical finding hard-blocks** — not averaged away --- -# Security by Construction - -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 - -- **Policy checks** (Checkov, Wiz, Kyverno) — secrets in plaintext, public ingress, IAM wildcards, **required tagging standards** — all run *before* infra is created -- **Encryption on every resource** — at-rest encryption on by default; per-stack customer-managed keys with 90-day rotation, **no shared keys across stacks** -- **Deletion protection on by default** — `prevent_destroy` on unless explicitly disabled via a documented flag -- **Safe decommission** — a 2-step pipeline with **two SRE attestation gates** and a **change-request validated against the CMDB** - ---- - -# Accountability & Audit - -Computed safety handles the gate. But humans still matter — here's how accountability works. +# Every change traceable to a human attestation ![w:1100](assets/png/platform-works-05-attestation-flow.png) -- **Dev is fully autonomous.** The confidence signal (≥ 0.50) is the only gate. Testing Agentic -- **qa, prod, dr require human attestation** — the approver reviews the contract, the planned Terraform changes, and the accumulated evidence Planned -- **QA attests to infrastructure readiness, not application code** — the contract, the plan, and the evidence. Application code review is upstream -- **Separation of duties** — the QA approver **cannot** be the prod approver. The platform **blocks on a match.** Planned -- **Every deployment writes a hash-chained evidence event** — tampering breaks the chain. **RPO = 0** Testing +- **Dev is fully autonomous** — confidence signal is the only gate Testing Agentic +- **qa, prod, dr require human attestation** — contract + plan + evidence Planned +- **Separation of duties** — QA approver ≠ prod approver; platform **blocks on a match** Planned +- **Hash-chained evidence event** — tampering breaks the chain. **RPO = 0** Testing --- -# Testing vs. Planned +# The vision realized -Let's be honest about what works today and what's on the roadmap. - - - -**22/22 Verified** via lifecycle pipeline + regression gate: - -- Contract-driven deploys · Module catalog · Zero-trust OIDC + ABAC -- Security + policy checks before infra creation · Confidence signal gating -- Hash-chained evidence outbox (RPO = 0) · Encryption by default + per-stack CMKs -- Deletion protection + safe decommission · Uptime monitoring -- Platform-managed environments · Engine-agnostic core + VCS-agnostic ingestion - -**9 planned** (production path): - -- HITL wiring for qa/prod/dr · All-runner OIDC · Full regulatory ledger -- Compliance milestone (GDPR, SOX, SOC2, DORA) · Environment self-service -- Dynamic module creation Agentic · Pattern recognition Agentic -- Additional engine adapters · Deeper observability bootstrap - -**22/22 Verified** — the v1.11 lifecycle pipeline ran apply→modify→destroy against live AWS, then tore down to zero-cost (D-096). The v1.10 "6 deploy-unverified (IAM drift)" status is closed. - -*Full inventory + phased roadmap in the appendix.* - ---- - - - - -# The Vision Realized - -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. -- **Blast radius contained by design.** Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources. -- **Infrastructure as a utility, not a craft.** Teams consume infrastructure, they don't maintain it. -- **A path to the citizen developer.** The same safety envelope that serves a senior engineer will serve a non-technical consumer. Agentic +- **Velocity without sacrificing safety** — speed in ergonomics, safety in unbypassable gates +- **Security, observability, compliance as platform defaults** — not per-team effort +- **Auditability as a byproduct, not a project** — every change traceable to a human attestation +- **Blast radius contained by design** — OIDC + ABAC, only your own tagged resources +- **Infrastructure as a utility, not a craft** — consume, don't maintain +- **A path to the citizen developer** — same envelope, senior engineer or non-technical Agentic --- @@ -219,17 +150,16 @@ section { font-size: 20px; } # Appendix -For deep dives — these slides cover details omitted from the main 10. - **Contents:** 1. Platform-Managed Environments (detail) 2. Observability Built In (detail) -3. The Road to the North Star (phased roadmap) -4. Testing vs. Planned (full inventory) -5. Glossary -6. Operating Model & Cost -7. Verified by Construction +3. Security by Construction (the full defaults inventory) +4. The Road to the North Star (phased roadmap) +5. Testing vs. Planned (full inventory) +6. Glossary +7. Operating Model & Cost (real AWS spend + pre-mortem) +8. Verified by Construction (the v1.11 architecture) --- @@ -244,7 +174,7 @@ A named environment is a platform-owned bundle of: - A state backend (S3 + DynamoDB for state + locking) - An IAM role surfaced via ABAC, scoped to the consumer's identity and resource tags -The consumer selects an environment **by name** in their contract. The platform resolves the name to the underlying resources at run time. **The consumer never sees raw credentials.** +The consumer selects an environment **by name** in their contract. The platform resolves it at run time. **The consumer never sees raw credentials.** **Friendly onboarding:** the first run detects no environment and emits a guided prompt (not an opaque failure). Testing Self-service: planned @@ -254,18 +184,29 @@ The consumer selects an environment **by name** in their contract. The platform Monitoring is **a platform default, not a per-team project.** Testing -- **Uptime monitoring deployed automatically with every stack** — a dedicated monitoring instance is provisioned after any module deploy, in a separate state, with a feature flag to disable +- **Uptime monitoring deployed automatically with every stack** — separate state, feature flag to disable - **Monitored endpoints passed from the deployment's own outputs** — no manual endpoint registration - **Alert channels:** Microsoft Teams webhook, email, SMS, and GitHub issues -- **The uptime URL is published to the developer** via a PR comment — they don't hunt for it -- **Roadmap:** deeper observability bootstrap (dashboards, runbooks, on-call bindings) as first-class contract fields Planned +- **The uptime URL is published to the developer** via a PR comment +- **Roadmap:** deeper observability bootstrap (dashboards, runbooks, on-call bindings) Planned + +--- + +# A3 — Security by Construction + +Security defaults that **do not require a team to opt in.** Checks run on **every** deployment, normalized to a single schema. Testing + +- **Policy checks** (Checkov, Wiz, Kyverno) — secrets, public ingress, IAM wildcards, **required tagging** — all run *before* infra is created +- **Encryption on every resource** — at-rest on by default; per-stack CMKs with 90-day rotation, **no shared keys across stacks** +- **Deletion protection on by default** — `prevent_destroy` on unless explicitly disabled via a documented flag +- **Safe decommission** — a 2-step pipeline with **two SRE attestation gates** and a **change-request validated against the CMDB** --- -# A3 — The Road to the North Star +# A4 — The Road to the North Star *Proposed phasing — not formally planned.* @@ -276,11 +217,11 @@ Monitoring is **a platform default, not a per-team project.** Testing -- **Live-AWS verification is milestone-scoped, then torn down.** The v1.11 lifecycle pipeline ran apply→modify→destroy for every module, then tore down to zero-cost (D-096). The pipeline now **defaults to plan-only** on every PR; `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12). +- **S3 dominates** (98.8%, terraform state bucket) — no compute ran because v1.0→v1.10 was plan-only for IAM-gated capabilities +- **Local emulators are the primary tier** — the full pipeline runs in-process, no AWS credentials Testing +- **Live-AWS verification is milestone-scoped, then torn down.** The pipeline now **defaults to plan-only** on every PR; `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12). - **Cost drivers** are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents). Any spike > $1/day is an anomaly. -**Pre-mortem (`PRE_MORTEM.md`):** failure modes were pre-mortemed before the leadership pitch. The v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: *a claim outruns the verification that backs it.* Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope). +**Pre-mortem (`PRE_MORTEM.md`):** the v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: *a claim outruns the verification that backs it.* Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope). --- -# A7 — Verified by Construction - -The v1.11 architecture makes "Verified" a structural property, not a claim. +# A8 — Verified by Construction -Two architectural pillars: +Two architectural pillars make "Verified" a structural property, not a claim: - **The stateless adapter (918 → ~80 lines).** The Terraform adapter was a 918-line monolith with 3 constant tables and 39 type-specific branches. It is now a ~80-line **stateless assembler**: it owns no module content — no resource shape, no nested HCL blocks, no defaults. Each L1 module ships a real `terraform/` module dir owning its shape, nested blocks, and defaults. The adapter reads the registry and emits `module "x" { source = ... }` blocks. A new module is a new terraform dir, not a code change. *(The v1.12 P67 fix closed a dedup defect for multi-resource L1s — ecs-service, alb; CAP-013 now Verified.)* - **Pipeline-driven lifecycle testing.** A `modules-lifecycle` pipeline matrix-runs each L1 and L2 module's `examples/{simple,complex}.yml` contracts through apply→modify→destroy against live AWS. **The "test" = the pipeline cell going green.** Defaults to **plan-only** on every PR (fast, no AWS mutation, no cost); `ACDL_LIFECYCLE_MODE=full` overrides to the real apply→destroy for milestone verification (REQ-134, v1.12). The regression gate (D-091) re-runs all 22 capabilities at milestone completion — **22/22 Verified** as of v1.12. diff --git a/docs/presentations/how-the-platform-works-talking-points.md b/docs/presentations/how-the-platform-works-talking-points.md index 845c440..735fc0e 100644 --- a/docs/presentations/how-the-platform-works-talking-points.md +++ b/docs/presentations/how-the-platform-works-talking-points.md @@ -1,6 +1,6 @@ # How The Platform Works — Talking Points -> **Companion to:** `how-the-platform-works-marp.md` (10 main + 7 appendix = 17 slides) +> **Companion to:** `how-the-platform-works-marp.md` (10 main + 8 appendix = 18 slides) > **Content source:** `how-the-platform-works.md` (full source of truth with speaker notes) > **Purpose:** Presenter-ready cues — 3-6 talking points per slide + the one key takeaway the audience should remember. > **Audience:** Senior Leadership — CTO, Head of Cloud, Head of Infrastructure, Head of DevOps @@ -10,235 +10,227 @@ ## Slide 1 — Title **Talking points:** -- Brief introduction — this deck explains *how* the platform works internally, not what the developer experience is (that's the companion deck) +- Brief introduction — this deck explains *how* the platform works internally, not the developer experience (that's the companion deck) - Set the frame: the platform is not a CI/CD tool — it's the organizational lever for shipping safely at the pace the business demands -- The deck has 10 main slides plus a 7-slide appendix for deep-dive questions -- v1.12 re-verification: every "Testing" claim in this deck is now Verified — 22/22 capabilities via the v1.11 lifecycle pipeline (see A7) +- Every "Testing" claim is Verified — 22/22 capabilities via the v1.11 lifecycle pipeline (see A8) -**Key takeaway:** This is a platform that computes safety, doesn't assume it. +**Key takeaway:** The platform is the organizational lever for safe, fast shipping. --- -## Slide 2 — The Problem & The North Star +## Slide 2 — Four frictions slow every team **Talking points:** -- Open with the cost of the status quo — every team running its own pipeline, its own Terraform, its own review checklist is paying a tax that doesn't differentiate the business -- Walk through the 4 frictions quickly: cognitive load, operational work, red tape, scalability. Don't dwell — the North Star is the resolution -- Land the North Star quote: "declare intent → safe production deployment" — this is the entire value proposition in one sentence +- Open with the cost of the status quo — every team running its own pipeline, Terraform, and review checklist pays a tax that doesn't differentiate the business +- The four frictions are categorically parallel: cognitive load, operational work, red tape, scalability +- The platform absorbs all four — that is the value proposition in one sentence +- Don't dwell here; this is the setup for the before/after contrast on the next slide + +**Key takeaway:** Four frictions slow every team. The platform absorbs all four. + +--- + +## Slide 3 — Declare intent; the platform delivers safe production + +**Talking points:** +- Land the before/after contrast: today's queue vs. ACDL's autonomous flow - The litmus test: if a platform engineer still has to touch a ticket for a dev→qa promotion, we haven't delivered the vision -- Note: the 2 anti-goals ("not a general-purpose AI" and "not a permissive delivery highway") have moved to slide 3 — they belong with the scope boundary, not the North Star +- The North Star is one sentence: "declare intent → safe production deployment" +- A non-technical consumer ships by declaring intent — no workflow, no config file, no module -**Key takeaway:** The platform absorbs all four frictions. Declare intent, not execute operations. +**Key takeaway:** Declare intent; the platform delivers safe production — autonomously, with a complete audit trail. --- -## Slide 3 — Where ACDL Sits in Your World +## Slide 4 — ACDL owns infrastructure, not your app **Talking points:** -- This is the scope-boundary slide — it tells leadership where ACDL fits and, just as importantly, 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 -- Land the 2 anti-goals: "not a general-purpose AI" (autonomy is narrow, scoped to delivery, bounded by strict policy) and "not a permissive delivery highway" (no escape hatches to bypass the confidence framework) -- The sovereign boundary means the platform team owns delivery and infrastructure, not the upstream development process +- The platform is deliberately scoped — it is not trying to be everything +- The sovereign boundary: the platform team owns delivery and infrastructure, not the upstream development process +- The anti-goals are as important as the goals — they tell leadership what not to expect +- Upstream is anything: IDE, agentic SDLC, or vibe coding — ACDL doesn't care how the contract was produced -**Key takeaway:** ACDL is the delivery and infrastructure boundary. Upstream is anything; ACDL is infra only. +**Key takeaway:** ACDL is infrastructure only. App build/test/deploy is upstream. --- -## Slide 4 — The Contract-Driven Model +## Slide 5 — One YAML file. The platform owns everything else. **Talking points:** -- Emphasize the asymmetry — the consumer's surface is intentionally tiny (module + environment + inputs), the platform's surface is large and opinionated -- Note: the contract examples now show **infrastructure inputs** (cpu, memory, desired_count, port) — not a container image. The image is upstream; the platform governs infrastructure -- The contract is the API — it's deliberately small so it can be reviewed, validated, and audited -- The consumer does not write infrastructure modules, workflow logic, or adapter code — they declare intent; the platform reconciles, provisions, and progresses -- Land the "no AWS account, no VPC, no state backend" point — the platform owns the blast radius. Consumers can't drift into misconfigured state or over-permissioned roles because they never touch them +- Hold this slide — emphasize the asymmetry. The consumer's surface is intentionally tiny; the platform's surface is large and opinionated +- The contract names three things: module, environment, inputs — that's the entire consumer-facing interface to production +- The contract shows infrastructure inputs (cpu, memory, desired_count, port) — not a container image. The image is upstream; the platform governs infrastructure +- The consumer provides no AWS account, no VPC, no state backend — the platform owns the blast radius -**Key takeaway:** A single YAML contract. The platform owns everything else — including the blast radius. +**Key takeaway:** One YAML file. The platform owns everything else. --- -## Slide 5 — The End-to-End Flow +## Slide 6 — Same stages, same checks, every deployment **Talking points:** -- Walk the flow left to right once — don't dwell on internals. The point is that the flow is fixed, opinionated, and identical for every consumer -- Land beat 1: security and policy checks run *before* any infrastructure is created — not after the fact, not as a post-deployment audit -- Land beat 2: every stage produces a record that feeds the confidence signal and the evidence stream. There is no "unchecked" path -- Tease the confidence signal (slide 7) — this is where "safety is computed" lands +- Walk left to right once — don't dwell on internals; the point is the flow is fixed, opinionated, and identical for every consumer +- The two leadership-relevant beats: (1) checks before creation, (2) every stage is evidenced +- No team-specific pipelines, no tribal runbooks — the flow is the contract +- The confidence signal (Slide 8) is where the "safety is computed" story lands -**Key takeaway:** The same pipeline, every time. Checks before creation, evidence at every stage. +**Key takeaway:** Same stages, same checks, every deployment. No "unchecked" path. --- -## Slide 6 — Zero-Trust by Default +## Slide 7 — No long-lived credentials. Blast radius contained. **Talking points:** - This is the slide for the Head of Cloud/Security — the key phrase is "blast radius contained to the consumer's own stack" -- Contrast with the common failure mode: shared CI roles that can touch any account resource. The platform's ABAC model scopes every action to the consumer's own tagged resources -- OIDC means no long-lived credentials in consumer repos — each job mints a short-lived token. Be honest: this is testing on GitHub Actions runners today; all-runner coverage is planned -- The static-key override exists for edge cases but is rotated daily on platform runners — it is never the default +- Contrast with the common failure mode of shared CI roles that can touch any account resource +- OIDC federation: short-lived token per job, no credential stored in the consumer repo or runner secret +- ABAC, not role-based: repo identity + resource tags scope every action — a consumer can only touch its own tagged resources +- The static-key override exists for edge cases but is rotated daily on platform runners; it is never the default -**Key takeaway:** A consumer can only touch the resources it created. One consumer can never affect another. +**Key takeaway:** No long-lived credentials. A consumer can only touch its own tagged resources. --- -## Slide 7 — Safety is Computed, Not Assumed +## Slide 8 — Safety is a measurable signal, not a black box **Talking points:** -- This is the bet that separates this platform from "yet another CI/CD tool" — reliance on operator instinct or tenure is not a substitute for a computed, auditable signal -- The confidence signal diagram makes the six inputs and the per-input breakdown visible — walk it briefly so the audience sees the signal is *not* a black box -- 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. This is the "auditable, not magic" point -- Walk the threshold table: dev ≥ 0.50 (autonomous, Testing) → qa ≥ 0.75 (QA, Planned) → prod ≥ 0.90 (SRE, Planned). The bar rises automatically with sensitivity -- A single critical policy finding hard-blocks the deployment — critical findings are not averaged away. This is non-negotiable -- The thresholds are tunable by Infra & Ops + SRE jointly, and any override is itself a confidence-event in the audit stream +- This is the bet that separates this platform from "yet another CI/CD tool" — reliance on operator instinct or tenure is not a substitute +- The signal is auditable; the thresholds are tunable by Infra & Ops + SRE jointly, and any override is itself a confidence-event in the audit stream +- Six weighted inputs: policy, validation, freshness, provenance, history, NFRs — manually tuned, auditable per-input breakdown +- If a consumer asks "why 0.62?", the platform answers with a per-input breakdown — not a black box +- A single critical finding hard-blocks — critical findings are not averaged away -**Key takeaway:** Safety is a measurable, explainable signal — manually tuned, observable inputs, auditable breakdown. A single critical finding blocks everything. +**Key takeaway:** Safety is a measurable, explainable signal — not a black box. --- -## Slide 8 — Security by Construction +## Slide 9 — Every change traceable to a human attestation **Talking points:** -- The phrase to land is "secure by default, not secure by effort" — teams don't opt in to security, it's on by construction -- Policy checks (Checkov, Wiz, Kyverno) are normalized to a single schema — we can add a new security tool without changing the confidence model or the evidence stream -- Tagging standards are enforced, not advisory — a missing `acdl:owner` tag fails the check, it doesn't warn -- Encryption is on every resource with per-stack customer-managed keys — no shared keys across stacks, 90-day rotation -- The decommission flow is the counter-argument to "deletion protection makes cleanup impossible" — it's a deliberate, gated, two-SRE-approval path with CMDB validation, not a lock with no key +- The "lower environments autonomous, higher environments attested" tenet resolves the classic "move fast vs. be safe" false dichotomy +- Be honest: the separation-of-duties *mechanism* is designed and the dev path is wired; qa/prod/dr wiring is on the roadmap +- The audit trail is a byproduct of deployment, not a project — every production change is traceable to a human attestation +- The full regulatory ledger (S3 Object Lock, JWS signatures, daily checkpoints) is planned; what ships today is the outbox + hash chain that makes every event tamper-evident and queryable +- RPO = 0 — the evidence write is synchronous; a deployment is not acknowledged until the evidence event is durably recorded -**Key takeaway:** Encryption, deletion protection, policy checks — on by default. Decommission is gated, not impossible. +**Key takeaway:** Every change is traceable to a human attestation and a tamper-evident evidence event. --- -## Slide 9 — Accountability & Audit - -**Talking points:** -- The "lower environments autonomous, higher environments attested" tenet is the resolution to the classic "move fast vs. be safe" false dichotomy -- The attestation flow diagram shows the human-in-the-loop path — dev autonomous → qa/prod/dr human attestation → evidence event. Walk it briefly -- Land the QA clarification: **QA attests to infrastructure readiness — the contract, the planned Terraform changes, and the accumulated evidence. QA does not review application code (that's upstream).** This is the scope-boundary point reiterated -- Badge reclassification to be clear about: separation of duties = **Planned** (not "design tested"); dev autonomous = **Testing**; qa/prod/dr attestation = **Planned** -- The audit trail is a byproduct of deployment, not a project — every deployment writes a hash-chained evidence event synchronously (RPO = 0) -- Be honest about the ledger: the outbox + hash chain is testing today; the full regulatory ledger (S3 Object Lock, JWS signatures, daily checkpoints) is planned - -**Key takeaway:** Dev is autonomous. Higher environments are attested. QA attests to infra readiness, not app code. Every change is evidenced. - ---- - -## Slide 10 — The Vision Realized +## Slide 10 — The vision realized **Talking points:** - Close on the strategic frame — the platform is not "a CI/CD tool," it's the organizational lever for shipping safely at the pace the business demands -- 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 traceable to a human attestation and a tamper-evident evidence event -- Infrastructure as a utility, not a craft — teams consume, they don't maintain. The platform compounds value over time by learning from recurring patterns -- The path to the citizen developer — the same safety envelope that serves a senior engineer will serve a non-technical consumer. Expanding who can ship safely without lowering the bar +- Velocity without sacrificing safety: speed is in the ergonomics, safety is in the unbypassable gates +- Security, observability, compliance as platform defaults — not per-team effort, not post-hoc remediation +- A path to the citizen developer: the same safety envelope serves a senior engineer and a non-technical consumer +- Invite questions; the companion deck ("The Developer Experience") covers who uses the platform and how fast/safe they ship -**Key takeaway:** The investment is in the abstraction, not the tool. Ship safely at the pace the business demands, with the security and audit posture the regulators require. +**Key takeaway:** Ship safely at the pace the business demands, with the security and audit posture the regulators require. --- -## Appendix TOC — Deep Dives +## Appendix TOC — Appendix **Talking points:** -- These slides are for follow-up questions — don't walk them in the main 15-minute talk -- Pull them up when an audience member wants detail on a specific topic: environments, observability, roadmap, full inventory, glossary, cost, or the v1.11 architecture -- The appendix now has 7 slides (A1–A7), including two new ones: A6 (Operating Model & Cost with real AWS figures + pre-mortem) and A7 (Verified by Construction — the v1.11 architecture) -- The appendix exists so the main deck stays tight while still having answers ready +- These are deep-dive slides for follow-up questions — don't walk them in the main 15-minute talk +- Pull them up when an audience member wants detail on a specific topic +- The appendix is indexed to match the Marp deck's A1-A8 structure -**Key takeaway:** The appendix is the backup — detail on demand, not on the critical path. +**Key takeaway:** Deep dives available — pull the relevant appendix slide when asked. --- ## A1 — Platform-Managed Environments **Talking points:** -- A consumer provides no AWS account, no VPC, no subnet, no state backend, no runner key — the platform owns the entire blast radius -- A named environment is a platform-owned bundle: an AWS account (or scoped partition), a network, a state backend, and an IAM role surfaced via ABAC -- The consumer selects an environment by name (`environment: dev`) and the platform resolves it at run time — the consumer never sees raw credentials -- Friendly onboarding is testing today: the first run detects no environment and emits a guided prompt, not an opaque failure. Self-service provisioning is planned -- For the Head of Cloud: this is the governance story — the platform team owns accounts, network design, and state hygiene; consumers can't drift because they never touch them +- For the Head of Cloud: this is the governance story — the platform team owns the accounts, the network design, the state hygiene +- Consumers can't drift into misconfigured state backends or over-permissioned roles because they never touch them +- The onboarding prompt matters — first impressions of a platform are made when it fails for the first time +- Self-service environment provisioning is planned -**Key takeaway:** Environments are platform-owned bundles. Consumers pick a name; the platform owns the rest. +**Key takeaway:** The consumer never sees raw credentials. The platform owns the blast radius. --- ## A2 — Observability Built In **Talking points:** -- Monitoring is a platform default, not a per-team project — you don't deploy a service and *then* remember to set up monitoring -- Uptime monitoring (Uptime-kuma on ECS Fargate) is provisioned automatically after any module deploy, in a separate state, with a feature flag to disable -- Monitored endpoints come from the deployment's own outputs — no manual endpoint registration. The platform constructs the synthetic monitoring contract from what was just deployed -- Alert channels: Microsoft Teams webhook, email, SMS, and GitHub issues — all testing today -- The uptime URL is published to the developer via a PR comment so they don't hunt for it -- Roadmap: deeper observability bootstrap (dashboards, runbooks, on-call bindings) as first-class contract fields for prod/dr — planned +- The Head of DevOps cares about this — "you don't deploy a service and *then* remember to set up monitoring; the platform does it as part of the deploy" +- Uptime monitoring deployed automatically with every stack — separate state, feature flag to disable +- The feature flag means teams with existing monitoring (e.g. Datadog) can opt out cleanly +- Deeper observability bootstrap (dashboards, runbooks, on-call bindings) is on the roadmap -**Key takeaway:** Monitoring ships with the deploy, not after it. The feature flag lets teams with existing monitoring opt out cleanly. +**Key takeaway:** Monitoring is a platform default, not a per-team project. --- -## A3 — The Road to the North Star +## A3 — Security by Construction **Talking points:** -- Be explicit up front: this is **proposed phasing, not formally planned** — the phases are sequenced by dependency, not by calendar -- Phase 1 — Testing baseline (current, v1.12): contract-driven deploys, zero-trust OIDC + ABAC, confidence signal, hash-chained evidence, encryption by default, safe decommission, uptime monitoring, platform-managed environments. **22/22 capabilities Verified** via the v1.11 lifecycle pipeline (apply→modify→destroy against live AWS, then torn down to zero-cost). The stateless adapter + lifecycle pipeline are the structural verification (see A7) -- Phase 2 — Production readiness: HITL wiring for qa/prod/dr, all-runner OIDC, full regulatory ledger (S3 Object Lock + JWS signatures + daily checkpoints), environment self-service -- Phase 3 — Compliance & expansion: compliance milestone (GDPR, SOX, SOC2, DORA), additional engine adapters (OpenTofu, Pulumi, Kubernetes CRDs), deeper observability bootstrap -- Phase 4 — Agentic frontier: dynamic module creation from a contract (citizen-developer flow), pattern recognition that compounds value over time -- Each phase's items are gated on the prior phase's maturity — invite questions on any phase boundary +- The phrase to land is "secure by default, not secure by effort" +- The selling point is *normalization* — we can add a new security tool without changing the confidence model or the evidence stream +- For the Head of Security: tagging standards are enforced, not advisory — a missing `acdl:owner` tag fails the check, not a warning +- The decommission flow is the counter-argument to "deletion protection makes cleanup impossible" — it's a deliberate, gated, two-approval path -**Key takeaway:** A dependency-sequenced path from testing baseline to agentic frontier — proposed, not formally committed. Phase 1 is now Verified (22/22), not aspirational. +**Key takeaway:** Secure by default, not secure by effort. Checks run before infra is created. --- -## A4 — Testing vs. Planned (Full Inventory) +## A4 — The Road to the North Star **Talking points:** -- Close on honesty — the platform delivers real, verifiable value today, and the roadmap is concrete, not aspirational hand-waving -- **22/22 capabilities Verified** via the v1.11 lifecycle pipeline (apply→modify→destroy against live AWS for every L1 + L2 module) + the D-091 regression gate. The v1.10 "6 deploy-unverified (IAM drift)" status is closed (CAP-013 fixed in P67) -- Walk the Testing column (22 capabilities) — from contract-driven deploys to encryption by default to uptime monitoring. These work internally and are dev pilot-ready -- Walk the Planned column (9 capabilities) — be clear about what's not yet done: HITL wiring, full regulatory ledger, compliance milestone, environment self-service, dynamic module creation, additional engine adapters, deeper observability -- Two agentic items are flagged: dynamic module creation and pattern recognition — both involve AI agents or autonomous decision-making +- Be clear with leadership: this is a proposed phasing, not a formally committed plan +- The phases are sequenced by dependency, not by calendar — each phase's items are gated on the prior phase's maturity +- Phase 1 is now fully Verified (22/22) and torn down to zero-cost — it is no longer aspirational +- Invite questions on any phase boundary + +**Key takeaway:** Proposed phasing, not formally planned. Phase 1 is Verified; Phase 4 is the North Star. + +--- + +## A5 — Testing vs. Planned (Full Inventory) + +**Talking points:** +- Close on honesty — the platform delivers real, verifiable value today: 22/22 auto-verifiable capabilities Verified via the v1.11 lifecycle pipeline +- The roadmap is concrete, not aspirational hand-waving — 9 planned items, each with a defined milestone and a clear reason it isn't shipped yet (usually an upstream dependency, not an engineering gap) - Emphasize: 0 consumer adoption today — "Testing" means it works internally and is dev pilot-ready, not that it's released -- The lifecycle pipeline defaults to **plan-only** on every PR (fast, no AWS mutation, no cost); `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12) +- The lifecycle pipeline defaults to plan-only on every PR; `ACDL_LIFECYCLE_MODE=full` overrides for milestone verification -**Key takeaway:** 22/22 capabilities Verified via lifecycle pipeline + regression gate. 9 planned items on a concrete roadmap. Zero consumer adoption — yet. +**Key takeaway:** 22/22 Verified today. 9 planned, each with a clear milestone and reason. --- -## A5 — Glossary +## A6 — Glossary **Talking points:** -- This is a reference slide — don't read it aloud, point to it as a takeaway reference for term definitions -- The terms most likely to come up in questions: OIDC (short-lived tokens), ABAC (tag-scoped access), CMK (per-stack encryption keys), RPO = 0 (synchronous evidence write) -- HITL is the human-attestation term for qa/prod/dr; NFR is the non-functional-requirements input to the confidence signal -- IR (Intermediate Representation) is the engine-agnostic stack definition between the contract and Terraform — the abstraction that makes the platform portable +- Use this slide as a reference when the audience asks for term definitions +- Don't read it aloud — point to it as a takeaway reference +- All acronyms used in the deck are defined here -**Key takeaway:** A shared vocabulary — keep it as a reference for follow-up questions. +**Key takeaway:** Reference slide — don't read aloud. --- -## A6 — Operating Model & Cost +## A7 — Operating Model & Cost **Talking points:** -- This is the slide for the Head of Cloud / Finance — the headline: less than one cent ($0.001883) over 8 days of active development; zero BAU cloud spend -- Walk the cost table: total $0.001883 / 8 days, daily average $0.000235, projected monthly ~$0.007, peak day 2026-07-27 at $0.000867 (a v1.10 regression + verify run) -- S3 dominates the spend (98.8%, the terraform state bucket) — no compute (ECS/Lambda) ran because v1.0→v1.10 was plan-only for IAM-gated capabilities -- Live-AWS verification is milestone-scoped, then torn down: the v1.11 lifecycle pipeline ran apply→modify→destroy for every module, then tore down to zero-cost (D-096 — teardown mandatory before milestone COMPLETE) -- The lifecycle pipeline now defaults to **plan-only** on every PR (fast, no AWS mutation, no cost); `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12) -- The pre-mortem (`PRE_MORTEM.md`) is the credibility slide — we already asked "how does this fail?" The v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: *a claim outruns the verification that backs it.* Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope) +- The headline for the Head of Cloud / Finance: less than one cent over 8 days of active development; zero BAU cloud spend +- The lifecycle pipeline defaults to plan-only so the PR-time cost is zero +- The pre-mortem is the credibility slide — we already asked "how does this fail?" and the mitigations are structural +- The v1.10 decay incident is disclosed honestly, not hidden — that disclosure IS the mitigation -**Key takeaway:** Less than one cent over 8 days. Zero BAU cloud spend. The pre-mortem + plan-only default make cost a non-issue and verification structural. +**Key takeaway:** Zero BAU cloud cost. Pre-mortemed failure modes with structural mitigations. --- -## A7 — Verified by Construction +## A8 — Verified by Construction **Talking points:** - This is the deep-dive slide for the Head of Engineering / Architecture — the two pillars answer "how do you keep the decks honest?" -- Pillar 1 — the **stateless adapter** (918 → ~80 lines): the old adapter was a monolith with 3 constant tables and 39 type-specific branches. The new adapter is a stateless assembler that owns no module content — each L1 module ships a real `terraform/` module dir owning its shape, nested blocks, and defaults. A new module is a new terraform dir, not a code change -- The v1.12 P67 fix closed a dedup defect for multi-resource L1s (ecs-service, alb) — CAP-013 is now Verified -- Pillar 2 — **pipeline-driven lifecycle testing**: a `modules-lifecycle` pipeline matrix-runs each L1 and L2 module's contracts through apply→modify→destroy against live AWS. The "test" = the pipeline cell going green. No per-module Python -- The pipeline defaults to plan-only on every PR (zero cost); `ACDL_LIFECYCLE_MODE=full` runs the real apply→destroy for milestone verification. The regression gate (D-091) re-runs all 22 capabilities at milestone completion — 22/22 Verified as of v1.12 -- The v1.10 lesson is the negative space: a 918-line adapter with type-specific branches decayed silently because the VERIFY gate was diff-scoped. The ~80-line stateless adapter + the milestone regression gate are the structural fix +- The adapter is simple enough to reason about (a stateless assembler); the lifecycle pipeline is the automated verification that backs every "Testing" claim +- The v1.10 lesson is the negative space: a 918-line adapter with type-specific branches decayed silently because the VERIFY gate was diff-scoped +- The ~80-line stateless adapter + the milestone regression gate are the structural fix +- The plan-only default (v1.12) means verification runs on every PR at zero cost, with the full apply→destroy gated behind a CI variable override -**Key takeaway:** "Verified" is a structural property, not a claim — a stateless ~80-line adapter + a lifecycle pipeline that defaults to plan-only and goes green on every PR. \ No newline at end of file +**Key takeaway:** "Verified" is a structural property, not a claim — the stateless adapter + lifecycle pipeline make it so. \ No newline at end of file diff --git a/docs/presentations/how-the-platform-works.html b/docs/presentations/how-the-platform-works.html index fe7d3b6..146e3d1 100644 --- a/docs/presentations/how-the-platform-works.html +++ b/docs/presentations/how-the-platform-works.html @@ -7,45 +7,43 @@ * @auto-scaling true * @size 16:9 1280px 720px * @size 4:3 960px 720px - */div#\:\$p > svg > foreignObject > section [data-theme=light],div#\:\$p > svg > foreignObject > section{color-scheme:light}div#\:\$p > svg > foreignObject > section [data-theme=dark],div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;font-weight:var(--base-text-weight-normal, 400);color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:var(--fontStack-sansSerif, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji");font-size:16px;line-height:1.5;word-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:16px}div#\:\$p > svg > foreignObject > section a{text-decoration:underline;text-underline-offset:calc(var(--marpit-root-font-size, 1rem) * .2)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section figcaption,div#\:\$p > svg > foreignObject > section figure{display:block}div#\:\$p > svg > foreignObject > section summary{display:list-item}div#\:\$p > svg > foreignObject > section [hidden]{display:none!important}div#\:\$p > svg > foreignObject > section a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}div#\:\$p > svg > foreignObject > section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#\:\$p > svg > foreignObject > section b,div#\:\$p > svg > foreignObject > section strong{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dfn{font-style:italic}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section small{font-size:90%}div#\:\$p > svg > foreignObject > section sub,div#\:\$p > svg > foreignObject > section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#\:\$p > svg > foreignObject > section sub{bottom:-.25em}div#\:\$p > svg > foreignObject > section sup{top:-.5em}div#\:\$p > svg > foreignObject > section img{border-style:none;max-width:100%;box-sizing:content-box}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section kbd,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp{font-family:monospace;font-size:1em}div#\:\$p > svg > foreignObject > section figure{margin:1em var(--base-size-40)}div#\:\$p > svg > foreignObject > section hr{box-sizing:content-box;overflow:hidden;background:transparent;height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}div#\:\$p > svg > foreignObject > section input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}div#\:\$p > svg > foreignObject > section [type=button],div#\:\$p > svg > foreignObject > section [type=reset],div#\:\$p > svg > foreignObject > section [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}div#\:\$p > svg > foreignObject > section [type=checkbox],div#\:\$p > svg > foreignObject > section [type=radio]{box-sizing:border-box;padding:0}div#\:\$p > svg > foreignObject > section [type=number]::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section [type=number]::-webkit-outer-spin-button{height:auto}div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-cancel-button,div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#\:\$p > svg > foreignObject > section ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}div#\:\$p > svg > foreignObject > section a:hover{text-decoration:underline}div#\:\$p > svg > foreignObject > section ::-moz-placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section ::placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section hr:after,div#\:\$p > svg > foreignObject > section hr:before{display:table;content:""}div#\:\$p > svg > foreignObject > section hr:after{clear:both}div#\:\$p > svg > foreignObject > section table{border-spacing:0;border-collapse:collapse;display:block;width:-moz-max-content;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}div#\:\$p > svg > foreignObject > section td,div#\:\$p > svg > foreignObject > section th{padding:0}div#\:\$p > svg > foreignObject > section details summary{cursor:pointer}div#\:\$p > svg > foreignObject > section [role=button]:focus,div#\:\$p > svg > foreignObject > section a:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#\:\$p > svg > foreignObject > section [role=button]:focus-visible,div#\:\$p > svg > foreignObject > section a:focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section a:not([class]):focus,div#\:\$p > svg > foreignObject > section a:not([class]):focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline-offset:0}div#\:\$p > svg > foreignObject > section kbd{display:inline-block;padding:var(--base-size-4);font:11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border-bottom-color:var(--borderColor-neutral-muted);border:1px solid var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin-top:var(--base-size-24);margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.25em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:.875em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}div#\:\$p > svg > foreignObject > section p{margin-top:0;margin-bottom:10px}div#\:\$p > svg > foreignObject > section blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:0;padding-left:2em}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ul ol{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol ol ol,div#\:\$p > svg > foreignObject > section ol ul ol,div#\:\$p > svg > foreignObject > section ul ol ol,div#\:\$p > svg > foreignObject > section ul ul ol{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section dd{margin-left:0}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp,div#\:\$p > svg > foreignObject > section tt{font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){margin-top:0;margin-bottom:0;word-wrap:normal}div#\:\$p > svg > foreignObject > section .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}div#\:\$p > svg > foreignObject > section input::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section .mr-2{margin-right:var(--base-size-8, 8px)!important}div#\:\$p > svg > foreignObject > section:after,div#\:\$p > svg > foreignObject > section:before{display:table}div#\:\$p > svg > foreignObject > section:after{clear:both}div#\:\$p > svg > foreignObject > section>:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section>:last-child{margin-bottom:0!important}div#\:\$p > svg > foreignObject > section a:not([href]){color:inherit;text-decoration:none}div#\:\$p > svg > foreignObject > section .absent{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section .anchor{float:left;padding-right:var(--base-size-4);margin-left:-20px;line-height:1}div#\:\$p > svg > foreignObject > section .anchor:focus{outline:none}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section dl,div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section p,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section table,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section blockquote>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor{text-decoration:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link{visibility:visible}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) code,div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) tt,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) code,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) tt,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) code,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) tt,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) code,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) tt,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) code,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) tt,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) code,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) tt{padding:0 .2em;font-size:inherit}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6){display:inline-block}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6) .anchor{margin-left:-40px}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2){padding-bottom:0;border-bottom:0}div#\:\$p > svg > foreignObject > section ol.no-list,div#\:\$p > svg > foreignObject > section ul.no-list{padding:0;list-style-type:none}div#\:\$p > svg > foreignObject > section ol[type="a s"]{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section ol[type="A s"]{list-style-type:upper-alpha}div#\:\$p > svg > foreignObject > section ol[type="i s"]{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol[type="I s"]{list-style-type:upper-roman}div#\:\$p > svg > foreignObject > section div>ol:not([type]),div#\:\$p > svg > foreignObject > section ol[type="1"]{list-style-type:decimal}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ol ul,div#\:\$p > svg > foreignObject > section ul ol,div#\:\$p > svg > foreignObject > section ul ul{margin-top:0;margin-bottom:0}div#\:\$p > svg > foreignObject > section li>p{margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section li+li{margin-top:.25em}div#\:\$p > svg > foreignObject > section dl{padding:0}div#\:\$p > svg > foreignObject > section dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section table th{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{padding:6px 13px;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section table td>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section table tr:nth-child(2n){background-color:var(--bgColor-muted)}div#\:\$p > svg > foreignObject > section table img{background-color:transparent}div#\:\$p > svg > foreignObject > section img[align=right]{padding-left:20px}div#\:\$p > svg > foreignObject > section img[align=left]{padding-right:20px}div#\:\$p > svg > foreignObject > section .emoji{max-width:none;vertical-align:text-top;background-color:transparent}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame,div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){float:left;width:auto;padding:7px;margin:13px 0 0;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) img{display:block;float:left}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) :is(span, marp-span){display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center :is(span, marp-span) img{margin:0 auto;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right>:is(span, marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right :is(span, marp-span) img{margin:0;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left :is(span, marp-span){margin:13px 0 0}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section code br,div#\:\$p > svg > foreignObject > section tt br{display:none}div#\:\$p > svg > foreignObject > section del code{text-decoration:inherit}div#\:\$p > svg > foreignObject > section samp{font-size:85%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{font-size:100%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}div#\:\$p > svg > foreignObject > section .highlight{margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre){margin-bottom:0;word-break:normal}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) tt{display:inline;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}div#\:\$p > svg > foreignObject > section .csv-data td,div#\:\$p > svg > foreignObject > section .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}div#\:\$p > svg > foreignObject > section .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}div#\:\$p > svg > foreignObject > section .csv-data tr{border-top:0}div#\:\$p > svg > foreignObject > section .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:before{content:"["}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:after{content:"]"}div#\:\$p > svg > foreignObject > section .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section div#\:\$p > svg > foreignObject > section section.footnotes{--marpit-root-font-size:12px}div#\:\$p > svg > foreignObject > section .footnotes ol,div#\:\$p > svg > foreignObject > section .footnotes ol ul{padding-left:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes ol ul{display:inline-block;margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes li{position:relative}div#\:\$p > svg > foreignObject > section .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8)*-1);right:calc(var(--base-size-8)*-1);bottom:calc(var(--base-size-8)*-1);left:calc(var(--base-size-24)*-1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}div#\:\$p > svg > foreignObject > section .footnotes li:target{color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#\:\$p > svg > foreignObject > section .pl-c{color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section .pl-c1,div#\:\$p > svg > foreignObject > section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section .pl-e,div#\:\$p > svg > foreignObject > section .pl-en{color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section .pl-s .pl-s1,div#\:\$p > svg > foreignObject > section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section .pl-pds,div#\:\$p > svg > foreignObject > section .pl-s,div#\:\$p > svg > foreignObject > section .pl-s .pl-pse .pl-s1,div#\:\$p > svg > foreignObject > section .pl-sr,div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sra,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section .pl-smw,div#\:\$p > svg > foreignObject > section .pl-v{color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#\:\$p > svg > foreignObject > section .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}div#\:\$p > svg > foreignObject > section .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}div#\:\$p > svg > foreignObject > section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section .pl-mh,div#\:\$p > svg > foreignObject > section .pl-mh .pl-en,div#\:\$p > svg > foreignObject > section .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}div#\:\$p > svg > foreignObject > section .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}div#\:\$p > svg > foreignObject > section .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}div#\:\$p > svg > foreignObject > section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#\:\$p > svg > foreignObject > section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#\:\$p > svg > foreignObject > section .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section button:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section summary:focus:not(:focus-visible){outline:none;box-shadow:none}div#\:\$p > svg > foreignObject > section [tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section details-dialog:focus:not(:focus-visible){outline:none}div#\:\$p > svg > foreignObject > section g-emoji{display:inline-block;min-width:1ch;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}div#\:\$p > svg > foreignObject > section g-emoji img{width:1em;height:1em}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote){display:block}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):not(:has(.snippet-clipboard-content,>:is(pre, marp-pre))){width:-moz-fit-content;width:fit-content}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):has(.snippet-clipboard-content,>:is(pre, marp-pre)):focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:2px}div#\:\$p > svg > foreignObject > section .task-list-item{list-style-type:none}div#\:\$p > svg > foreignObject > section .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}div#\:\$p > svg > foreignObject > section .task-list-item.enabled label{cursor:pointer}div#\:\$p > svg > foreignObject > section .task-list-item+.task-list-item{margin-top:var(--base-size-4)}div#\:\$p > svg > foreignObject > section .task-list-item .handle{display:none}div#\:\$p > svg > foreignObject > section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#\:\$p > svg > foreignObject > section ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section .contains-task-list:focus-within .task-list-item-convert-container,div#\:\$p > svg > foreignObject > section .contains-task-list:hover .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip-path:none}div#\:\$p > svg > foreignObject > section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#\:\$p > svg > foreignObject > section .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section .markdown-alert>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section .markdown-alert>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section>:first-child>.heading-element:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre):has(+.zeroclipboard-container){min-height:52px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:var(--h1-color);font-size:1.6em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){border-bottom:none}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.05em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit;color:var(--heading-strong-color)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:563px}div#\:\$p > svg > foreignObject > section hr{height:0;padding-top:.25em}div#\:\$p > svg > foreignObject > section img{background-color:transparent}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){border:1px solid var(--borderColor-default);line-height:1.15;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:529px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-doctag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-tag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-variable),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-type),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_.inherited__),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attribute),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-literal),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-number),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-operator),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-class),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-id),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-string),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-regexp),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-built_in),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-code),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-comment),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-name),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-quote),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-pseudo),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-section){font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-emphasis){font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-strong){font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-addition){color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-deletion){color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{margin:0;position:absolute;left:30px;color:var(--header-footer-color);font-size:18px}div#\:\$p > svg > foreignObject > section header{top:21px}div#\:\$p > svg > foreignObject > section footer{bottom:21px}div#\:\$p > svg > foreignObject > section{--h1-color:light-dark(#246, #cee7ff);--header-footer-color:light-dark(hsla(0,0%,40%,.75), hsla(0,0%,60%,.75));--heading-strong-color:light-dark(#48c, #7bf);--paginate-color:light-dark(#777, #999);--base-size-4:4px;--base-size-8:8px;--base-size-16:16px;--base-size-24:24px;--base-size-40:40px;display:block;font-size:29px;height:720px;padding:78.5px;place-content:safe center center;width:1280px;flex-flow:column nowrap;align-items:stretch}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:29px}div#\:\$p > svg > foreignObject > section>:last-child,div#\:\$p > svg > foreignObject > section[data-footer]>:nth-last-child(2){margin-bottom:0}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:var(--paginate-color)}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:24px}div#\:\$p > svg > foreignObject > section[data-color] :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section[data-color] :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section[data-color] :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section[data-color] :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section[data-color] :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section[data-color] :is(h6, marp-h6){color:currentcolor}div#\:\$p > svg > foreignObject > section{font-family:"Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;font-size:22px;color:#1B1B1B}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 22px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:#D6002A;font-size:34px;margin-bottom:0.3em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){color:#D6002A;font-size:26px;margin-bottom:0.2em}div#\:\$p > svg > foreignObject > section.title{background:#1B1B1B;color:#fff;border-top:8px solid #D6002A}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){color:#fff}div#\:\$p > svg > foreignObject > section table{font-size:18px;width:100%}div#\:\$p > svg > foreignObject > section th{background:#F0F0F0}div#\:\$p > svg > foreignObject > section blockquote{border-left:4px solid #D6002A;color:#2E2E2E;font-size:20px}div#\:\$p > svg > foreignObject > section img{display:block;margin:0 auto;max-height:300px}div#\:\$p > svg > foreignObject > section em.story{color:#6B7280;font-size:16px;font-style:italic}div#\:\$p > svg > foreignObject > section .badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:14px;font-weight:600}div#\:\$p > svg > foreignObject > section section.badge{--marpit-root-font-size: 14px}div#\:\$p > svg > foreignObject > section .testing{background:#DBEAFE;color:#1E3A5F}div#\:\$p > svg > foreignObject > section .planned{background:#fef3c7;color:#78350f}div#\:\$p > svg > foreignObject > section .agentic{background:#EDE9FE;color:#4C1D95}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){font-size:44px;margin-bottom:0.1em}div#\:\$p > svg > foreignObject > section.title :is(h3, marp-h3){color:#F0F0F0;font-weight:400;font-size:22px;margin-top:0}div#\:\$p > svg > foreignObject > section{font-size:20px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 20px}div#\:\$p > svg > foreignObject > section{font-size:15px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 15px}div#\:\$p > svg > foreignObject > section td{font-size:14px;vertical-align:top}div#\:\$p > svg > foreignObject > section ul{margin:0;padding-left:1.2em}div#\:\$p > svg > foreignObject > section li{margin-bottom:2px}div#\:\$p > svg > foreignObject > section{font-size:18px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 18px}div#\:\$p > svg > foreignObject > section table{font-size:16px}div#\:\$p > svg > foreignObject > section{font-size:18px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 18px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%} + */div#\:\$p > svg > foreignObject > section [data-theme=light],div#\:\$p > svg > foreignObject > section{color-scheme:light}div#\:\$p > svg > foreignObject > section [data-theme=dark],div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;font-weight:var(--base-text-weight-normal, 400);color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:var(--fontStack-sansSerif, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji");font-size:16px;line-height:1.5;word-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:16px}div#\:\$p > svg > foreignObject > section a{text-decoration:underline;text-underline-offset:calc(var(--marpit-root-font-size, 1rem) * .2)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section figcaption,div#\:\$p > svg > foreignObject > section figure{display:block}div#\:\$p > svg > foreignObject > section summary{display:list-item}div#\:\$p > svg > foreignObject > section [hidden]{display:none!important}div#\:\$p > svg > foreignObject > section a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}div#\:\$p > svg > foreignObject > section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#\:\$p > svg > foreignObject > section b,div#\:\$p > svg > foreignObject > section strong{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dfn{font-style:italic}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section small{font-size:90%}div#\:\$p > svg > foreignObject > section sub,div#\:\$p > svg > foreignObject > section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#\:\$p > svg > foreignObject > section sub{bottom:-.25em}div#\:\$p > svg > foreignObject > section sup{top:-.5em}div#\:\$p > svg > foreignObject > section img{border-style:none;max-width:100%;box-sizing:content-box}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section kbd,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp{font-family:monospace;font-size:1em}div#\:\$p > svg > foreignObject > section figure{margin:1em var(--base-size-40)}div#\:\$p > svg > foreignObject > section hr{box-sizing:content-box;overflow:hidden;background:transparent;height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}div#\:\$p > svg > foreignObject > section input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}div#\:\$p > svg > foreignObject > section [type=button],div#\:\$p > svg > foreignObject > section [type=reset],div#\:\$p > svg > foreignObject > section [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}div#\:\$p > svg > foreignObject > section [type=checkbox],div#\:\$p > svg > foreignObject > section [type=radio]{box-sizing:border-box;padding:0}div#\:\$p > svg > foreignObject > section [type=number]::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section [type=number]::-webkit-outer-spin-button{height:auto}div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-cancel-button,div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#\:\$p > svg > foreignObject > section ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}div#\:\$p > svg > foreignObject > section a:hover{text-decoration:underline}div#\:\$p > svg > foreignObject > section ::-moz-placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section ::placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section hr:after,div#\:\$p > svg > foreignObject > section hr:before{display:table;content:""}div#\:\$p > svg > foreignObject > section hr:after{clear:both}div#\:\$p > svg > foreignObject > section table{border-spacing:0;border-collapse:collapse;display:block;width:-moz-max-content;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}div#\:\$p > svg > foreignObject > section td,div#\:\$p > svg > foreignObject > section th{padding:0}div#\:\$p > svg > foreignObject > section details summary{cursor:pointer}div#\:\$p > svg > foreignObject > section [role=button]:focus,div#\:\$p > svg > foreignObject > section a:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#\:\$p > svg > foreignObject > section [role=button]:focus-visible,div#\:\$p > svg > foreignObject > section a:focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section a:not([class]):focus,div#\:\$p > svg > foreignObject > section a:not([class]):focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline-offset:0}div#\:\$p > svg > foreignObject > section kbd{display:inline-block;padding:var(--base-size-4);font:11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border-bottom-color:var(--borderColor-neutral-muted);border:1px solid var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin-top:var(--base-size-24);margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.25em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:.875em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}div#\:\$p > svg > foreignObject > section p{margin-top:0;margin-bottom:10px}div#\:\$p > svg > foreignObject > section blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:0;padding-left:2em}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ul ol{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol ol ol,div#\:\$p > svg > foreignObject > section ol ul ol,div#\:\$p > svg > foreignObject > section ul ol ol,div#\:\$p > svg > foreignObject > section ul ul ol{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section dd{margin-left:0}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp,div#\:\$p > svg > foreignObject > section tt{font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){margin-top:0;margin-bottom:0;word-wrap:normal}div#\:\$p > svg > foreignObject > section .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}div#\:\$p > svg > foreignObject > section input::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section .mr-2{margin-right:var(--base-size-8, 8px)!important}div#\:\$p > svg > foreignObject > section:after,div#\:\$p > svg > foreignObject > section:before{display:table}div#\:\$p > svg > foreignObject > section:after{clear:both}div#\:\$p > svg > foreignObject > section>:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section>:last-child{margin-bottom:0!important}div#\:\$p > svg > foreignObject > section a:not([href]){color:inherit;text-decoration:none}div#\:\$p > svg > foreignObject > section .absent{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section .anchor{float:left;padding-right:var(--base-size-4);margin-left:-20px;line-height:1}div#\:\$p > svg > foreignObject > section .anchor:focus{outline:none}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section dl,div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section p,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section table,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section blockquote>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor{text-decoration:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link{visibility:visible}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) code,div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) tt,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) code,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) tt,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) code,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) tt,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) code,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) tt,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) code,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) tt,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) code,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) tt{padding:0 .2em;font-size:inherit}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6){display:inline-block}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6) .anchor{margin-left:-40px}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2){padding-bottom:0;border-bottom:0}div#\:\$p > svg > foreignObject > section ol.no-list,div#\:\$p > svg > foreignObject > section ul.no-list{padding:0;list-style-type:none}div#\:\$p > svg > foreignObject > section ol[type="a s"]{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section ol[type="A s"]{list-style-type:upper-alpha}div#\:\$p > svg > foreignObject > section ol[type="i s"]{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol[type="I s"]{list-style-type:upper-roman}div#\:\$p > svg > foreignObject > section div>ol:not([type]),div#\:\$p > svg > foreignObject > section ol[type="1"]{list-style-type:decimal}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ol ul,div#\:\$p > svg > foreignObject > section ul ol,div#\:\$p > svg > foreignObject > section ul ul{margin-top:0;margin-bottom:0}div#\:\$p > svg > foreignObject > section li>p{margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section li+li{margin-top:.25em}div#\:\$p > svg > foreignObject > section dl{padding:0}div#\:\$p > svg > foreignObject > section dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section table th{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{padding:6px 13px;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section table td>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section table tr:nth-child(2n){background-color:var(--bgColor-muted)}div#\:\$p > svg > foreignObject > section table img{background-color:transparent}div#\:\$p > svg > foreignObject > section img[align=right]{padding-left:20px}div#\:\$p > svg > foreignObject > section img[align=left]{padding-right:20px}div#\:\$p > svg > foreignObject > section .emoji{max-width:none;vertical-align:text-top;background-color:transparent}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame,div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){float:left;width:auto;padding:7px;margin:13px 0 0;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) img{display:block;float:left}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) :is(span, marp-span){display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center :is(span, marp-span) img{margin:0 auto;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right>:is(span, marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right :is(span, marp-span) img{margin:0;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left :is(span, marp-span){margin:13px 0 0}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section code br,div#\:\$p > svg > foreignObject > section tt br{display:none}div#\:\$p > svg > foreignObject > section del code{text-decoration:inherit}div#\:\$p > svg > foreignObject > section samp{font-size:85%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{font-size:100%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}div#\:\$p > svg > foreignObject > section .highlight{margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre){margin-bottom:0;word-break:normal}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) tt{display:inline;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}div#\:\$p > svg > foreignObject > section .csv-data td,div#\:\$p > svg > foreignObject > section .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}div#\:\$p > svg > foreignObject > section .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}div#\:\$p > svg > foreignObject > section .csv-data tr{border-top:0}div#\:\$p > svg > foreignObject > section .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:before{content:"["}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:after{content:"]"}div#\:\$p > svg > foreignObject > section .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section div#\:\$p > svg > foreignObject > section section.footnotes{--marpit-root-font-size:12px}div#\:\$p > svg > foreignObject > section .footnotes ol,div#\:\$p > svg > foreignObject > section .footnotes ol ul{padding-left:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes ol ul{display:inline-block;margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes li{position:relative}div#\:\$p > svg > foreignObject > section .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8)*-1);right:calc(var(--base-size-8)*-1);bottom:calc(var(--base-size-8)*-1);left:calc(var(--base-size-24)*-1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}div#\:\$p > svg > foreignObject > section .footnotes li:target{color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#\:\$p > svg > foreignObject > section .pl-c{color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section .pl-c1,div#\:\$p > svg > foreignObject > section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section .pl-e,div#\:\$p > svg > foreignObject > section .pl-en{color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section .pl-s .pl-s1,div#\:\$p > svg > foreignObject > section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section .pl-pds,div#\:\$p > svg > foreignObject > section .pl-s,div#\:\$p > svg > foreignObject > section .pl-s .pl-pse .pl-s1,div#\:\$p > svg > foreignObject > section .pl-sr,div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sra,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section .pl-smw,div#\:\$p > svg > foreignObject > section .pl-v{color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#\:\$p > svg > foreignObject > section .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}div#\:\$p > svg > foreignObject > section .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}div#\:\$p > svg > foreignObject > section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section .pl-mh,div#\:\$p > svg > foreignObject > section .pl-mh .pl-en,div#\:\$p > svg > foreignObject > section .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}div#\:\$p > svg > foreignObject > section .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}div#\:\$p > svg > foreignObject > section .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}div#\:\$p > svg > foreignObject > section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#\:\$p > svg > foreignObject > section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#\:\$p > svg > foreignObject > section .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section button:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section summary:focus:not(:focus-visible){outline:none;box-shadow:none}div#\:\$p > svg > foreignObject > section [tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section details-dialog:focus:not(:focus-visible){outline:none}div#\:\$p > svg > foreignObject > section g-emoji{display:inline-block;min-width:1ch;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}div#\:\$p > svg > foreignObject > section g-emoji img{width:1em;height:1em}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote){display:block}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):not(:has(.snippet-clipboard-content,>:is(pre, marp-pre))){width:-moz-fit-content;width:fit-content}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):has(.snippet-clipboard-content,>:is(pre, marp-pre)):focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:2px}div#\:\$p > svg > foreignObject > section .task-list-item{list-style-type:none}div#\:\$p > svg > foreignObject > section .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}div#\:\$p > svg > foreignObject > section .task-list-item.enabled label{cursor:pointer}div#\:\$p > svg > foreignObject > section .task-list-item+.task-list-item{margin-top:var(--base-size-4)}div#\:\$p > svg > foreignObject > section .task-list-item .handle{display:none}div#\:\$p > svg > foreignObject > section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#\:\$p > svg > foreignObject > section ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section .contains-task-list:focus-within .task-list-item-convert-container,div#\:\$p > svg > foreignObject > section .contains-task-list:hover .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip-path:none}div#\:\$p > svg > foreignObject > section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#\:\$p > svg > foreignObject > section .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section .markdown-alert>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section .markdown-alert>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section>:first-child>.heading-element:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre):has(+.zeroclipboard-container){min-height:52px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:var(--h1-color);font-size:1.6em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){border-bottom:none}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.05em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit;color:var(--heading-strong-color)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:563px}div#\:\$p > svg > foreignObject > section hr{height:0;padding-top:.25em}div#\:\$p > svg > foreignObject > section img{background-color:transparent}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){border:1px solid var(--borderColor-default);line-height:1.15;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:529px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-doctag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-tag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-variable),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-type),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_.inherited__),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attribute),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-literal),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-number),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-operator),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-class),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-id),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-string),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-regexp),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-built_in),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-code),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-comment),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-name),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-quote),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-pseudo),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-section){font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-emphasis){font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-strong){font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-addition){color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-deletion){color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{margin:0;position:absolute;left:30px;color:var(--header-footer-color);font-size:18px}div#\:\$p > svg > foreignObject > section header{top:21px}div#\:\$p > svg > foreignObject > section footer{bottom:21px}div#\:\$p > svg > foreignObject > section{--h1-color:light-dark(#246, #cee7ff);--header-footer-color:light-dark(hsla(0,0%,40%,.75), hsla(0,0%,60%,.75));--heading-strong-color:light-dark(#48c, #7bf);--paginate-color:light-dark(#777, #999);--base-size-4:4px;--base-size-8:8px;--base-size-16:16px;--base-size-24:24px;--base-size-40:40px;display:block;font-size:29px;height:720px;padding:78.5px;place-content:safe center center;width:1280px;flex-flow:column nowrap;align-items:stretch}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:29px}div#\:\$p > svg > foreignObject > section>:last-child,div#\:\$p > svg > foreignObject > section[data-footer]>:nth-last-child(2){margin-bottom:0}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:var(--paginate-color)}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:24px}div#\:\$p > svg > foreignObject > section[data-color] :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section[data-color] :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section[data-color] :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section[data-color] :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section[data-color] :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section[data-color] :is(h6, marp-h6){color:currentcolor}div#\:\$p > svg > foreignObject > section{font-family:"Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;font-size:26px;color:#1B1B1B}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 26px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:#D6002A;font-size:40px;margin-bottom:0.3em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){color:#D6002A;font-size:32px;margin-bottom:0.2em}div#\:\$p > svg > foreignObject > section.title{background:#1B1B1B;color:#fff;border-top:8px solid #D6002A}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){color:#fff}div#\:\$p > svg > foreignObject > section table{font-size:22px;width:100%}div#\:\$p > svg > foreignObject > section th{background:#F0F0F0}div#\:\$p > svg > foreignObject > section blockquote{border-left:4px solid #D6002A;color:#2E2E2E;font-size:24px}div#\:\$p > svg > foreignObject > section img{display:block;margin:0 auto;max-height:300px}div#\:\$p > svg > foreignObject > section .badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:16px;font-weight:600}div#\:\$p > svg > foreignObject > section section.badge{--marpit-root-font-size: 16px}div#\:\$p > svg > foreignObject > section .testing{background:#DBEAFE;color:#1E3A5F}div#\:\$p > svg > foreignObject > section .planned{background:#fef3c7;color:#78350f}div#\:\$p > svg > foreignObject > section .agentic{background:#EDE9FE;color:#4C1D95}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){font-size:44px;margin-bottom:0.1em}div#\:\$p > svg > foreignObject > section.title :is(h3, marp-h3){color:#F0F0F0;font-weight:400;font-size:22px;margin-top:0}div#\:\$p > svg > foreignObject > section{font-size:18px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 18px}div#\:\$p > svg > foreignObject > section td{font-size:16px;vertical-align:top}div#\:\$p > svg > foreignObject > section ul{margin:0;padding-left:1.2em}div#\:\$p > svg > foreignObject > section li{margin-bottom:2px}div#\:\$p > svg > foreignObject > section{font-size:20px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 20px}div#\:\$p > svg > foreignObject > section table{font-size:18px}div#\:\$p > svg > foreignObject > section{font-size:20px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 20px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%}
How The Platform Works
-

The Problem & The North Star

-

Here's the problem we're solving and where we're going.

-

Four frictions slow every team:

+

Four frictions slow every team

+

    -
  • Cognitive load — authoring infrastructure correctly; the long tail of services inconsistent in security and observability
  • -
  • Operational work — promoting a change from "merged" to "running in production." Manual work that scales with the system, not the change
  • -
  • Red tape — tickets, approvals, and handoffs that scale with the organization. A merged change waits in a queue
  • -
  • Scalability without increasing headcount — throughput scales without linearly scaling platform engineers
  • -
-
-

Consumers declare intent; the platform delivers safe production deployment — automatically, safely, with a complete audit trail.

-
-
    -
  • A merged change progresses without a platform engineer joining a thread or approving a ticket
  • -
  • A non-technical consumer ships by declaring intent — no workflow, no config file, no infrastructure module
  • -
  • Every production change is traceable to a human attestation and an immutable evidence stream
  • +
  • Cognitive load — services inconsistent in security and observability
  • +
  • Operational work — manual promotion scaling with the system
  • +
  • Red tape — tickets and handoffs scaling with the organization
  • +
  • Scalability — throughput without scaling platform engineers
Internal
How The Platform Works
-

Where ACDL Sits in Your World

-

Now that we know the problem, here's where ACDL fits — and where it doesn't.

-

+

Declare intent; the platform delivers safe production

+

    -
  • 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
  • -
  • Not a permissive delivery highway — no escape hatches to bypass the confidence framework
  • +
  • A merged change progresses without a ticket or thread
  • +
  • A non-technical consumer ships by declaring intent
  • +
  • Every production change is traceable to a human attestation
Internal
How The Platform Works
-

The Contract-Driven Model

-

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.

-

+

ACDL owns infrastructure, not your app

+

    -
  • Which module — a catalog of pre-built, security-reviewed building blocks
  • -
  • Which environment — the platform raises the safety bar automatically as sensitivity rises
  • -
  • Which inputs — infrastructure values that vary per deployment (cpu, memory, port, desired_count)
  • -
  • The consumer provides no AWS account, no VPC, no state backend — the platform owns the blast radius
  • +
  • Upstream is anything — IDE, agentic SDLC, or vibe coding
  • +
  • ACDL is infrastructure only — provisions and governs AWS resources
  • +
  • Not a general-purpose AI — autonomy is narrow, policy-bounded
  • +
  • Not a permissive highway — no escape hatches
Internal
How The Platform Works
-

The End-to-End Flow

-

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.

-

+

One YAML file. The platform owns everything else.

+

    -
  • Security and policy checks run before any infrastructure is created
  • -
  • Every stage produces a record that feeds the confidence signal and the evidence stream — there is no "unchecked" path
  • +
  • Module — pre-built, security-reviewed building blocks
  • +
  • Environmentdev, qa, prod, dr; bar rises with sensitivity
  • +
  • Inputs — cpu, memory, port, desired_count
  • +
  • Consumer provides no AWS account, no VPC, no state backend
Internal
How The Platform Works
-

Zero-Trust by Default

-

Before any infrastructure is created, here's how access is scoped.

-

Consumer repositories hold no long-lived cloud credentials. Ever.

+

Same stages, same checks, every deployment

+

    -
  • Authentication — OIDC federation. Each job mints a short-lived token; no credential is stored in the consumer repo or in a runner secret. Testing (GitHub Actions) Planned: all runners
  • -
  • Authorization — attribute-based (ABAC), not role-based. Two attribute classes scope every action: -
      -
    • Repository identity — the role's trust policy binds to the exact consumer repo + branch
    • -
    • Resource tags — every resource is tagged acdl:owner + acdl:contract; the session policy grants access only to matching tags
    • +
    • Security and policy checks run before any infra is created
    • +
    • Every stage produces a record — no "unchecked" path
    -
  • -
-

The effect: a consumer can only touch the resources it created. Blast radius is contained. One consumer can never affect another.

Internal
How The Platform Works
-

Safety is Computed, Not Assumed

-

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

-

+

No long-lived credentials. Blast radius contained.

+

    -
  • Six weighted inputs — manually tuned, auditable. If a consumer asks "why 0.62?", the platform answers with a per-input breakdown
  • -
  • Per-environment thresholds that rise with sensitivity:
  • +
  • OIDC federation — short-lived token per job, no stored credential Testing (GitHub Actions) Planned: all runners
  • +
  • ABAC, not role-based — repo identity + resource tags scope every action
  • +
  • A consumer can only touch its own tagged resources. One consumer can never affect another.
  • +
+
Internal
+
+
+
How The Platform Works
+

Safety is a measurable signal, not a black box

+

+
    +
  • Six weighted inputs — manually tuned, auditable per-input breakdown Agentic
@@ -423,159 +437,98 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
    -
  • A single critical finding hard-blocks — critical findings are not averaged away
  • -
-
Internal
-
-
-
How The Platform Works
-

Security by Construction

-

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

-
    -
  • Policy checks (Checkov, Wiz, Kyverno) — secrets in plaintext, public ingress, IAM wildcards, required tagging standards — all run before infra is created
  • -
  • Encryption on every resource — at-rest encryption on by default; per-stack customer-managed keys with 90-day rotation, no shared keys across stacks
  • -
  • Deletion protection on by defaultprevent_destroy on unless explicitly disabled via a documented flag
  • -
  • Safe decommission — a 2-step pipeline with two SRE attestation gates and a change-request validated against the CMDB
  • +
  • A single critical finding hard-blocks — not averaged away
Internal
How The Platform Works
-

Accountability & Audit

-

Computed safety handles the gate. But humans still matter — here's how accountability works.

+

Every change traceable to a human attestation

    -
  • Dev is fully autonomous. The confidence signal (≥ 0.50) is the only gate. Testing Agentic
  • -
  • qa, prod, dr require human attestation — the approver reviews the contract, the planned Terraform changes, and the accumulated evidence Planned
  • -
  • QA attests to infrastructure readiness, not application code — the contract, the plan, and the evidence. Application code review is upstream
  • -
  • Separation of duties — the QA approver cannot be the prod approver. The platform blocks on a match. Planned
  • -
  • Every deployment writes a hash-chained evidence event — tampering breaks the chain. RPO = 0 Testing
  • +
  • Dev is fully autonomous — confidence signal is the only gate Testing Agentic
  • +
  • qa, prod, dr require human attestation — contract + plan + evidence Planned
  • +
  • Separation of duties — QA approver ≠ prod approver; platform blocks on a match Planned
  • +
  • Hash-chained evidence event — tampering breaks the chain. RPO = 0 Testing
Internal
How The Platform Works
-

Testing vs. Planned

-

Let's be honest about what works today and what's on the roadmap.

- -

22/22 Verified via lifecycle pipeline + regression gate:

+

The vision realized

    -
  • Contract-driven deploys · Module catalog · Zero-trust OIDC + ABAC
  • -
  • Security + policy checks before infra creation · Confidence signal gating
  • -
  • Hash-chained evidence outbox (RPO = 0) · Encryption by default + per-stack CMKs
  • -
  • Deletion protection + safe decommission · Uptime monitoring
  • -
  • Platform-managed environments · Engine-agnostic core + VCS-agnostic ingestion
  • +
  • Velocity without sacrificing safety — speed in ergonomics, safety in unbypassable gates
  • +
  • Security, observability, compliance as platform defaults — not per-team effort
  • +
  • Auditability as a byproduct, not a project — every change traceable to a human attestation
  • +
  • Blast radius contained by design — OIDC + ABAC, only your own tagged resources
  • +
  • Infrastructure as a utility, not a craft — consume, don't maintain
  • +
  • A path to the citizen developer — same envelope, senior engineer or non-technical Agentic
-

9 planned (production path):

-
    -
  • HITL wiring for qa/prod/dr · All-runner OIDC · Full regulatory ledger
  • -
  • Compliance milestone (GDPR, SOX, SOC2, DORA) · Environment self-service
  • -
  • Dynamic module creation Agentic · Pattern recognition Agentic
  • -
  • Additional engine adapters · Deeper observability bootstrap
  • -
-

22/22 Verified — the v1.11 lifecycle pipeline ran apply→modify→destroy against live AWS, then tore down to zero-cost (D-096). The v1.10 "6 deploy-unverified (IAM drift)" status is closed.

-

Full inventory + phased roadmap in the appendix.

Internal
-
How The Platform Works
- -

The Vision Realized

-

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.
  • -
  • Blast radius contained by design. Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources.
  • -
  • Infrastructure as a utility, not a craft. Teams consume infrastructure, they don't maintain it.
  • -
  • A path to the citizen developer. The same safety envelope that serves a senior engineer will serve a non-technical consumer. Agentic
  • -
-
Internal
-
-
Appendix -

For deep dives — these slides cover details omitted from the main 10.

Contents:

  1. Platform-Managed Environments (detail)
  2. Observability Built In (detail)
  3. +
  4. Security by Construction (the full defaults inventory)
  5. The Road to the North Star (phased roadmap)
  6. Testing vs. Planned (full inventory)
  7. Glossary
  8. -
  9. Operating Model & Cost
  10. -
  11. Verified by Construction
  12. +
  13. Operating Model & Cost (real AWS spend + pre-mortem)
  14. +
  15. Verified by Construction (the v1.11 architecture)
Internal
-
Testing Self-service: planned

Internal
-
A2 — Observability Built In

Monitoring is a platform default, not a per-team project. Testing

    -
  • Uptime monitoring deployed automatically with every stack — a dedicated monitoring instance is provisioned after any module deploy, in a separate state, with a feature flag to disable
  • +
  • Uptime monitoring deployed automatically with every stack — separate state, feature flag to disable
  • Monitored endpoints passed from the deployment's own outputs — no manual endpoint registration
  • Alert channels: Microsoft Teams webhook, email, SMS, and GitHub issues
  • -
  • The uptime URL is published to the developer via a PR comment — they don't hunt for it
  • -
  • Roadmap: deeper observability bootstrap (dashboards, runbooks, on-call bindings) as first-class contract fields Planned
  • +
  • The uptime URL is published to the developer via a PR comment
  • +
  • Roadmap: deeper observability bootstrap (dashboards, runbooks, on-call bindings) Planned
  • +
+
Internal
+
+
+
How The Platform Works
+

A3 — Security by Construction

+

Security defaults that do not require a team to opt in. Checks run on every deployment, normalized to a single schema. Testing

+
    +
  • Policy checks (Checkov, Wiz, Kyverno) — secrets, public ingress, IAM wildcards, required tagging — all run before infra is created
  • +
  • Encryption on every resource — at-rest on by default; per-stack CMKs with 90-day rotation, no shared keys across stacks
  • +
  • Deletion protection on by defaultprevent_destroy on unless explicitly disabled via a documented flag
  • +
  • Safe decommission — a 2-step pipeline with two SRE attestation gates and a change-request validated against the CMDB
Internal
How The Platform Works
-

A3 — The Road to the North Star

+

A4 — The Road to the North Star

Proposed phasing — not formally planned.

Internal
How The Platform Works
-

A4 — Testing vs. Planned (Full Inventory)

+

A5 — Testing vs. Planned (Full Inventory)

22/22 Verified — the v1.11 lifecycle pipeline ran apply→modify→destroy against live AWS for every L1 + L2 module, then tore down to zero-cost (D-096). The v1.10 "6 deploy-unverified (IAM drift)" status is closed (CAP-013 fixed in P67).

@@ -969,49 +896,47 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
How The Platform Works
-

A5 — Glossary

+

A6 — Glossary

@@ -1062,49 +987,47 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
How The Platform Works
-

A6 — Operating Model & Cost

+

A7 — Operating Model & Cost

ACDL runs at zero cloud cost for day-to-day development. AWS spend was measured via Cost Explorer (COST.md, 2026-07-28):

@@ -1134,52 +1057,50 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
    -
  • S3 dominates (98.8%, terraform state bucket) — no compute (ECS/Lambda) ran because v1.0→v1.10 was plan-only for IAM-gated capabilities
  • -
  • Local emulators are the primary tier — the full pipeline runs in-process, no AWS credentials, no Checkov, no DynamoDB. Testing
  • -
  • Live-AWS verification is milestone-scoped, then torn down. The v1.11 lifecycle pipeline ran apply→modify→destroy for every module, then tore down to zero-cost (D-096). The pipeline now defaults to plan-only on every PR; ACDL_LIFECYCLE_MODE=full overrides to apply→destroy for milestone verification (REQ-134, v1.12).
  • +
  • S3 dominates (98.8%, terraform state bucket) — no compute ran because v1.0→v1.10 was plan-only for IAM-gated capabilities
  • +
  • Local emulators are the primary tier — the full pipeline runs in-process, no AWS credentials Testing
  • +
  • Live-AWS verification is milestone-scoped, then torn down. The pipeline now defaults to plan-only on every PR; ACDL_LIFECYCLE_MODE=full overrides to apply→destroy for milestone verification (REQ-134, v1.12).
  • Cost drivers are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents). Any spike > $1/day is an anomaly.
-

Pre-mortem (PRE_MORTEM.md): failure modes were pre-mortemed before the leadership pitch. The v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: a claim outruns the verification that backs it. Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope).

+

Pre-mortem (PRE_MORTEM.md): the v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: a claim outruns the verification that backs it. Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope).

Internal
How The Platform Works
-

A7 — Verified by Construction

-

The v1.11 architecture makes "Verified" a structural property, not a claim.

+

A8 — Verified by Construction

-

Two architectural pillars:

+

Two architectural pillars make "Verified" a structural property, not a claim:

  • The stateless adapter (918 → ~80 lines). The Terraform adapter was a 918-line monolith with 3 constant tables and 39 type-specific branches. It is now a ~80-line stateless assembler: it owns no module content — no resource shape, no nested HCL blocks, no defaults. Each L1 module ships a real terraform/ module dir owning its shape, nested blocks, and defaults. The adapter reads the registry and emits module "x" { source = ... } blocks. A new module is a new terraform dir, not a code change. (The v1.12 P67 fix closed a dedup defect for multi-resource L1s — ecs-service, alb; CAP-013 now Verified.)
  • Pipeline-driven lifecycle testing. A modules-lifecycle pipeline matrix-runs each L1 and L2 module's examples/{simple,complex}.yml contracts through apply→modify→destroy against live AWS. The "test" = the pipeline cell going green. Defaults to plan-only on every PR (fast, no AWS mutation, no cost); ACDL_LIFECYCLE_MODE=full overrides to the real apply→destroy for milestone verification (REQ-134, v1.12). The regression gate (D-091) re-runs all 22 capabilities at milestone completion — 22/22 Verified as of v1.12.
  • diff --git a/docs/presentations/how-the-platform-works.md b/docs/presentations/how-the-platform-works.md index 0369032..0fac2cd 100644 --- a/docs/presentations/how-the-platform-works.md +++ b/docs/presentations/how-the-platform-works.md @@ -2,7 +2,7 @@ > **Subtitle:** Agentic Cloud Delivery Platform > **Audience:** Senior Leadership, CTO, Head of Cloud, Head of Infrastructure, Head of DevOps -> **Length:** ~15 minutes · 10 main + 6 appendix = 16 slides +> **Length:** ~15 minutes · 10 main + 8 appendix = 18 slides > **Purpose:** Sell the platform's value to tech leadership — zero-trust, security, observability, auditability, and the shift from "operators guess" to "the platform computes safety." > **Maturity framing:** "Testing" = works internally, dev pilot-ready. "Planned" = on the roadmap, not yet implemented. "Agentic" = involves AI agents or autonomous decision-making. > **Re-verification (2026-07-29):** Every "Testing" claim in this deck was re-verified in v1.10 Phase 54 (D-093) and again in v1.11 via the pipeline-driven lifecycle tests (P59–P62). The headline E2E (contract → resolver → adapter → terraform init/validate/plan) passes against the live AWS account; the local emulating tier (Phase 53) runs the full E2E with no cloud credentials. **22/22 auto-verifiable capabilities Verified** (CAP-013 fixed in v1.12 P67 — the adapter's multi-resource L1 dedup defect is closed; CAP-017/018 probe bugs fixed). The v1.11 lifecycle pipeline ran apply→modify→destroy against live AWS and was then torn down to zero-cost (D-096). See `.ciagent/CAPABILITY_INVENTORY.md` and `.ciagent/PRE_MORTEM.md`. @@ -19,70 +19,130 @@ --- -## Slide 2 — The Problem & The North Star +## Slide 2 — Four frictions slow every team -Here's the problem we're solving and where we're going. +Most teams can write code; far fewer get the infrastructure right. Delivery scales with the **coordination surface around it**, not the engineering inside it. -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. +```mermaid +flowchart LR + subgraph ROW1 [" "] + direction LR + A["Cognitive load\nauthoring infra correctly"] + B["Operational work\nmerged → running"] + end + subgraph ROW2 [" "] + direction LR + C["Red tape\ntickets, approvals, handoffs"] + D["Scalability\nthroughput without headcount"] + end + A ~~~ B + C ~~~ D + A ~~~ C + B ~~~ D +``` -Four frictions slow every team: +- **Cognitive load** — the long tail of services, inconsistent in security and observability. +- **Operational work** — manual promotion that scales with the system, not the change. +- **Red tape** — tickets and handoffs that scale with the organization. +- **Scalability** — throughput without linearly scaling platform engineers. -- **Cognitive load** — authoring infrastructure correctly; the long tail of services inconsistent in security and observability. -- **Operational work** — promoting a change from "merged" to "running in production." Manual work that **scales with the system, not the change.** -- **Red tape** — tickets, approvals, and handoffs that scale with the organization. A merged change waits in a queue. -- **Scalability without increasing headcount** — throughput scales without linearly scaling platform engineers. - -> Consumers **declare intent**; the platform delivers **safe production deployment** — automatically, safely, with a complete audit trail. - -- A merged change progresses **without a platform engineer joining a thread or approving a ticket.** -- A **non-technical consumer** ships by declaring intent — no workflow, no config file, no infrastructure module. -- Every production change is **traceable to a human attestation and an immutable evidence stream.** - -> **Speaker notes:** Open with the cost of the status quo. Every team that stands up its own pipeline, its own Terraform, its own review checklist is paying a tax that doesn't differentiate the business. The platform absorbs all four frictions — that is the value proposition in one sentence. Land the North Star quote: "declare intent → safe production deployment." The litmus test: if a platform engineer still has to touch a ticket for a dev→qa promotion, we haven't delivered the vision. +> **Speaker notes:** Open with the cost of the status quo. Every team that stands up its own pipeline, its own Terraform, its own review checklist is paying a tax that doesn't differentiate the business. The platform absorbs all four frictions — that is the value proposition in one sentence. --- -## Slide 3 — Where ACDL Sits in Your World +## Slide 3 — Declare intent; the platform delivers safe production -Now that we know the problem, here's where ACDL fits — and where it doesn't. +Consumers **declare intent**; the platform delivers **safe production deployment** — automatically, safely, with a complete audit trail. -- **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. -- **Not a permissive delivery highway** — no escape hatches to bypass the confidence framework or human attestation requirements. +```mermaid +flowchart LR + subgraph TODAY ["Today"] + direction TB + A["Merged change"] + B["Waits in queue"] + C["Ticket + approvals"] + D["Manual promotion"] + A --> B --> C --> D + end + subgraph ACDL ["With ACDL"] + direction TB + E["Declare intent\n(one YAML contract)"] + F["Platform delivers\nsafely, autonomously"] + G["Traceable to\nhuman attestation"] + E --> F --> G + end + TODAY -.before.-> ACDL +``` -> **Speaker notes:** This slide gives leadership the framing they need. The platform is deliberately scoped — it is not trying to be everything. The sovereign boundary means the platform team owns delivery and infrastructure, not the upstream development process. The anti-goals are as important as the goals: they tell leadership what not to expect. +- A merged change progresses **without a platform engineer joining a thread.** +- A **non-technical consumer** ships by declaring intent — no workflow, no config file, no module. +- Every production change is **traceable to a human attestation** and an immutable evidence stream. + +> **Speaker notes:** Land the before/after contrast: today's queue vs. ACDL's autonomous flow. The litmus test: if a platform engineer still has to touch a ticket for a dev→qa promotion, we haven't delivered the vision. The North Star is "declare intent → safe production deployment." --- -## Slide 4 — The Contract-Driven Model +## Slide 4 — ACDL owns infrastructure, not your app + +The platform is deliberately scoped — it is not trying to be everything. + +```mermaid +flowchart LR + subgraph UP ["Upstream — anything"] + direction TB + A["IDE / IDE + AI\n(dev writes contract)"] + B["Agentic SDLC\n(agent writes contract)"] + C["Citizen dev\n(vibe codes → AI agent\n→ contract)"] + end + subgraph ACDL ["ACDL — infrastructure only"] + D["Contract\nvalidated"] + E["Resolve → Plan\nSecurity + Policy checks\nConfidence signal"] + F["Provision\nAWS resources"] + G["Evidence\nhash-chained"] + end + subgraph DOWN ["Downstream"] + H["AWS resources\nrunning"] + I["Consumer pipeline\ndeploys image"] + end + A --> D + B --> D + C --> D + D --> E + E --> F + E --> G + F --> H + H --> I +``` + +- **Upstream is anything** — IDE, agentic SDLC, or vibe coding. ACDL doesn't care how the contract was produced. +- **ACDL is infrastructure only** — it provisions and governs AWS resources. App build/test/deploy is upstream. +- **Not a general-purpose AI** — autonomy is narrow, scoped to delivery, bounded by strict policy. +- **Not a permissive highway** — no escape hatches to bypass the confidence framework. + +> **Speaker notes:** The sovereign boundary means the platform team owns delivery and infrastructure, not the upstream development process. The anti-goals are as important as the goals: they tell leadership what not to expect. + +--- + +## Slide 5 — One YAML file. The platform owns everything else. 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 flowchart LR A["Consumer
    writes a contract"] --> B["Platform resolves,
    compiles, checks,
    deploys, records"] B --> C["Resources running in AWS
    + tamper-evident evidence"] ``` -The contract names three things: - -- **Which module** — a catalog of pre-built, security-reviewed building blocks (a static site, a microservice, a database, and more). -- **Which environment** — `dev`, `qa`, `prod`, or `dr`. The platform raises the safety bar automatically as the environment gets more sensitive. +- **Which module** — a catalog of pre-built, security-reviewed building blocks. +- **Which environment** — `dev`, `qa`, `prod`, or `dr`. The bar rises automatically with sensitivity. - **Which inputs** — infrastructure values that vary per deployment (cpu, memory, port, desired_count). - The consumer provides **no AWS account, no VPC, no state backend** — the platform owns the blast radius. -The consumer does **not** write infrastructure modules, workflow logic, or adapter code. They declare intent; the platform reconciles, provisions, and progresses. - -> **Speaker notes:** Emphasize the asymmetry. The consumer's surface is intentionally tiny — a contract that fits on one screen. The platform's surface is large and opinionated. That asymmetry is what makes "declare intent, not execute operations" concrete. Note that the contract examples now show infrastructure inputs (cpu, memory, desired_count, port) — not a container image. The image is upstream; the platform governs infrastructure. +> **Speaker notes:** Emphasize the asymmetry. The consumer's surface is intentionally tiny — a contract that fits on one screen. The platform's surface is large and opinionated. The contract examples show infrastructure inputs (cpu, memory, desired_count, port) — not a container image. The image is upstream; the platform governs infrastructure. --- -## Slide 5 — The End-to-End Flow - -Once the contract is written, here's what the platform does with it — every time. +## Slide 6 — Same stages, same checks, every deployment Every deployment runs the same stages, in the same order, with the same checks — no team-specific pipelines, no tribal runbooks. @@ -98,107 +158,104 @@ flowchart TD H --> I["Infrastructure apply
    (dev only — higher envs hold for attestation)"] ``` -Two properties matter to leadership: +- **Security and policy checks run *before* any infrastructure is created** — not as a post-deployment audit. +- **Every stage produces a record** that feeds the confidence signal and the evidence stream. No "unchecked" path. -- **Security and policy checks run *before* any infrastructure is created** — not after the fact, not as a post-deployment audit. -- **Every stage produces a record** that feeds the confidence signal and the evidence stream. There is no "unchecked" path. - -> **Speaker notes:** Walk left to right once. Don't dwell on internals — the point is that the flow is fixed, opinionated, and identical for every consumer. The two leadership-relevant beats are (1) checks before creation, (2) every stage is evidenced. The confidence signal (Slide 7) is where the "safety is computed" story lands. +> **Speaker notes:** Walk left to right once. Don't dwell on internals — the point is that the flow is fixed, opinionated, and identical for every consumer. The two leadership-relevant beats: (1) checks before creation, (2) every stage is evidenced. The confidence signal (Slide 8) is where the "safety is computed" story lands. --- -## Slide 6 — Zero-Trust by Default - -Before any infrastructure is created, here's how access is scoped. +## Slide 7 — No long-lived credentials. Blast radius contained. 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.)* -- **Authorization is attribute-based (ABAC), not role-based.** Two attribute classes scope every action: - - **Repository identity** — the role's trust policy binds to the exact consumer repo + branch that invoked the workflow. - - **Resource-creation attributes** — every resource is tagged with `acdl:owner=` and `acdl:contract=`. The session policy grants view/update/delete **only on resources whose tags match the calling repo.** +```mermaid +flowchart LR + A["Consumer repo\n(no credentials)"] + B["OIDC federation\nshort-lived token"] + C["ABAC session policy\nrepo identity + tags"] + D["Tagged resources\nonly"] + A --> B --> C --> D +``` -**The effect:** a consumer's pipeline can only touch the resources it created. Blast radius is contained to that consumer's own stack instances. One consumer can never touch another's resources, and the consumer cannot escape its own scope. +- **Authentication — OIDC federation.** Each job mints a short-lived token; no credential stored in the consumer repo or runner secret. Testing (GitHub Actions) Planned: all runners +- **Authorization — attribute-based (ABAC), not role-based.** Two attribute classes scope every action: + - **Repository identity** — trust policy binds to the exact consumer repo + branch. + - **Resource tags** — every resource tagged `acdl:owner` + `acdl:contract`; session policy grants access **only to matching tags.** +- **The effect:** a consumer can only touch the resources it created. One consumer can never affect another. > **Speaker notes:** This is the slide for the Head of Cloud/Security. The key phrase is "blast radius contained to the consumer's own stack." Contrast with the common failure mode of shared CI roles that can touch any account resource. The static-key override exists for edge cases but is rotated daily on platform runners; it is never the default. --- -## Slide 7 — Safety is Computed, Not Assumed +## Slide 8 — Safety is a measurable signal, not a black box -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 -Every delivery action produces a **measurable, explainable confidence signal** — a weighted sum of observable facts, not a black box. *(Agentic.)* +```mermaid +flowchart LR + P["Policy"] --> S["Score"] + V["Validation"] --> S + F["Freshness"] --> S + Pr["Provenance"] --> S + H["History"] --> S + N["NFRs"] --> S + S --> B["Band + threshold"] +``` -- **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. +- **Six weighted inputs** — policy, validation, freshness, provenance, history, NFRs. Manually tuned, auditable. If a consumer asks "why 0.62?", the platform answers with a per-input breakdown. - **Per-environment thresholds** that rise with sensitivity: -| Environment | Threshold | Who must attest | +| Environment | Threshold | Attester | |---|---|---| -| dev | ≥ 0.50 | No one — fully autonomous *(Testing)* | -| qa | ≥ 0.75 | QA *(Planned)* | -| prod | ≥ 0.90 | SRE *(Planned)* | -| dr | ≥ 0.95 | SRE + a disaster-recovery drill reference *(Planned)* | +| dev | ≥ 0.50 | No one — autonomous Testing | +| qa | ≥ 0.75 | QA Planned | +| prod | ≥ 0.90 | SRE Planned | -- **A single critical policy finding hard-blocks the deployment**, regardless of every other input. Critical findings are not averaged away. -- **When the platform halts, it gives a measured reason** — a policy violation, an insufficient signal, a missing attestation — never an opaque, manual-debugging exercise. +- **A single critical finding hard-blocks** — critical findings are not averaged away. -> **Speaker notes:** This is the bet that separates this platform from "yet another CI/CD tool." Reliance on operator instinct or tenure is not a substitute. The signal is auditable; the thresholds are tunable by Infra & Ops + SRE jointly, and any override is itself a confidence-event in the audit stream. Leadership cares about this because it makes promotion decisions *reviewable*. The new confidence signal diagram makes the six inputs and the per-input breakdown visible — emphasize that the weights are manually tuned and the breakdown is auditable, not a black box. +> **Speaker notes:** This is the bet that separates this platform from "yet another CI/CD tool." Reliance on operator instinct or tenure is not a substitute. The signal is auditable; the thresholds are tunable by Infra & Ops + SRE jointly, and any override is itself a confidence-event in the audit stream. Leadership cares because it makes promotion decisions *reviewable*. --- -## Slide 8 — Security by Construction +## Slide 9 — Every change traceable to a human attestation -Beyond the confidence signal, security defaults are on by construction — not by opt-in. +Computed safety handles the gate. Humans still matter — here's how accountability works. -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.)* +```mermaid +flowchart LR + subgraph DEV ["dev — autonomous"] + D1["Confidence ≥ 0.50\n→ apply"] + end + subgraph GATED ["qa / prod / dr — gated"] + G1["Confidence ≥ threshold"] + G2["Human attestation\nreviews contract\n+ plan + evidence"] + G3["Separation of duties\nQA ≠ prod approver"] + G1 --> G2 --> G3 + end + DEV --> OUT["Hash-chained\nevidence event\n(RPO = 0)"] + GATED --> OUT +``` -- **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. -- **Cloud security posture** (Wiz adapter) — translates cloud security findings into the same normalized record. *(Adapter testing; activates when a Wiz tenant is configured.)* -- **Kubernetes-native policy** (Kyverno adapter) — ready for the GitOps reconciler roadmap item. *(Adapter testing; inactive for Terraform-only stacks.)* -- **Encryption on every resource** — at-rest encryption is on by default for every primitive (S3, RDS, ECR, ECS, and more). *(Testing.)* -- **Per-stack customer-managed keys (CMKs)** — one key per deployment, 90-day rotation at creation, **no shared keys across stacks.** *(Testing.)* -- **Managed-key fallback with a loud warning** — standalone primitives fall back to cloud-managed keys only when no CMK is provided, and the platform warns explicitly. *(Testing.)* -- **Deletion protection on by default** — every resource has `prevent_destroy` on unless a consumer explicitly disables it via a documented feature flag. *(Testing.)* -- **Safe decommission** — a 2-step pipeline (disable protection → zero counts → destroy) with **two SRE human-attestation gates** and a **change-request validated against the platform CMDB** before any destructive action. *(Testing.)* Encryption keys enter a grace window (default 30 days) so encrypted data remains recoverable during decommission. +- **Dev is fully autonomous.** The confidence signal (≥ 0.50) is the only gate. Testing Agentic +- **qa, prod, dr require human attestation** — the approver reviews contract, planned Terraform, and accumulated evidence. Planned +- **Separation of duties is enforced** — the QA approver **cannot** be the prod approver. The platform **blocks on a match.** Planned +- **Every deployment writes a hash-chained evidence event** — tampering breaks the chain. **RPO = 0.** Testing -> **Speaker notes:** The phrase to land is "secure by default, not secure by effort." The selling point is *normalization* — we can add a new security tool without changing the confidence model or the evidence stream. For the Head of Security: tagging standards are enforced, not advisory — a missing `acdl:owner` tag fails the check, not a warning. The decommission flow is the counter-argument to "deletion protection makes cleanup impossible" — it's a deliberate, gated, two-approval path, not a lock with no key. +> **Speaker notes:** The "lower environments autonomous, higher environments attested" tenet is the resolution to the classic "move fast vs. be safe" false dichotomy. Be honest: the separation-of-duties *mechanism* is designed and the dev path is wired; qa/prod/dr wiring is on the roadmap. The audit trail is a byproduct of deployment, not a project. The full regulatory ledger (S3 Object Lock, JWS signatures, daily checkpoints) is planned; what ships today is the outbox + hash chain that makes every event tamper-evident and queryable. --- -## Slide 9 — Accountability & Audit +## Slide 10 — The vision realized -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).** -- **Separation of duties is enforced** *(Planned)* — the person who approved the qa promotion **cannot** be the person who approves the prod promotion. The platform reads both identities from the outbox and **blocks** on a match, emitting a `SEPARATION_OF_DUTIES_VIOLATION` and routing a halt artifact to SRE on-call. -- **Timeout discipline** — 1 business day = warn + escalate; 2 business days = auto-freeze + re-submit. Rejection extends the audit chain; it does not tear it up. - -Version control is a **coordination tool, not an evidentiary fortress.** True compliance requires an immutable, externally-stored ledger. - -- **Every deployment writes a hash-chained evidence event** — each event links to the previous via a cryptographic hash. Tampering breaks the chain. *(Testing — the DynamoDB outbox.)* -- **Tiered storage design:** cold, tamper-proof source of truth (S3 Object Lock, compliance mode, 7-year retention) + a hot query index for fast lookup. *(Outbox tested; S3 Object Lock + JWS detached signatures are planned regulatory-ledger build-out.)* -- **RPO = 0** — the evidence write is synchronous; a deployment is not acknowledged until the evidence event is durably recorded. -- **Every production change is traceable to a human attestation** — the QA and prod approver identities are the only durable record outside the VCS's audit log, stored in the outbox keyed by contract. - -> **Speaker notes:** The "lower environments autonomous, higher environments attested" tenet is the resolution to the classic "move fast vs. be safe" false dichotomy. Be honest: the separation-of-duties *mechanism* (CODEOWNERS routing, identity-distinctness check, the 8-concern attestation matrix) is designed and the dev path is wired; the qa/prod/dr wiring is on the roadmap. The new attestation flow diagram makes the human-in-the-loop path visible. Note the QA clarification: QA attests to infrastructure readiness — the contract, the plan, and the evidence — not application code. The audit trail is a byproduct of deployment, not a project. Note honestly that the full regulatory ledger (S3 Object Lock, JWS signatures, daily checkpoints) is planned; what ships today is the outbox + hash chain that makes every event tamper-evident and queryable. Badge reclassification: separation of duties = Planned (not "design tested"), dev autonomous = Testing, qa/prod/dr attestation = Planned. - ---- - -## Slide 10 — The Vision Realized - -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. +- **Velocity without sacrificing safety.** Speed is in the ergonomics; 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. - **Blast radius contained by design.** Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources. - **Infrastructure as a utility, not a craft.** Teams consume infrastructure, they don't maintain it. -- **A path to the citizen developer.** The same safety envelope that serves a senior engineer will serve a non-technical consumer. *(Agentic.)* +- **A path to the citizen developer.** The same safety envelope serves a senior engineer and a non-technical consumer. Agentic -> **Speaker notes:** Close on the strategic frame. The platform is not "a CI/CD tool," it's the organizational lever for shipping safely at the pace the business demands. The investment is in the abstraction, not the tool. Ship safely at the pace the business demands, with the security and audit posture the regulators require. +> **Speaker notes:** Close on the strategic frame. The platform is not "a CI/CD tool" — it's the organizational lever for shipping safely at the pace the business demands, with the security and audit posture the regulators require. The investment is in the abstraction, not the tool. --- @@ -210,11 +267,12 @@ For deep dives — these slides cover details omitted from the main 10. 1. Platform-Managed Environments (detail) 2. Observability Built In (detail) -3. The Road to the North Star (phased roadmap) -4. Testing vs. Planned (full inventory) -5. Glossary -6. Operating Model & Cost (real AWS spend + pre-mortem) -7. Verified by Construction — the v1.11 architecture (stateless adapter + lifecycle pipeline) +3. Security by Construction (the full defaults inventory) +4. The Road to the North Star (phased roadmap) +5. Testing vs. Planned (full inventory) +6. Glossary +7. Operating Model & Cost (real AWS spend + pre-mortem) +8. Verified by Construction (the v1.11 architecture) > **Speaker notes:** These are deep-dive slides for follow-up questions. Don't walk them in the main 15-minute talk — pull them up when an audience member wants detail on a specific topic. @@ -253,13 +311,30 @@ Monitoring is **a platform default, not a per-team project.** *(Testing.)* --- -## A3 — The Road to the North Star +## A3 — Security by Construction + +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. +- **Cloud security posture** (Wiz adapter) — translates cloud security findings into the same normalized record. *(Adapter testing; activates when a Wiz tenant is configured.)* +- **Kubernetes-native policy** (Kyverno adapter) — ready for the GitOps reconciler roadmap item. *(Adapter testing; inactive for Terraform-only stacks.)* +- **Encryption on every resource** — at-rest encryption is on by default for every primitive (S3, RDS, ECR, ECS, and more). *(Testing.)* +- **Per-stack customer-managed keys (CMKs)** — one key per deployment, 90-day rotation at creation, **no shared keys across stacks.** *(Testing.)* +- **Managed-key fallback with a loud warning** — standalone primitives fall back to cloud-managed keys only when no CMK is provided, and the platform warns explicitly. *(Testing.)* +- **Deletion protection on by default** — every resource has `prevent_destroy` on unless a consumer explicitly disables it via a documented feature flag. *(Testing.)* +- **Safe decommission** — a 2-step pipeline (disable protection → zero counts → destroy) with **two SRE human-attestation gates** and a **change-request validated against the platform CMDB** before any destructive action. *(Testing.)* Encryption keys enter a grace window (default 30 days) so encrypted data remains recoverable during decommission. + +> **Speaker notes:** The phrase to land is "secure by default, not secure by effort." The selling point is *normalization* — we can add a new security tool without changing the confidence model or the evidence stream. For the Head of Security: tagging standards are enforced, not advisory — a missing `acdl:owner` tag fails the check, not a warning. The decommission flow is the counter-argument to "deletion protection makes cleanup impossible" — it's a deliberate, gated, two-approval path, not a lock with no key. + +--- + +## A4 — The Road to the North Star *Proposed phasing — not formally planned.* A phased roadmap from the current Testing baseline to the full North Star: -- **Phase 1 — Testing baseline (current, v1.12):** contract-driven deploys, zero-trust OIDC + ABAC on GitHub Actions, confidence signal gating, hash-chained evidence, encryption by default, deletion protection + safe decommission, uptime monitoring, platform-managed environments. **22/22 capabilities Verified** via the v1.11 lifecycle pipeline (apply→modify→destroy against live AWS, then torn down to zero-cost). The stateless adapter + lifecycle pipeline are the structural verification (see A7). +- **Phase 1 — Testing baseline (current, v1.12):** contract-driven deploys, zero-trust OIDC + ABAC on GitHub Actions, confidence signal gating, hash-chained evidence, encryption by default, deletion protection + safe decommission, uptime monitoring, platform-managed environments. **22/22 capabilities Verified** via the v1.11 lifecycle pipeline (apply→modify→destroy against live AWS, then torn down to zero-cost). The stateless adapter + lifecycle pipeline are the structural verification (see A8). - **Phase 2 — Production readiness:** HITL wiring for qa/prod/dr, all-runner OIDC, full regulatory ledger (S3 Object Lock + JWS signatures + daily checkpoints), environment self-service. - **Phase 3 — Compliance & expansion:** compliance milestone (GDPR, SOX, SOC2, DORA extension points), additional engine adapters (OpenTofu, Pulumi, Kubernetes CRDs), deeper observability bootstrap. - **Phase 4 — Agentic frontier:** dynamic module creation from a contract (the agentic citizen-developer composition mechanism), pattern recognition that compounds value over time. @@ -268,7 +343,7 @@ A phased roadmap from the current Testing baseline to the full North Star: --- -## A4 — Testing vs. Planned (Full Inventory) +## A5 — Testing vs. Planned (Full Inventory) > **Verification status (v1.12, 2026-07-29):** 22/22 auto-verifiable capabilities **Verified** — the v1.11 lifecycle pipeline ran apply→modify→destroy against live AWS for every L1 + L2 module, then tore down to zero-cost (D-096). The v1.10 "6 deploy-unverified (IAM drift)" status is closed (CAP-013 fixed in P67). See `CAPABILITY_INVENTORY.md`. @@ -302,7 +377,7 @@ A phased roadmap from the current Testing baseline to the full North Star: --- -## A5 — Glossary +## A6 — Glossary | Term | Meaning | |---|---| @@ -320,7 +395,7 @@ A phased roadmap from the current Testing baseline to the full North Star: --- -## A6 — Operating Model & Cost (real AWS spend + pre-mortem) +## A7 — Operating Model & Cost (real AWS spend + pre-mortem) ACDL runs at **zero cloud cost** for day-to-day development. The v1.0→v1.10 AWS spend was measured directly via Cost Explorer (`COST.md`, 2026-07-28): @@ -342,7 +417,7 @@ ACDL runs at **zero cloud cost** for day-to-day development. The v1.0→v1.10 AW --- -## A7 — Verified by Construction (the v1.11 architecture) +## A8 — Verified by Construction (the v1.11 architecture) v1.11 rebuilt the platform on two architectural pillars that make "Verified" a structural property, not a claim: diff --git a/docs/presentations/the-developer-experience-marp.md b/docs/presentations/the-developer-experience-marp.md index 2165e6b..e169ca8 100644 --- a/docs/presentations/the-developer-experience-marp.md +++ b/docs/presentations/the-developer-experience-marp.md @@ -8,23 +8,22 @@ footer: "Internal" style: | section { font-family: "Akkurat Pro", "Helvetica Neue", "Arial", sans-serif; - font-size: 22px; + font-size: 26px; color: #1B1B1B; } - h1 { color: #D6002A; font-size: 34px; margin-bottom: 0.3em; } - h2 { color: #D6002A; font-size: 26px; margin-bottom: 0.2em; } + h1 { color: #D6002A; font-size: 40px; margin-bottom: 0.3em; } + h2 { color: #D6002A; font-size: 32px; 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%; } + table { font-size: 22px; 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; } + blockquote { border-left: 4px solid #D6002A; color: #2E2E2E; font-size: 24px; } + pre { font-size: 16px; line-height: 1.3; } + code { font-size: 16px; } img { display: block; margin: 0 auto; max-height: 280px; } - em.story { color: #6B7280; font-size: 16px; font-style: italic; } .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; - font-size: 14px; font-weight: 600; + font-size: 16px; font-weight: 600; } .testing { background: #DBEAFE; color: #1E3A5F; } .planned { background: #fef3c7; color: #78350f; } @@ -45,24 +44,18 @@ section.title h3 { color: #F0F0F0; font-weight: 400; font-size: 22px; margin-top --- -# Where Agentic Cloud Delivery (ACDL) Sits in Your World - -Here's who uses the platform and where the boundary is. +# Two consumer paths, one safety envelope ![w:1100](assets/png/developer-experience-01b-scope-boundary.png) - **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 -- **Upstream is anything** — your IDE, an agentic SDLC, or vibe coding on a laptop. ACDL doesn't care how the contract was produced -- **ACDL is infrastructure only** — it provisions and governs AWS resources. Application deployment is upstream +- **Citizen developer** — declares intent; an AI agent produces a contract that passes the **same** safety envelope Agentic +- **Upstream is anything** — IDE, agentic SDLC, or vibe coding. ACDL doesn't care how the contract was produced +- **ACDL is infrastructure only** — provisions and governs AWS resources. Application deployment is upstream --- -# The Contract — The Entire Consumer Surface - -Now let's look at what a consumer actually writes — it's tiny. - -Three things. That is the entire consumer-side surface. +# Three things. The entire consumer surface. @@ -84,42 +77,84 @@ infrastructure: ``` - **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 does **not**: write modules, clone the platform repo, hold cloud credentials, or maintain a state backend --- -# The Developer Feedback Loop +# See what the platform does, in real time -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 -- **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 +- **Streamed output by default** — the plan, policy results, and each check record flow to stdout +- **PR comments after every successful pipeline stage** — always know where you stand +- **Clear, explainable halt reasons** — a policy violation, an insufficient signal, or a missing attestation. **Never opaque.** +- **Connection strings posted as PR comments** — human-readable, no hunting. Runtime secrets go to encrypted Parameter Store, never to logs +- **Errors become GitHub issues, automatically** — a failed deploy opens an issue on the platform repo Testing --- -# Versioned, Predictable Releases +# Pick from pre-built, security-reviewed blocks -You control when you absorb platform improvements — no surprise upgrades. +![w:1100](assets/png/developer-experience-05-catalog.png) -Consumers control **when** they absorb platform improvements. Testing +- **Primitives** — single-purpose resources (S3, VPC, ECS, IAM, ALB, ECR, CloudFront, WAF, RDS) +- **Modules** — composed patterns (static site with CDN + WAF; microservice with VPC + ECS + ALB + ECR) +- **Validated examples per module** — `simple.yaml` + `complex.yaml`, validated against the contract schema in CI +- **Auto-promotion of patterns** — after 3 observed usages Planned Agentic -- **Floating MAJOR + MINOR tags** (e.g. `@v1.12`) — a consumer automatically receives patch updates within the line +--- + +# The bar rises automatically with sensitivity + +![w:1000](assets/png/developer-experience-04-promotion-journey.png) + +| Environment | What the platform adds | Maturity | +|---|---|---| +| dev | Confidence ≥ 0.50, fully autonomous | Testing | +| qa | QA human attestation + confidence ≥ 0.75 | Planned | +| prod | SRE human attestation + confidence ≥ 0.90 | Planned | +| dr | SRE human attestation + confidence ≥ 0.95 + DR drill | Planned | + +- **No staging environment** — dev is the only autonomous environment +- **Separation of duties** — the QA approver cannot be the prod approver + +--- + +# Tearing down is as gated as deploying + +![w:1100](assets/png/developer-experience-07-decommission.png) + + + +```yaml +uses: acdl/.github/workflows/deploy.yml@v1.12 +with: + contract: .acdl/contract.yml + mode: decommission + changeRequestId: "CHG0678912" +``` + +- **Validate the change request** — platform queries the CMDB; CR must be `approved` and match the consumer repo +- **Two SRE human-attestation gates** — disable protection → SRE approves → zero counts + destroy → second SRE approves +- **Per-stack encryption key enters a grace window** (default 30 days) so encrypted data remains recoverable Testing + +--- + +# You control when you absorb improvements + +![w:1100](assets/png/developer-experience-08-semver.png) + +- **Floating MAJOR + MINOR tags** (e.g. `@v1.12`) — automatically receive 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 +- **Pin to an exact version** for stability, or float on MAJOR only (`@v1`) to absorb new features on your 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 +- **Automated release job** computes the next semver on merge to main, creates the tag, and updates floating tags Testing --- -# Friendly Onboarding - -First impressions matter — the platform fails gracefully, not opaquely. +# Fails gracefully, not opaquely First impressions of a platform are made **when it fails for the first time.** The platform fails gracefully. Testing @@ -136,111 +171,18 @@ The pipeline then **exits without attempting a deployment** — no partial state --- -# Safe Promotion Path - -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. - -![w:1000](assets/png/developer-experience-04-promotion-journey.png) - - - - - - -
    - -**Approach A — One contract, one job per environment.** Environment passed by each job. - -```yaml -jobs: - dev: - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract.yml, environment: dev } - qa: - needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract.yml, environment: qa } -``` - - - -**Approach B — Environment-specific contracts.** When inputs differ per environment. - -```yaml -jobs: - dev: - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract-dev.yaml } - qa: - needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract-qa.yaml } -``` - -
    - - - ---- - -# Safe Decommission - -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.12 -with: - contract: .acdl/contract.yml - mode: decommission - changeRequestId: "CHG0678912" -``` - -A 2-step pipeline with **two SRE human-attestation gates**: - -1. **Validate the change request** — the platform queries the CMDB; the CR must be `approved` and match the consumer repo -2. **Disable deletion protection** → **SRE approves** → **Zero all counts + destroy** → **a second SRE approves** - -The per-stack encryption key enters a **grace window** (default 30 days) so encrypted data remains recoverable. - ---- - -# Self-Service Module Catalog - -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 -- **Modules** — composed patterns (a static site with CDN + WAF; a microservice with VPC + ECS + load balancer + registry) -- **Validated examples per module** — `simple.yaml` + `complex.yaml` + variation files, validated against the contract schema in CI. Examples cannot drift from the schema silently -- **Auto-promotion of patterns** — auto-promoted to the catalog after 3 observed usages Planned Agentic -- **Compliance extension points** — each module lists where GDPR, SOX, SOC2, DORA controls will wire in Planned - ---- - -# The Desired Outcomes +# The desired outcomes -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. -- **Auditability as a byproduct, not a project.** Every production change is traceable to a human attestation and a tamper-evident evidence event. -- **Blast radius contained by design.** Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources. -- **The bottleneck moves off the platform team's ticket queue.** A merged change progresses through lower environments without a platform engineer joining a thread. -- **Infrastructure as a utility, not a craft.** Teams consume infrastructure, they don't maintain it — and the platform compounds value over time by learning from recurring patterns. -- **A path to the citizen developer.** The same safety envelope that serves a senior engineer will serve a non-technical consumer. Agentic +- **Velocity without sacrificing safety** — speed in ergonomics, safety in unbypassable gates +- **Security, observability, compliance as platform defaults** — not per-team effort, not post-hoc remediation +- **Auditability as a byproduct, not a project** — every change traceable to a human attestation and a tamper-evident evidence event +- **Blast radius contained by design** — OIDC + ABAC, only your own tagged resources +- **The bottleneck moves off the platform team's ticket queue** — a merged change progresses without a platform engineer joining a thread +- **Infrastructure as a utility, not a craft** — consume, don't maintain +- **A path to the citizen developer** — same envelope, senior engineer or non-technical Agentic --- @@ -249,8 +191,6 @@ Developers pick from **pre-built, security-reviewed building blocks.** For deep dives — these slides cover details omitted from the main 10. - **Contents:** 1. The Citizen Developer Experience (full) @@ -328,15 +268,14 @@ The entire CI pipeline runs **from the shell**, not just in CI. Testing -- **Live-AWS verification is milestone-scoped, then torn down.** The v1.11 lifecycle pipeline ran apply→modify→destroy for every module, then tore down to zero-cost (D-096). The pipeline now **defaults to plan-only** on every PR; `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12). +- **Local emulators are the primary tier** — the full pipeline runs in-process, no AWS credentials Testing +- **Live-AWS verification is milestone-scoped, then torn down.** The pipeline now **defaults to plan-only** on every PR; `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12). - **Cost drivers** are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents). No running infrastructure between milestones. -**Pre-mortem (`PRE_MORTEM.md`):** failure modes were pre-mortemed before the leadership pitch. The v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: *a claim outruns the verification that backs it.* Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope). +**Pre-mortem (`PRE_MORTEM.md`):** the v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: *a claim outruns the verification that backs it.* Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope). --- @@ -362,13 +300,11 @@ ACDL runs at **zero cloud cost** for day-to-day development. AWS spend was measu # A7 — Verified by Construction -The v1.11 architecture makes "Verified" a structural property, not a claim. - -Two architectural pillars: +Two architectural pillars make "Verified" a structural property, not a claim: - **The stateless adapter (918 → ~80 lines).** The Terraform adapter was a 918-line monolith with 3 constant tables and 39 type-specific branches. It is now a ~80-line **stateless assembler**: it owns no module content — no resource shape, no nested HCL blocks, no defaults. Each L1 module ships a real `terraform/` module dir owning its shape, nested blocks, and defaults. The adapter reads the registry and emits `module "x" { source = ... }` blocks. A new module is a new terraform dir, not a code change. *(The v1.12 P67 fix closed a dedup defect for multi-resource L1s — ecs-service, alb; CAP-013 now Verified.)* - **Pipeline-driven lifecycle testing.** A `modules-lifecycle` pipeline matrix-runs each L1 and L2 module's contracts through apply→modify→destroy against live AWS. **The "test" = the pipeline cell going green.** Defaults to **plan-only** on every PR (fast, no AWS mutation, no cost); `ACDL_LIFECYCLE_MODE=full` overrides to the real apply→destroy for milestone verification (REQ-134, v1.12). The regression gate (D-091) re-runs all 22 capabilities at milestone completion — **22/22 Verified** as of v1.12. diff --git a/docs/presentations/the-developer-experience-talking-points.md b/docs/presentations/the-developer-experience-talking-points.md index 8af5b7b..2917819 100644 --- a/docs/presentations/the-developer-experience-talking-points.md +++ b/docs/presentations/the-developer-experience-talking-points.md @@ -18,7 +18,7 @@ --- -## Slide 2 — Where ACDL Sits in Your World +## Slide 2 — Two consumer paths, one safety envelope **Talking points:** - This is the scope-boundary slide — here's who uses the platform, and here's where ACDL's responsibility starts and stops @@ -31,7 +31,7 @@ --- -## Slide 3 — The Contract — The Entire Consumer Surface +## Slide 3 — Three things. The entire consumer surface. **Talking points:** - Hold this slide — the audience should sit with how small the consumer surface is. Three things: app code, a contract, a one-line CI definition @@ -44,7 +44,7 @@ --- -## Slide 4 — The Developer Feedback Loop +## Slide 4 — See what the platform does, in real time **Talking points:** - This directly answers "but developers hate platforms that hide what they're doing" — the platform is opinionated about *what* runs, not *opaque* about *that* it runs @@ -58,177 +58,174 @@ --- -## Slide 5 — Versioned, Predictable Releases - -**Talking points:** -- This is the "no surprise upgrades" story — consumers aren't forced to chase the platform, and the platform isn't forced to support N forks of every workflow -- Floating MAJOR + MINOR tags (e.g. `@v1.12`) — a consumer automatically receives patch updates within the line. Pin to exact version for stability, or float on MAJOR only for new features -- Semantic versioning with a clear contract: interface → MAJOR, behavior → MINOR, lifecycle → PATCH -- Unversioned references (`@main`, bare) are discouraged — the versioned tag is the only immutability lever a consumer has -- The automated release job computes the next semver on merge to main, creates the tag, and updates the floating tags — no manual release process - -**Key takeaway:** Consumers control when they absorb platform improvements. No surprise upgrades. - ---- - -## Slide 6 — Friendly Onboarding - -**Talking points:** -- This looks like a small thing; it's actually a cultural one — the platform's posture is "help me get started," not "you should have known" -- First impressions of a platform are made when it fails for the first time. The platform fails gracefully with a guided prompt, not an opaque error -- The prompt tells the consumer: what's missing, what the platform will provision, the expected turnaround, and how to request an environment -- The pipeline exits without attempting a deployment — no partial state, no confusing errors -- Be honest: the citizen developer onboarding path is planned, not yet shipped - -**Key takeaway:** The platform fails gracefully. First impressions drive adoption — platforms that fail opaquely get routed around. - ---- - -## Slide 7 — Safe Promotion Path - -**Talking points:** -- Promotion is a workflow choice, not a contract mutation — this matters because it means a promotion can be reviewed as a *diff in the workflow*, not as a rewritten contract -- The promotion journey diagram shows the rising bar: dev (autonomous) → qa (QA attests) → prod (SRE attests) → dr (SRE attests + DR drill) -- Approach A (one contract, environment passed by the job) keeps the single source of truth — the contract never changes -- Approach B (environment-specific contracts) lets teams whose inputs genuinely vary keep that variation explicit and reviewable -- The rising bar is annotated with maturity: **dev = Testing** (works internally, pilot-ready); **qa/prod/dr = Planned** (on the roadmap). Be honest about that split -- Separation of duties is enforced — the QA approver cannot be the prod approver. No staging environment — the design deliberately removes the "staging is basically prod but not really" anti-pattern - -**Key takeaway:** Change the environment field, not the contract. The platform raises the bar automatically. The consumer can't bypass the gates. - ---- - -## Slide 8 — Safe Decommission - -**Talking points:** -- The counter-argument to "deletion protection makes cleanup impossible" — decommission is a first-class, gated, two-approval flow, not a lock with no key -- The change request must be `approved` in the CMDB and match the consumer repo — no CR, no decommission -- Two SRE human-attestation gates: one to disable deletion protection, a second to zero counts and destroy -- The per-stack encryption key enters a 30-day grace window so encrypted data remains recoverable — the key is permanently deleted only after the window expires -- For the Head of Infrastructure: the CMDB validation means decommission is auditable, not just possible - -**Key takeaway:** Tearing down is as gated as deploying. Two SRE approvals, CMDB-validated change request, 30-day key grace window. - ---- - -## Slide 9 — Self-Service Module Catalog +## Slide 5 — Pick from pre-built, security-reviewed blocks **Talking points:** - The catalog is what makes "declare intent" practical — you can only declare a module that exists -- Primitives are single-purpose resources (S3, VPC, ECS, IAM, ALB, ECR, CloudFront, WAF, RDS) — each with documented inputs/outputs, usage, compliance extension points, and versioning -- Modules are composed patterns (a static site with CDN + WAF; a microservice with VPC + ECS + ALB + registry) — one well-reviewed module serves every consumer -- Validated examples per module — `simple.yaml` + `complex.yaml` + variation files, validated against the contract schema in CI. Examples cannot drift from the schema silently -- For leadership: the catalog is the leverage — a fix to a module serves every consumer on the next run. This is the compounding asset -- Auto-promotion of patterns (after 3 observed usages) and compliance extension points (GDPR, SOX, SOC2, DORA) are planned +- For leadership: the catalog is the leverage. One well-reviewed module serves every consumer; a fix to the module serves every consumer on the next run. This is the compounding asset +- Primitives are single-purpose resources (S3, VPC, ECS, IAM, ALB, ECR, CloudFront, WAF, RDS) — each with documented inputs/outputs and versioning +- Modules are composed patterns — a static site with CDN + WAF; a microservice with VPC + ECS + ALB + ECR +- Validated examples per module (`simple.yaml` + `complex.yaml`) are validated against the contract schema in CI — examples cannot drift from the schema silently +- Auto-promotion of patterns (after 3 observed usages) and compliance extension points (GDPR, SOX, SOC2, DORA) are on the roadmap -**Key takeaway:** The catalog is the compounding asset. One well-reviewed module serves every consumer. A fix serves everyone on the next run. +**Key takeaway:** You don't author infrastructure — you pick from pre-built, security-reviewed building blocks. The catalog is the compounding asset. --- -## Slide 10 — The Desired Outcomes +## Slide 6 — The bar rises automatically with sensitivity **Talking points:** -- Close on the strategic frame — the platform is not "a CI/CD tool," it's the organizational lever for shipping safely at the pace the business demands -- 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. Encryption, deletion protection, uptime monitoring, policy checks, and evidence are on by construction +- Promotion is a workflow choice, not a contract edit — a promotion can be reviewed as a *diff in the workflow*, not as a rewritten contract +- The DX win: the contract stays stable across environments; the safety win: the platform raises the threshold and attestation bar automatically based on the target environment +- The consumer can't bypass the gates — they pick *which* environment to target, and the platform applies the right bar +- No staging environment — the design deliberately removes the "staging is basically prod but not really" anti-pattern. Dev is the only autonomous environment +- Separation of duties is enforced — the QA approver cannot be the prod approver +- Be honest about maturity: dev is tested and pilot-ready; qa/prod/dr wiring is planned + +**Key takeaway:** The bar rises automatically with sensitivity. The consumer picks the environment; the platform applies the right gate. + +--- + +## Slide 7 — Tearing down is as gated as deploying + +**Talking points:** +- The counter-argument to "deletion protection makes cleanup impossible" is this slide. Decommission is a first-class, gated, two-approval flow — not a lock with no key, and not an ungated `terraform destroy` +- The CMDB validation means decommission is auditable, not just possible — the platform queries the CMDB and asserts the CR is `approved` and matches the consumer repo +- Two SRE human-attestation gates: disable protection → SRE approves → zero all counts + destroy → a second SRE approves +- The per-stack encryption key enters a grace window (default 30 days) so encrypted data remains recoverable during decommission +- For the Head of Infrastructure: this is what makes deletion protection safe to ship by default — cleanup is a deliberate, gated path, not an impossible one + +**Key takeaway:** Tearing down is as deliberate as deploying — two SRE attestation gates + CMDB-validated change request. + +--- + +## Slide 8 — You control when you absorb improvements + +**Talking points:** +- This is the "no surprise upgrades" story. Leadership hears two things: (1) consumers aren't forced to chase the platform, (2) the platform isn't forced to support N forks of every workflow +- Floating MAJOR + MINOR tags (e.g. `@v1.12`) — 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 +- The automated release job computes the next semver on merge to main, creates the tag, and updates the floating tags + +**Key takeaway:** You control when you absorb platform improvements — no surprise upgrades, no forced forks. + +--- + +## Slide 9 — Fails gracefully, not opaquely + +**Talking points:** +- This looks like a small thing; it's actually a cultural one. The platform's posture is "help me get started," not "you should have known" +- For the Head of DevOps: this is what drives adoption. Platforms that fail opaquely on first run get routed around +- When no environment is bound, the platform emits a user-friendly onboarding prompt — not an opaque failure +- The prompt tells the consumer: no environment bound, what the platform will provision, expected turnaround, how to request an environment +- The pipeline then exits without attempting a deployment — no partial state, no confusing errors +- The citizen developer onboarding path is planned + +**Key takeaway:** The platform fails gracefully, not opaquely — first impressions are made when it fails for the first time. + +--- + +## Slide 10 — The desired outcomes + +**Talking points:** +- Close on the strategic frame. The platform is not "a CI/CD tool" — it is the organizational lever for shipping safely at the pace the business demands, with the security and audit posture the regulators require +- 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 - The bottleneck moves off the platform team's ticket queue — a merged change progresses through lower environments without a platform engineer joining a thread -- Infrastructure as a utility, not a craft — teams consume, they don't maintain. The platform compounds value over time by learning from recurring patterns -- The path to the citizen developer — the same safety envelope that serves a senior engineer will serve a non-technical consumer. Expanding who can ship safely without lowering the bar +- A path to the citizen developer: the same safety envelope serves a senior engineer and a non-technical consumer +- Invite questions; the companion deck ("How the Platform Works") covers the internal mechanics in more depth -**Key takeaway:** Velocity without sacrificing safety. Security and auditability as byproducts. The bottleneck moves off the platform team's queue. +**Key takeaway:** Ship safely at the pace the business demands, with the security and audit posture the regulators require. --- -## Appendix — Contents +## Appendix TOC — Appendix **Talking points:** -- These are backup slides for Q&A — don't walk through them in the main talk unless time permits -- Use A1 when asked about the citizen developer detail; A2 for the no-cloning mechanism; A3 for local reproducibility; A4 for the roadmap; A5 for term definitions -- The appendix now has 7 slides (A1–A7), including two new ones: A6 (Operating Model & Cost with real AWS figures + pre-mortem) and A7 (Verified by Construction — the v1.11 architecture) +- These are backup slides for Q&A. Use them when the audience asks for the detail behind a main-slide claim +- Don't walk through them in the main talk unless time permits +- The appendix is indexed to match the Marp deck's A1-A7 structure -**Key takeaway:** The appendix is the deep-dive drawer. Pull a slide when the audience asks for the detail behind a main-slide claim. +**Key takeaway:** Backup slides for Q&A — pull the relevant appendix slide when asked. --- ## A1 — The Citizen Developer Experience **Talking points:** -- The framing is **vibe coding on a laptop** — the consumer describes what they want in plain language; an AI agent turns that into a contract the platform treats identically to a senior engineer's -- The consumer opens an issue (e.g. "a web API for the pricing service"); an AI agent maps the intent to a contract referencing a module from the reviewed skill catalog -- The contract enters the same pipeline and must clear the same confidence gate — no weaker mode -- Guardrails: skills are versioned, signed, and reviewed for sensitive data before release (Infra & Ops owns the review); agents are stateless — all state lives in the platform; the platform trusts and always verifies -- The agent's trace and submission confidence are captured in the contract (`profile: agentic`), so a reviewer can see how the contract was produced -- Be honest about maturity: the mechanism is designed and stub-proven; the full skill catalog and real agent runtime are planned +- Be honest about maturity: the *mechanism* (agent → contract → same pipeline) is designed and the stub was proven in the v1.0 demo; the full skill catalog and real agent runtime are planned +- The "vibe coding on a laptop" framing is intentional — it meets the citizen developer where they already are, but every submission still passes the same safety envelope +- The design point matters to leadership now: we are building for a world where more of the org can ship safely, not where more of the org has to become a platform engineer +- Guardrails: skills are versioned, signed, reviewed for sensitive data; agents are stateless; the platform trusts and always verifies +- The agent's trace and submission confidence are captured in the contract (`profile: agentic`) for review -**Key takeaway:** Vibe coding on a laptop — but every submission passes the same safety envelope. The agent produces the contract; the platform verifies it. +**Key takeaway:** A non-technical consumer ships by declaring intent — same pipeline, same safety envelope, no weaker checks. --- ## A2 — No Platform Code, No Cloning **Talking points:** -- The consumer's CI definition is a thin wrapper — one `uses:` line pointing at a versioned tag. That's the only coupling -- The runner checks out the consumer repo, then checks out the platform repo into the workspace. The platform installs its own runtime dependencies — the consumer installs nothing -- The consumer never clones the platform repo, never invokes platform scripts locally (optional `--check-only` validation is available but not required) -- When the platform ships a fix, every consumer on a floating MAJOR.MINOR tag gets it on their next run — no per-repo upgrade project -- For the Head of Cloud: there is no "platform code in every consumer repo" problem. The version-pinned `uses:` line is the only coupling, and it updates itself within the line +- The Head of Cloud cares about this: there is no "platform code in every consumer repo" problem +- The version-pinned `uses:` line is the *only* coupling, and it's a coupling that updates itself within the line +- The runner checks out the consumer repo, then checks out the platform repo into the workspace — the consumer never clones the platform repo +- The platform installs its own runtime dependencies — the consumer installs nothing +- When the platform ships a fix, every consumer on a floating tag gets it on their next run — no per-repo upgrade project -**Key takeaway:** One `uses:` line is the only coupling. The platform fetches itself at run time. No per-repo upgrade projects. +**Key takeaway:** The consumer never touches platform internals. The versioned `uses:` line is the only coupling. --- ## A3 — Local Reproducibility **Talking points:** -- The entire CI pipeline runs from the shell, not just in CI — no "works on my machine, fails in CI" gap +- This is the "no surprises before you push" story. A consumer can validate their contract offline, run the plan offline, and only push when they're confident - `scripts/run_ci.sh` mirrors the CI pipeline locally — the same three stages (lint → test → check-only) in sequence -- `scripts/run_platform.sh --check-only` runs the platform offline — no AWS, no policy engine, no outbox required. Validates a contract end-to-end before pushing -- `--plan-only` runs through the infrastructure plan without applying -- The CI and deploy pipelines are defined by declarative contracts (YAML instances validated against JSON Schemas) — a single source of truth that both workflows implement +- `scripts/run_platform.sh --check-only` runs the platform offline — no AWS, no policy engine, no outbox required +- The same declarative contract drives both the local tooling and CI — there's no "works on my machine, fails in CI" gap -**Key takeaway:** Validate offline, plan offline, push when confident. The same declarative contract drives local tooling and CI. +**Key takeaway:** The entire CI pipeline runs from the shell — no surprises before you push. --- ## A4 — The Road to the North Star **Talking points:** -- Call this out explicitly: **proposed phasing, not formally planned** — don't let the audience read it as a commitment -- Phase 1 is what's Verified today (22/22 capabilities) — core platform (contract, catalog, evidence), torn down to zero-cost -- Phase 2 is the next milestone — safe promotion wiring for qa/prod/dr -- Phase 3 introduces the agentic surface — skill catalog + agents -- Phase 4 is the north star — citizen developer GA on the same safety envelope -- Use this slide only when an audience member asks "how do you get from here to there" +- This is a proposed phasing, not a formally committed plan — call that out explicitly +- Phase 1 is what's tested and Verified today (22/22 capabilities, torn down to zero-cost) +- Phase 2 is the next milestone (qa/prod/dr wiring) +- Phase 3 introduces the agentic surface (skill catalog + agents) +- Phase 4 is the north star: citizen developer GA on the same safety envelope +- Use this only when an audience member asks "how do you get from here to there" -**Key takeaway:** A proposed path from the Verified core (22/22) to the citizen developer north star — proposed phasing, not formally planned. +**Key takeaway:** Proposed phasing — Phase 1 Verified, Phase 4 is the North Star (citizen developer GA). --- ## A5 — Glossary **Talking points:** -- Keep this slide in your back pocket for the audience member who asks "what does ABAC actually mean?" — don't read it aloud -- OIDC = short-lived federation tokens, no long-lived credentials; ABAC = access scoped by resource tags + repo identity, not roles -- CMK = per-stack encryption key, 90-day rotation; CMDB = validates change requests for decommission -- RPO = 0 means evidence written synchronously, no data loss; HITL = deliberate human attestation for qa/prod/dr -- VCS = the git hosting platform (GitHub, Gitea, GitLab); NFR = encryption, tagging, observability standards +- Keep this slide in your back pocket for the audience member who asks "what does ABAC actually mean?" +- Don't read it aloud +- All acronyms used in the deck are defined here -**Key takeaway:** The deck uses real security and ops vocabulary. The glossary is the cheat sheet for the audience member who wants the definitions. +**Key takeaway:** Reference slide — don't read aloud. --- ## A6 — Operating Model & Cost **Talking points:** -- This is the slide for the Head of Cloud / Finance — the headline: less than one cent ($0.001883) over 8 days of active development; zero BAU cloud spend -- Walk the cost table: total $0.001883 / 8 days, daily average $0.000235, projected monthly ~$0.007, peak day 2026-07-27 at $0.000867 -- S3 dominates the spend (98.8%, the terraform state bucket) — no compute (ECS/Lambda) ran because v1.0→v1.10 was plan-only for IAM-gated capabilities -- Live-AWS verification is milestone-scoped, then torn down: the v1.11 lifecycle pipeline ran apply→modify→destroy for every module, then tore down to zero-cost (D-096 — teardown mandatory before milestone COMPLETE) -- The lifecycle pipeline now defaults to **plan-only** on every PR (fast, no AWS mutation, no cost); `ACDL_LIFECYCLE_MODE=full` overrides to apply→destroy for milestone verification (REQ-134, v1.12) -- The pre-mortem (`PRE_MORTEM.md`) is the credibility slide — we already asked "how does this fail?" The v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: *a claim outruns the verification that backs it.* Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope) +- The headline for the Head of Cloud / Finance: less than one cent over 8 days of active development; zero BAU cloud spend +- The lifecycle pipeline defaults to plan-only so the PR-time cost is zero; `ACDL_LIFECYCLE_MODE=full` overrides for milestone verification +- The pre-mortem is the credibility slide — we already asked "how does this fail?" and the mitigations are structural +- The v1.10 decay incident is disclosed honestly, not hidden — that disclosure IS the mitigation +- Cost drivers are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents). No running infrastructure between milestones -**Key takeaway:** Less than one cent over 8 days. Zero BAU cloud spend. The pre-mortem + plan-only default make cost a non-issue and verification structural. +**Key takeaway:** Zero BAU cloud cost. Pre-mortemed failure modes with structural mitigations. --- @@ -236,10 +233,9 @@ **Talking points:** - This is the deep-dive slide for the Head of Engineering / Architecture — the two pillars answer "how do you keep the decks honest?" -- Pillar 1 — the **stateless adapter** (918 → ~80 lines): the old adapter was a monolith with 3 constant tables and 39 type-specific branches. The new adapter is a stateless assembler that owns no module content — each L1 module ships a real `terraform/` module dir owning its shape, nested blocks, and defaults. A new module is a new terraform dir, not a code change -- The v1.12 P67 fix closed a dedup defect for multi-resource L1s (ecs-service, alb) — CAP-013 is now Verified -- Pillar 2 — **pipeline-driven lifecycle testing**: a `modules-lifecycle` pipeline matrix-runs each L1 and L2 module's contracts through apply→modify→destroy against live AWS. The "test" = the pipeline cell going green. No per-module Python -- The pipeline defaults to plan-only on every PR (zero cost); `ACDL_LIFECYCLE_MODE=full` runs the real apply→destroy for milestone verification. The regression gate (D-091) re-runs all 22 capabilities at milestone completion — 22/22 Verified as of v1.12 -- The v1.10 lesson is the negative space: a 918-line adapter with type-specific branches decayed silently because the VERIFY gate was diff-scoped. The ~80-line stateless adapter + the milestone regression gate are the structural fix +- The adapter is simple enough to reason about (a stateless assembler); the lifecycle pipeline is the automated verification that backs every "Testing" claim +- The v1.10 lesson is the negative space: a 918-line adapter with type-specific branches decayed silently because the VERIFY gate was diff-scoped +- The ~80-line stateless adapter + the milestone regression gate are the structural fix +- The plan-only default (v1.12) means verification runs on every PR at zero cost, with the full apply→destroy gated behind a CI variable override -**Key takeaway:** "Verified" is a structural property, not a claim — a stateless ~80-line adapter + a lifecycle pipeline that defaults to plan-only and goes green on every PR. \ No newline at end of file +**Key takeaway:** "Verified" is a structural property, not a claim — the stateless adapter + lifecycle pipeline make it so. \ No newline at end of file diff --git a/docs/presentations/the-developer-experience.html b/docs/presentations/the-developer-experience.html index 313377f..073db8a 100644 --- a/docs/presentations/the-developer-experience.html +++ b/docs/presentations/the-developer-experience.html @@ -7,49 +7,47 @@ * @auto-scaling true * @size 16:9 1280px 720px * @size 4:3 960px 720px - */div#\:\$p > svg > foreignObject > section [data-theme=light],div#\:\$p > svg > foreignObject > section{color-scheme:light}div#\:\$p > svg > foreignObject > section [data-theme=dark],div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;font-weight:var(--base-text-weight-normal, 400);color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:var(--fontStack-sansSerif, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji");font-size:16px;line-height:1.5;word-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:16px}div#\:\$p > svg > foreignObject > section a{text-decoration:underline;text-underline-offset:calc(var(--marpit-root-font-size, 1rem) * .2)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section figcaption,div#\:\$p > svg > foreignObject > section figure{display:block}div#\:\$p > svg > foreignObject > section summary{display:list-item}div#\:\$p > svg > foreignObject > section [hidden]{display:none!important}div#\:\$p > svg > foreignObject > section a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}div#\:\$p > svg > foreignObject > section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#\:\$p > svg > foreignObject > section b,div#\:\$p > svg > foreignObject > section strong{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dfn{font-style:italic}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section small{font-size:90%}div#\:\$p > svg > foreignObject > section sub,div#\:\$p > svg > foreignObject > section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#\:\$p > svg > foreignObject > section sub{bottom:-.25em}div#\:\$p > svg > foreignObject > section sup{top:-.5em}div#\:\$p > svg > foreignObject > section img{border-style:none;max-width:100%;box-sizing:content-box}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section kbd,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp{font-family:monospace;font-size:1em}div#\:\$p > svg > foreignObject > section figure{margin:1em var(--base-size-40)}div#\:\$p > svg > foreignObject > section hr{box-sizing:content-box;overflow:hidden;background:transparent;height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}div#\:\$p > svg > foreignObject > section input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}div#\:\$p > svg > foreignObject > section [type=button],div#\:\$p > svg > foreignObject > section [type=reset],div#\:\$p > svg > foreignObject > section [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}div#\:\$p > svg > foreignObject > section [type=checkbox],div#\:\$p > svg > foreignObject > section [type=radio]{box-sizing:border-box;padding:0}div#\:\$p > svg > foreignObject > section [type=number]::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section [type=number]::-webkit-outer-spin-button{height:auto}div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-cancel-button,div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#\:\$p > svg > foreignObject > section ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}div#\:\$p > svg > foreignObject > section a:hover{text-decoration:underline}div#\:\$p > svg > foreignObject > section ::-moz-placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section ::placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section hr:after,div#\:\$p > svg > foreignObject > section hr:before{display:table;content:""}div#\:\$p > svg > foreignObject > section hr:after{clear:both}div#\:\$p > svg > foreignObject > section table{border-spacing:0;border-collapse:collapse;display:block;width:-moz-max-content;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}div#\:\$p > svg > foreignObject > section td,div#\:\$p > svg > foreignObject > section th{padding:0}div#\:\$p > svg > foreignObject > section details summary{cursor:pointer}div#\:\$p > svg > foreignObject > section [role=button]:focus,div#\:\$p > svg > foreignObject > section a:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#\:\$p > svg > foreignObject > section [role=button]:focus-visible,div#\:\$p > svg > foreignObject > section a:focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section a:not([class]):focus,div#\:\$p > svg > foreignObject > section a:not([class]):focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline-offset:0}div#\:\$p > svg > foreignObject > section kbd{display:inline-block;padding:var(--base-size-4);font:11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border-bottom-color:var(--borderColor-neutral-muted);border:1px solid var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin-top:var(--base-size-24);margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.25em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:.875em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}div#\:\$p > svg > foreignObject > section p{margin-top:0;margin-bottom:10px}div#\:\$p > svg > foreignObject > section blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:0;padding-left:2em}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ul ol{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol ol ol,div#\:\$p > svg > foreignObject > section ol ul ol,div#\:\$p > svg > foreignObject > section ul ol ol,div#\:\$p > svg > foreignObject > section ul ul ol{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section dd{margin-left:0}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp,div#\:\$p > svg > foreignObject > section tt{font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){margin-top:0;margin-bottom:0;word-wrap:normal}div#\:\$p > svg > foreignObject > section .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}div#\:\$p > svg > foreignObject > section input::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section .mr-2{margin-right:var(--base-size-8, 8px)!important}div#\:\$p > svg > foreignObject > section:after,div#\:\$p > svg > foreignObject > section:before{display:table}div#\:\$p > svg > foreignObject > section:after{clear:both}div#\:\$p > svg > foreignObject > section>:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section>:last-child{margin-bottom:0!important}div#\:\$p > svg > foreignObject > section a:not([href]){color:inherit;text-decoration:none}div#\:\$p > svg > foreignObject > section .absent{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section .anchor{float:left;padding-right:var(--base-size-4);margin-left:-20px;line-height:1}div#\:\$p > svg > foreignObject > section .anchor:focus{outline:none}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section dl,div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section p,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section table,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section blockquote>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor{text-decoration:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link{visibility:visible}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) code,div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) tt,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) code,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) tt,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) code,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) tt,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) code,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) tt,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) code,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) tt,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) code,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) tt{padding:0 .2em;font-size:inherit}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6){display:inline-block}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6) .anchor{margin-left:-40px}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2){padding-bottom:0;border-bottom:0}div#\:\$p > svg > foreignObject > section ol.no-list,div#\:\$p > svg > foreignObject > section ul.no-list{padding:0;list-style-type:none}div#\:\$p > svg > foreignObject > section ol[type="a s"]{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section ol[type="A s"]{list-style-type:upper-alpha}div#\:\$p > svg > foreignObject > section ol[type="i s"]{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol[type="I s"]{list-style-type:upper-roman}div#\:\$p > svg > foreignObject > section div>ol:not([type]),div#\:\$p > svg > foreignObject > section ol[type="1"]{list-style-type:decimal}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ol ul,div#\:\$p > svg > foreignObject > section ul ol,div#\:\$p > svg > foreignObject > section ul ul{margin-top:0;margin-bottom:0}div#\:\$p > svg > foreignObject > section li>p{margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section li+li{margin-top:.25em}div#\:\$p > svg > foreignObject > section dl{padding:0}div#\:\$p > svg > foreignObject > section dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section table th{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{padding:6px 13px;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section table td>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section table tr:nth-child(2n){background-color:var(--bgColor-muted)}div#\:\$p > svg > foreignObject > section table img{background-color:transparent}div#\:\$p > svg > foreignObject > section img[align=right]{padding-left:20px}div#\:\$p > svg > foreignObject > section img[align=left]{padding-right:20px}div#\:\$p > svg > foreignObject > section .emoji{max-width:none;vertical-align:text-top;background-color:transparent}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame,div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){float:left;width:auto;padding:7px;margin:13px 0 0;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) img{display:block;float:left}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) :is(span, marp-span){display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center :is(span, marp-span) img{margin:0 auto;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right>:is(span, marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right :is(span, marp-span) img{margin:0;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left :is(span, marp-span){margin:13px 0 0}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section code br,div#\:\$p > svg > foreignObject > section tt br{display:none}div#\:\$p > svg > foreignObject > section del code{text-decoration:inherit}div#\:\$p > svg > foreignObject > section samp{font-size:85%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{font-size:100%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}div#\:\$p > svg > foreignObject > section .highlight{margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre){margin-bottom:0;word-break:normal}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) tt{display:inline;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}div#\:\$p > svg > foreignObject > section .csv-data td,div#\:\$p > svg > foreignObject > section .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}div#\:\$p > svg > foreignObject > section .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}div#\:\$p > svg > foreignObject > section .csv-data tr{border-top:0}div#\:\$p > svg > foreignObject > section .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:before{content:"["}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:after{content:"]"}div#\:\$p > svg > foreignObject > section .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section div#\:\$p > svg > foreignObject > section section.footnotes{--marpit-root-font-size:12px}div#\:\$p > svg > foreignObject > section .footnotes ol,div#\:\$p > svg > foreignObject > section .footnotes ol ul{padding-left:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes ol ul{display:inline-block;margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes li{position:relative}div#\:\$p > svg > foreignObject > section .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8)*-1);right:calc(var(--base-size-8)*-1);bottom:calc(var(--base-size-8)*-1);left:calc(var(--base-size-24)*-1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}div#\:\$p > svg > foreignObject > section .footnotes li:target{color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#\:\$p > svg > foreignObject > section .pl-c{color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section .pl-c1,div#\:\$p > svg > foreignObject > section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section .pl-e,div#\:\$p > svg > foreignObject > section .pl-en{color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section .pl-s .pl-s1,div#\:\$p > svg > foreignObject > section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section .pl-pds,div#\:\$p > svg > foreignObject > section .pl-s,div#\:\$p > svg > foreignObject > section .pl-s .pl-pse .pl-s1,div#\:\$p > svg > foreignObject > section .pl-sr,div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sra,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section .pl-smw,div#\:\$p > svg > foreignObject > section .pl-v{color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#\:\$p > svg > foreignObject > section .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}div#\:\$p > svg > foreignObject > section .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}div#\:\$p > svg > foreignObject > section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section .pl-mh,div#\:\$p > svg > foreignObject > section .pl-mh .pl-en,div#\:\$p > svg > foreignObject > section .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}div#\:\$p > svg > foreignObject > section .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}div#\:\$p > svg > foreignObject > section .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}div#\:\$p > svg > foreignObject > section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#\:\$p > svg > foreignObject > section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#\:\$p > svg > foreignObject > section .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section button:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section summary:focus:not(:focus-visible){outline:none;box-shadow:none}div#\:\$p > svg > foreignObject > section [tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section details-dialog:focus:not(:focus-visible){outline:none}div#\:\$p > svg > foreignObject > section g-emoji{display:inline-block;min-width:1ch;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}div#\:\$p > svg > foreignObject > section g-emoji img{width:1em;height:1em}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote){display:block}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):not(:has(.snippet-clipboard-content,>:is(pre, marp-pre))){width:-moz-fit-content;width:fit-content}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):has(.snippet-clipboard-content,>:is(pre, marp-pre)):focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:2px}div#\:\$p > svg > foreignObject > section .task-list-item{list-style-type:none}div#\:\$p > svg > foreignObject > section .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}div#\:\$p > svg > foreignObject > section .task-list-item.enabled label{cursor:pointer}div#\:\$p > svg > foreignObject > section .task-list-item+.task-list-item{margin-top:var(--base-size-4)}div#\:\$p > svg > foreignObject > section .task-list-item .handle{display:none}div#\:\$p > svg > foreignObject > section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#\:\$p > svg > foreignObject > section ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section .contains-task-list:focus-within .task-list-item-convert-container,div#\:\$p > svg > foreignObject > section .contains-task-list:hover .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip-path:none}div#\:\$p > svg > foreignObject > section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#\:\$p > svg > foreignObject > section .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section .markdown-alert>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section .markdown-alert>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section>:first-child>.heading-element:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre):has(+.zeroclipboard-container){min-height:52px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:var(--h1-color);font-size:1.6em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){border-bottom:none}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.05em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit;color:var(--heading-strong-color)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:563px}div#\:\$p > svg > foreignObject > section hr{height:0;padding-top:.25em}div#\:\$p > svg > foreignObject > section img{background-color:transparent}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){border:1px solid var(--borderColor-default);line-height:1.15;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:529px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-doctag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-tag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-variable),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-type),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_.inherited__),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attribute),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-literal),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-number),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-operator),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-class),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-id),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-string),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-regexp),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-built_in),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-code),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-comment),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-name),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-quote),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-pseudo),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-section){font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-emphasis){font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-strong){font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-addition){color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-deletion){color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{margin:0;position:absolute;left:30px;color:var(--header-footer-color);font-size:18px}div#\:\$p > svg > foreignObject > section header{top:21px}div#\:\$p > svg > foreignObject > section footer{bottom:21px}div#\:\$p > svg > foreignObject > section{--h1-color:light-dark(#246, #cee7ff);--header-footer-color:light-dark(hsla(0,0%,40%,.75), hsla(0,0%,60%,.75));--heading-strong-color:light-dark(#48c, #7bf);--paginate-color:light-dark(#777, #999);--base-size-4:4px;--base-size-8:8px;--base-size-16:16px;--base-size-24:24px;--base-size-40:40px;display:block;font-size:29px;height:720px;padding:78.5px;place-content:safe center center;width:1280px;flex-flow:column nowrap;align-items:stretch}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:29px}div#\:\$p > svg > foreignObject > section>:last-child,div#\:\$p > svg > foreignObject > section[data-footer]>:nth-last-child(2){margin-bottom:0}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:var(--paginate-color)}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:24px}div#\:\$p > svg > foreignObject > section[data-color] :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section[data-color] :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section[data-color] :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section[data-color] :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section[data-color] :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section[data-color] :is(h6, marp-h6){color:currentcolor}div#\:\$p > svg > foreignObject > section{font-family:"Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;font-size:22px;color:#1B1B1B}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 22px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:#D6002A;font-size:34px;margin-bottom:0.3em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){color:#D6002A;font-size:26px;margin-bottom:0.2em}div#\:\$p > svg > foreignObject > section.title{background:#1B1B1B;color:#fff;border-top:8px solid #D6002A}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){color:#fff}div#\:\$p > svg > foreignObject > section table{font-size:18px;width:100%}div#\:\$p > svg > foreignObject > section th{background:#F0F0F0}div#\:\$p > svg > foreignObject > section blockquote{border-left:4px solid #D6002A;color:#2E2E2E;font-size:20px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){font-size:14px;line-height:1.3}div#\:\$p > svg > foreignObject > section code{font-size:14px}div#\:\$p > svg > foreignObject > section img{display:block;margin:0 auto;max-height:280px}div#\:\$p > svg > foreignObject > section em.story{color:#6B7280;font-size:16px;font-style:italic}div#\:\$p > svg > foreignObject > section .badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:14px;font-weight:600}div#\:\$p > svg > foreignObject > section section.badge{--marpit-root-font-size: 14px}div#\:\$p > svg > foreignObject > section .testing{background:#DBEAFE;color:#1E3A5F}div#\:\$p > svg > foreignObject > section .planned{background:#fef3c7;color:#78350f}div#\:\$p > svg > foreignObject > section .agentic{background:#EDE9FE;color:#4C1D95}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){font-size:44px;margin-bottom:0.1em}div#\:\$p > svg > foreignObject > section.title :is(h3, marp-h3){color:#F0F0F0;font-weight:400;font-size:22px;margin-top:0}div#\:\$p > svg > foreignObject > section{font-size:16px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 16px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){font-size:10px;line-height:1.2}div#\:\$p > svg > foreignObject > section code{font-size:10px}div#\:\$p > svg > foreignObject > section td{font-size:14px}div#\:\$p > svg > foreignObject > section{font-size:18px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 18px}div#\:\$p > svg > foreignObject > section table{font-size:16px}div#\:\$p > svg > foreignObject > section{font-size:18px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 18px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%} + */div#\:\$p > svg > foreignObject > section [data-theme=light],div#\:\$p > svg > foreignObject > section{color-scheme:light}div#\:\$p > svg > foreignObject > section [data-theme=dark],div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;font-weight:var(--base-text-weight-normal, 400);color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:var(--fontStack-sansSerif, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji");font-size:16px;line-height:1.5;word-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:16px}div#\:\$p > svg > foreignObject > section a{text-decoration:underline;text-underline-offset:calc(var(--marpit-root-font-size, 1rem) * .2)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section figcaption,div#\:\$p > svg > foreignObject > section figure{display:block}div#\:\$p > svg > foreignObject > section summary{display:list-item}div#\:\$p > svg > foreignObject > section [hidden]{display:none!important}div#\:\$p > svg > foreignObject > section a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}div#\:\$p > svg > foreignObject > section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#\:\$p > svg > foreignObject > section b,div#\:\$p > svg > foreignObject > section strong{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dfn{font-style:italic}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section small{font-size:90%}div#\:\$p > svg > foreignObject > section sub,div#\:\$p > svg > foreignObject > section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#\:\$p > svg > foreignObject > section sub{bottom:-.25em}div#\:\$p > svg > foreignObject > section sup{top:-.5em}div#\:\$p > svg > foreignObject > section img{border-style:none;max-width:100%;box-sizing:content-box}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section kbd,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp{font-family:monospace;font-size:1em}div#\:\$p > svg > foreignObject > section figure{margin:1em var(--base-size-40)}div#\:\$p > svg > foreignObject > section hr{box-sizing:content-box;overflow:hidden;background:transparent;height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}div#\:\$p > svg > foreignObject > section input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}div#\:\$p > svg > foreignObject > section [type=button],div#\:\$p > svg > foreignObject > section [type=reset],div#\:\$p > svg > foreignObject > section [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}div#\:\$p > svg > foreignObject > section [type=checkbox],div#\:\$p > svg > foreignObject > section [type=radio]{box-sizing:border-box;padding:0}div#\:\$p > svg > foreignObject > section [type=number]::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section [type=number]::-webkit-outer-spin-button{height:auto}div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-cancel-button,div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#\:\$p > svg > foreignObject > section ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}div#\:\$p > svg > foreignObject > section a:hover{text-decoration:underline}div#\:\$p > svg > foreignObject > section ::-moz-placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section ::placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section hr:after,div#\:\$p > svg > foreignObject > section hr:before{display:table;content:""}div#\:\$p > svg > foreignObject > section hr:after{clear:both}div#\:\$p > svg > foreignObject > section table{border-spacing:0;border-collapse:collapse;display:block;width:-moz-max-content;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}div#\:\$p > svg > foreignObject > section td,div#\:\$p > svg > foreignObject > section th{padding:0}div#\:\$p > svg > foreignObject > section details summary{cursor:pointer}div#\:\$p > svg > foreignObject > section [role=button]:focus,div#\:\$p > svg > foreignObject > section a:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#\:\$p > svg > foreignObject > section [role=button]:focus-visible,div#\:\$p > svg > foreignObject > section a:focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}div#\:\$p > svg > foreignObject > section a:not([class]):focus,div#\:\$p > svg > foreignObject > section a:not([class]):focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline-offset:0}div#\:\$p > svg > foreignObject > section kbd{display:inline-block;padding:var(--base-size-4);font:11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border-bottom-color:var(--borderColor-neutral-muted);border:1px solid var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin-top:var(--base-size-24);margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.25em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:.875em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}div#\:\$p > svg > foreignObject > section p{margin-top:0;margin-bottom:10px}div#\:\$p > svg > foreignObject > section blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:0;padding-left:2em}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ul ol{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol ol ol,div#\:\$p > svg > foreignObject > section ol ul ol,div#\:\$p > svg > foreignObject > section ul ol ol,div#\:\$p > svg > foreignObject > section ul ul ol{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section dd{margin-left:0}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp,div#\:\$p > svg > foreignObject > section tt{font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){margin-top:0;margin-bottom:0;word-wrap:normal}div#\:\$p > svg > foreignObject > section .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}div#\:\$p > svg > foreignObject > section input::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section .mr-2{margin-right:var(--base-size-8, 8px)!important}div#\:\$p > svg > foreignObject > section:after,div#\:\$p > svg > foreignObject > section:before{display:table}div#\:\$p > svg > foreignObject > section:after{clear:both}div#\:\$p > svg > foreignObject > section>:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section>:last-child{margin-bottom:0!important}div#\:\$p > svg > foreignObject > section a:not([href]){color:inherit;text-decoration:none}div#\:\$p > svg > foreignObject > section .absent{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section .anchor{float:left;padding-right:var(--base-size-4);margin-left:-20px;line-height:1}div#\:\$p > svg > foreignObject > section .anchor:focus{outline:none}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section dl,div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section p,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section table,div#\:\$p > svg > foreignObject > section ul{margin-top:0;margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section blockquote>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor{text-decoration:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link{visibility:visible}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) code,div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) tt,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) code,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) tt,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) code,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) tt,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) code,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) tt,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) code,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) tt,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) code,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) tt{padding:0 .2em;font-size:inherit}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6){display:inline-block}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6) .anchor{margin-left:-40px}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2){padding-bottom:0;border-bottom:0}div#\:\$p > svg > foreignObject > section ol.no-list,div#\:\$p > svg > foreignObject > section ul.no-list{padding:0;list-style-type:none}div#\:\$p > svg > foreignObject > section ol[type="a s"]{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section ol[type="A s"]{list-style-type:upper-alpha}div#\:\$p > svg > foreignObject > section ol[type="i s"]{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol[type="I s"]{list-style-type:upper-roman}div#\:\$p > svg > foreignObject > section div>ol:not([type]),div#\:\$p > svg > foreignObject > section ol[type="1"]{list-style-type:decimal}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ol ul,div#\:\$p > svg > foreignObject > section ul ol,div#\:\$p > svg > foreignObject > section ul ul{margin-top:0;margin-bottom:0}div#\:\$p > svg > foreignObject > section li>p{margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section li+li{margin-top:.25em}div#\:\$p > svg > foreignObject > section dl{padding:0}div#\:\$p > svg > foreignObject > section dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section table th{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{padding:6px 13px;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section table td>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section table tr:nth-child(2n){background-color:var(--bgColor-muted)}div#\:\$p > svg > foreignObject > section table img{background-color:transparent}div#\:\$p > svg > foreignObject > section img[align=right]{padding-left:20px}div#\:\$p > svg > foreignObject > section img[align=left]{padding-right:20px}div#\:\$p > svg > foreignObject > section .emoji{max-width:none;vertical-align:text-top;background-color:transparent}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame,div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){float:left;width:auto;padding:7px;margin:13px 0 0;border:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) img{display:block;float:left}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) :is(span, marp-span){display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center :is(span, marp-span) img{margin:0 auto;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right{display:block;overflow:hidden;clear:both}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right>:is(span, marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right :is(span, marp-span) img{margin:0;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left :is(span, marp-span){margin:13px 0 0}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section code br,div#\:\$p > svg > foreignObject > section tt br{display:none}div#\:\$p > svg > foreignObject > section del code{text-decoration:inherit}div#\:\$p > svg > foreignObject > section samp{font-size:85%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{font-size:100%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}div#\:\$p > svg > foreignObject > section .highlight{margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre){margin-bottom:0;word-break:normal}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) tt{display:inline;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}div#\:\$p > svg > foreignObject > section .csv-data td,div#\:\$p > svg > foreignObject > section .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}div#\:\$p > svg > foreignObject > section .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}div#\:\$p > svg > foreignObject > section .csv-data tr{border-top:0}div#\:\$p > svg > foreignObject > section .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:before{content:"["}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:after{content:"]"}div#\:\$p > svg > foreignObject > section .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section div#\:\$p > svg > foreignObject > section section.footnotes{--marpit-root-font-size:12px}div#\:\$p > svg > foreignObject > section .footnotes ol,div#\:\$p > svg > foreignObject > section .footnotes ol ul{padding-left:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes ol ul{display:inline-block;margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes li{position:relative}div#\:\$p > svg > foreignObject > section .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8)*-1);right:calc(var(--base-size-8)*-1);bottom:calc(var(--base-size-8)*-1);left:calc(var(--base-size-24)*-1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}div#\:\$p > svg > foreignObject > section .footnotes li:target{color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#\:\$p > svg > foreignObject > section .pl-c{color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section .pl-c1,div#\:\$p > svg > foreignObject > section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section .pl-e,div#\:\$p > svg > foreignObject > section .pl-en{color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section .pl-s .pl-s1,div#\:\$p > svg > foreignObject > section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section .pl-pds,div#\:\$p > svg > foreignObject > section .pl-s,div#\:\$p > svg > foreignObject > section .pl-s .pl-pse .pl-s1,div#\:\$p > svg > foreignObject > section .pl-sr,div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sra,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section .pl-smw,div#\:\$p > svg > foreignObject > section .pl-v{color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#\:\$p > svg > foreignObject > section .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}div#\:\$p > svg > foreignObject > section .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}div#\:\$p > svg > foreignObject > section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section .pl-mh,div#\:\$p > svg > foreignObject > section .pl-mh .pl-en,div#\:\$p > svg > foreignObject > section .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}div#\:\$p > svg > foreignObject > section .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}div#\:\$p > svg > foreignObject > section .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}div#\:\$p > svg > foreignObject > section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#\:\$p > svg > foreignObject > section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#\:\$p > svg > foreignObject > section .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section button:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section summary:focus:not(:focus-visible){outline:none;box-shadow:none}div#\:\$p > svg > foreignObject > section [tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section details-dialog:focus:not(:focus-visible){outline:none}div#\:\$p > svg > foreignObject > section g-emoji{display:inline-block;min-width:1ch;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}div#\:\$p > svg > foreignObject > section g-emoji img{width:1em;height:1em}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote){display:block}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):not(:has(.snippet-clipboard-content,>:is(pre, marp-pre))){width:-moz-fit-content;width:fit-content}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):has(.snippet-clipboard-content,>:is(pre, marp-pre)):focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:2px}div#\:\$p > svg > foreignObject > section .task-list-item{list-style-type:none}div#\:\$p > svg > foreignObject > section .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}div#\:\$p > svg > foreignObject > section .task-list-item.enabled label{cursor:pointer}div#\:\$p > svg > foreignObject > section .task-list-item+.task-list-item{margin-top:var(--base-size-4)}div#\:\$p > svg > foreignObject > section .task-list-item .handle{display:none}div#\:\$p > svg > foreignObject > section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#\:\$p > svg > foreignObject > section ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section .contains-task-list:focus-within .task-list-item-convert-container,div#\:\$p > svg > foreignObject > section .contains-task-list:hover .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip-path:none}div#\:\$p > svg > foreignObject > section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#\:\$p > svg > foreignObject > section .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-left:.25em solid var(--borderColor-default)}div#\:\$p > svg > foreignObject > section .markdown-alert>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section .markdown-alert>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section>:first-child>.heading-element:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre):has(+.zeroclipboard-container){min-height:52px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:var(--h1-color);font-size:1.6em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){border-bottom:none}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.05em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit;color:var(--heading-strong-color)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:563px}div#\:\$p > svg > foreignObject > section hr{height:0;padding-top:.25em}div#\:\$p > svg > foreignObject > section img{background-color:transparent}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){border:1px solid var(--borderColor-default);line-height:1.15;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:529px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-doctag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-tag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-variable),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-type),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_.inherited__),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attribute),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-literal),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-number),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-operator),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-class),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-id),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-string),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-regexp),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-built_in),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-code),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-comment),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-name),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-quote),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-pseudo),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-section){font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-emphasis){font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-strong){font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-addition){color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-deletion){color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{margin:0;position:absolute;left:30px;color:var(--header-footer-color);font-size:18px}div#\:\$p > svg > foreignObject > section header{top:21px}div#\:\$p > svg > foreignObject > section footer{bottom:21px}div#\:\$p > svg > foreignObject > section{--h1-color:light-dark(#246, #cee7ff);--header-footer-color:light-dark(hsla(0,0%,40%,.75), hsla(0,0%,60%,.75));--heading-strong-color:light-dark(#48c, #7bf);--paginate-color:light-dark(#777, #999);--base-size-4:4px;--base-size-8:8px;--base-size-16:16px;--base-size-24:24px;--base-size-40:40px;display:block;font-size:29px;height:720px;padding:78.5px;place-content:safe center center;width:1280px;flex-flow:column nowrap;align-items:stretch}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:29px}div#\:\$p > svg > foreignObject > section>:last-child,div#\:\$p > svg > foreignObject > section[data-footer]>:nth-last-child(2){margin-bottom:0}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:var(--paginate-color)}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:24px}div#\:\$p > svg > foreignObject > section[data-color] :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section[data-color] :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section[data-color] :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section[data-color] :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section[data-color] :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section[data-color] :is(h6, marp-h6){color:currentcolor}div#\:\$p > svg > foreignObject > section{font-family:"Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;font-size:26px;color:#1B1B1B}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 26px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:#D6002A;font-size:40px;margin-bottom:0.3em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){color:#D6002A;font-size:32px;margin-bottom:0.2em}div#\:\$p > svg > foreignObject > section.title{background:#1B1B1B;color:#fff;border-top:8px solid #D6002A}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){color:#fff}div#\:\$p > svg > foreignObject > section table{font-size:22px;width:100%}div#\:\$p > svg > foreignObject > section th{background:#F0F0F0}div#\:\$p > svg > foreignObject > section blockquote{border-left:4px solid #D6002A;color:#2E2E2E;font-size:24px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){font-size:16px;line-height:1.3}div#\:\$p > svg > foreignObject > section code{font-size:16px}div#\:\$p > svg > foreignObject > section img{display:block;margin:0 auto;max-height:280px}div#\:\$p > svg > foreignObject > section .badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:16px;font-weight:600}div#\:\$p > svg > foreignObject > section section.badge{--marpit-root-font-size: 16px}div#\:\$p > svg > foreignObject > section .testing{background:#DBEAFE;color:#1E3A5F}div#\:\$p > svg > foreignObject > section .planned{background:#fef3c7;color:#78350f}div#\:\$p > svg > foreignObject > section .agentic{background:#EDE9FE;color:#4C1D95}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){font-size:44px;margin-bottom:0.1em}div#\:\$p > svg > foreignObject > section.title :is(h3, marp-h3){color:#F0F0F0;font-weight:400;font-size:22px;margin-top:0}div#\:\$p > svg > foreignObject > section{font-size:22px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 22px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){font-size:13px;line-height:1.2}div#\:\$p > svg > foreignObject > section code{font-size:13px}div#\:\$p > svg > foreignObject > section{font-size:20px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 20px}div#\:\$p > svg > foreignObject > section table{font-size:18px}div#\:\$p > svg > foreignObject > section{font-size:20px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 20px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%}
    The Developer Experience
    -

    Where Agentic Cloud Delivery (ACDL) Sits in Your World

    -

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

    +

    Two consumer paths, one safety envelope

    • 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
    • -
    • Upstream is anything — your IDE, an agentic SDLC, or vibe coding on a laptop. ACDL doesn't care how the contract was produced
    • -
    • ACDL is infrastructure only — it provisions and governs AWS resources. Application deployment is upstream
    • +
    • Citizen developer — declares intent; an AI agent produces a contract that passes the same safety envelope Agentic
    • +
    • Upstream is anything — IDE, agentic SDLC, or vibe coding. ACDL doesn't care how the contract was produced
    • +
    • ACDL is infrastructure only — provisions and governs AWS resources. Application deployment is upstream
    Internal
    The Developer Experience
    -

    The Contract — The Entire Consumer Surface

    -

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

    -

    Three things. That is the entire consumer-side surface.

    +

    Three things. The entire consumer surface.

    • 1. App code — the consumer's service, at the top level of the repo
    • @@ -190,181 +181,372 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
      • 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 does not: write modules, clone the platform repo, hold cloud credentials, or maintain a state backend
      Internal
    The Developer Experience
    -

    The Developer Feedback Loop

    -

    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

    +

    See what the platform does, in real time

      -
    • 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
    • +
    • Streamed output by default — the plan, policy results, and each check record flow to stdout
    • +
    • PR comments after every successful pipeline stage — always know where you stand
    • +
    • Clear, explainable halt reasons — a policy violation, an insufficient signal, or a missing attestation. Never opaque.
    • +
    • Connection strings posted as PR comments — human-readable, no hunting. Runtime secrets go to encrypted Parameter Store, never to logs
    • +
    • Errors become GitHub issues, automatically — a failed deploy opens an issue on the platform repo Testing
    Internal
    The Developer Experience
    -

    Versioned, Predictable Releases

    -

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

    -

    Consumers control when they absorb platform improvements. Testing

    +

    Pick from pre-built, security-reviewed blocks

    +

      -
    • Floating MAJOR + MINOR tags (e.g. @v1.12) — 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
    • +
    • Primitives — single-purpose resources (S3, VPC, ECS, IAM, ALB, ECR, CloudFront, WAF, RDS)
    • +
    • Modules — composed patterns (static site with CDN + WAF; microservice with VPC + ECS + ALB + ECR)
    • +
    • Validated examples per modulesimple.yaml + complex.yaml, validated against the contract schema in CI
    • +
    • Auto-promotion of patterns — after 3 observed usages Planned Agentic
    Internal
    The Developer Experience
    -

    Friendly Onboarding

    -

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

    +

    The bar rises automatically with sensitivity

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EnvironmentWhat the platform addsMaturity
    devConfidence ≥ 0.50, fully autonomousTesting
    qaQA human attestation + confidence ≥ 0.75Planned
    prodSRE human attestation + confidence ≥ 0.90Planned
    drSRE human attestation + confidence ≥ 0.95 + DR drillPlanned
    +
      +
    • No staging environment — dev is the only autonomous environment
    • +
    • Separation of duties — the QA approver cannot be the prod approver
    • +
    +
    Internal
    +
    +
    +
    The Developer Experience
    +

    Tearing down is as gated as deploying

    +

    +
    uses: acdl/.github/workflows/deploy.yml@v1.12
    +with:
    +  contract: .acdl/contract.yml
    +  mode: decommission
    +  changeRequestId: "CHG0678912"
    +
    +
      +
    • Validate the change request — platform queries the CMDB; CR must be approved and match the consumer repo
    • +
    • Two SRE human-attestation gates — disable protection → SRE approves → zero counts + destroy → second SRE approves
    • +
    • Per-stack encryption key enters a grace window (default 30 days) so encrypted data remains recoverable Testing
    • +
    +
    Internal
    +
    +
    +
    The Developer Experience
    +

    You control when you absorb improvements

    +

    +
      +
    • Floating MAJOR + MINOR tags (e.g. @v1.12) — automatically receive patch updates within the line
    • +
    • Semantic versioning with a clear contract: interface → MAJOR, behavior → MINOR, lifecycle → PATCH
    • +
    • Pin to an exact version for stability, or float on MAJOR only (@v1) to absorb new features on your 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 floating tags Testing
    • +
    +
    Internal
    +
    +
    +
    The Developer Experience
    +

    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:

      @@ -377,255 +559,46 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }

      Citizen developer onboarding path: planned

      Internal
    -
    -
    The Developer Experience
    -

    Safe Promotion Path

    -

    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.

    -

    - - - - - -
    -

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

    -
    jobs:
    -  dev:
    -    uses: acdl/.github/workflows/deploy.yml@v1.12
    -    with: { contract: .acdl/contract.yml, environment: dev }
    -  qa:
    -    needs: dev
    -    uses: acdl/.github/workflows/deploy.yml@v1.12
    -    with: { contract: .acdl/contract.yml, environment: qa }
    -
    -
    -

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

    -
    jobs:
    -  dev:
    -    uses: acdl/.github/workflows/deploy.yml@v1.12
    -    with: { contract: .acdl/contract-dev.yaml }
    -  qa:
    -    needs: dev
    -    uses: acdl/.github/workflows/deploy.yml@v1.12
    -    with: { contract: .acdl/contract-qa.yaml }
    -
    -
    -
    Internal
    -
    -
    -
    The Developer Experience
    -

    Safe Decommission

    -

    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.12
    -with:
    -  contract: .acdl/contract.yml
    -  mode: decommission
    -  changeRequestId: "CHG0678912"
    -
    -

    A 2-step pipeline with two SRE human-attestation gates:

    -
      -
    1. Validate the change request — the platform queries the CMDB; the CR must be approved and match the consumer repo
    2. -
    3. Disable deletion protectionSRE approvesZero all counts + destroya second SRE approves
    4. -
    -

    The per-stack encryption key enters a grace window (default 30 days) so encrypted data remains recoverable.

    -
    Internal
    -
    -
    -
    The Developer Experience
    -

    Self-Service Module Catalog

    -

    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
    • -
    • Modules — composed patterns (a static site with CDN + WAF; a microservice with VPC + ECS + load balancer + registry)
    • -
    • Validated examples per modulesimple.yaml + complex.yaml + variation files, validated against the contract schema in CI. Examples cannot drift from the schema silently
    • -
    • Auto-promotion of patterns — auto-promoted to the catalog after 3 observed usages Planned Agentic
    • -
    • Compliance extension points — each module lists where GDPR, SOX, SOC2, DORA controls will wire in Planned
    • -
    -
    Internal
    -
    The Developer Experience
    -

    The Desired Outcomes

    -

    Here's what this delivers to the organization.

    +

    The desired outcomes

      -
    • 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.
    • -
    • Blast radius contained by design. Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources.
    • -
    • The bottleneck moves off the platform team's ticket queue. A merged change progresses through lower environments without a platform engineer joining a thread.
    • -
    • Infrastructure as a utility, not a craft. Teams consume infrastructure, they don't maintain it — and the platform compounds value over time by learning from recurring patterns.
    • -
    • A path to the citizen developer. The same safety envelope that serves a senior engineer will serve a non-technical consumer. Agentic
    • +
    • Velocity without sacrificing safety — speed in ergonomics, safety in unbypassable gates
    • +
    • Security, observability, compliance as platform defaults — not per-team effort, not post-hoc remediation
    • +
    • Auditability as a byproduct, not a project — every change traceable to a human attestation and a tamper-evident evidence event
    • +
    • Blast radius contained by design — OIDC + ABAC, only your own tagged resources
    • +
    • The bottleneck moves off the platform team's ticket queue — a merged change progresses without a platform engineer joining a thread
    • +
    • Infrastructure as a utility, not a craft — consume, don't maintain
    • +
    • A path to the citizen developer — same envelope, senior engineer or non-technical Agentic
    Internal
    Appendix -

    For deep dives — these slides cover details omitted from the main 10.

    Contents:

    1. The Citizen Developer Experience (full)
    2. @@ -711,46 +680,44 @@ em.story { color: #6B7280; font-size: 16px; font-style: italic; }
    Testing -
  • Live-AWS verification is milestone-scoped, then torn down. The v1.11 lifecycle pipeline ran apply→modify→destroy for every module, then tore down to zero-cost (D-096). The pipeline now defaults to plan-only on every PR; ACDL_LIFECYCLE_MODE=full overrides to apply→destroy for milestone verification (REQ-134, v1.12).
  • +
  • Local emulators are the primary tier — the full pipeline runs in-process, no AWS credentials Testing
  • +
  • Live-AWS verification is milestone-scoped, then torn down. The pipeline now defaults to plan-only on every PR; ACDL_LIFECYCLE_MODE=full overrides to apply→destroy for milestone verification (REQ-134, v1.12).
  • Cost drivers are spike-scoped: Terraform plan reads (free), S3 state storage (cents), DynamoDB outbox (cents). No running infrastructure between milestones.
  • -

    Pre-mortem (PRE_MORTEM.md): failure modes were pre-mortemed before the leadership pitch. The v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: a claim outruns the verification that backs it. Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope).

    +

    Pre-mortem (PRE_MORTEM.md): the v1.10 decay incident (diff-scoped VERIFY missed 7 adapter defects) is the root pattern: a claim outruns the verification that backs it. Four forward failure modes + structural mitigations (regression-tested IAM baseline, mandatory teardown, verified-only deck claims, honest scope).

    Internal
    A7 — Verified by Construction -

    The v1.11 architecture makes "Verified" a structural property, not a claim.

    -

    Two architectural pillars:

    +

    Two architectural pillars make "Verified" a structural property, not a claim:

    • The stateless adapter (918 → ~80 lines). The Terraform adapter was a 918-line monolith with 3 constant tables and 39 type-specific branches. It is now a ~80-line stateless assembler: it owns no module content — no resource shape, no nested HCL blocks, no defaults. Each L1 module ships a real terraform/ module dir owning its shape, nested blocks, and defaults. The adapter reads the registry and emits module "x" { source = ... } blocks. A new module is a new terraform dir, not a code change. (The v1.12 P67 fix closed a dedup defect for multi-resource L1s — ecs-service, alb; CAP-013 now Verified.)
    • Pipeline-driven lifecycle testing. A modules-lifecycle pipeline matrix-runs each L1 and L2 module's contracts through apply→modify→destroy against live AWS. The "test" = the pipeline cell going green. Defaults to plan-only on every PR (fast, no AWS mutation, no cost); ACDL_LIFECYCLE_MODE=full overrides to the real apply→destroy for milestone verification (REQ-134, v1.12). The regression gate (D-091) re-runs all 22 capabilities at milestone completion — 22/22 Verified as of v1.12.
    • diff --git a/docs/presentations/the-developer-experience.md b/docs/presentations/the-developer-experience.md index 56f952c..3d43e85 100644 --- a/docs/presentations/the-developer-experience.md +++ b/docs/presentations/the-developer-experience.md @@ -2,7 +2,7 @@ > **Subtitle:** Agentic Cloud Delivery Platform > **Audience:** Senior Leadership, CTO, Head of Cloud, Head of Infrastructure, Head of DevOps -> **Length:** ~15 minutes · 10 main + 6 appendix = 16 slides +> **Length:** ~15 minutes · 10 main + 7 appendix = 17 slides > **Purpose:** Sell the developer experience and the citizen developer experience to tech leadership — velocity without sacrificing safety, and security/observability/compliance as platform defaults rather than per-team effort. > **Maturity framing:** "Testing" = works internally, dev pilot-ready. "Planned" = on the roadmap. "Agentic" = involves AI agents or autonomous decision-making. > **Re-verification (2026-07-29):** Every "Testing" claim in this deck was re-verified in v1.10 Phase 54 (D-093) and again in v1.11 via the pipeline-driven lifecycle tests (P59–P62). The headline E2E (contract → resolver → adapter → terraform init/validate/plan) passes against the live AWS account; the local emulating tier (Phase 53) runs the full E2E with no cloud credentials. **22/22 auto-verifiable capabilities Verified** (CAP-013 fixed in v1.12 P67 — the adapter's multi-resource L1 dedup defect is closed). The v1.11 lifecycle pipeline ran apply→modify→destroy against live AWS and was then torn down to zero-cost (D-096). See `.ciagent/CAPABILITY_INVENTORY.md` and `.ciagent/PRE_MORTEM.md`. @@ -17,14 +17,10 @@ The consumer surface is intentionally tiny. The platform's surface is large and --- -## Slide 2 — Where Agentic Cloud Delivery (ACDL) Sits in Your World - -Here's who uses the platform and where the boundary is. +## Slide 2 — Two consumer paths, one safety envelope 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 LR subgraph UP ["Upstream — anything"] @@ -49,27 +45,19 @@ flowchart LR F --> G ``` -- **Technical developer** — owns app code + a contract + a thin CI definition. Uses the full module catalog and inputs. -- **Citizen developer** — declares intent in plain language; an AI agent produces a contract that passes the **same** safety envelope as a senior engineer's. Agentic -- **Upstream is anything** — your IDE, an agentic SDLC, or vibe coding on a laptop. ACDL doesn't care how the contract was produced. +- **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 +- **Upstream is anything** — IDE, agentic SDLC, or vibe coding. ACDL doesn't care how the contract was produced. - **ACDL is infrastructure only** — it provisions and governs AWS resources. Application deployment is upstream. -The platform is **opinionated in what it accepts, regardless of who is declaring.** There is no "citizen developer mode" with weaker checks. - -> **Speaker notes:** This is the thesis of the deck. The two surfaces are *parallel*, not a progression — a citizen developer doesn't "graduate" to the developer surface. Both produce a contract; both get the same treatment. The scope boundary matters: anything upstream of the contract is out of ACDL's concern — ACDL is the infrastructure layer that takes a contract and governs the AWS resources. The leadership takeaway: we expand who can ship safely without lowering the bar. +> **Speaker notes:** This is the thesis of the deck. The two surfaces are *parallel*, not a progression — a citizen developer doesn't "graduate" to the developer surface. Both produce a contract; both get the same treatment. The scope boundary matters: anything upstream of the contract is out of ACDL's concern. The leadership takeaway: we expand who can ship safely without lowering the bar. --- -## Slide 3 — The Contract — The Entire Consumer Surface - -Now let's look at what a consumer actually writes — it's tiny. +## Slide 3 — Three things. 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: id, name, environment, infrastructure -3. **A one-line CI definition** — a thin `uses:` wrapper pointing at a versioned platform workflow - ```yaml id: msvc name: microservice @@ -84,53 +72,166 @@ infrastructure: port: 8080 ``` -The developer does **not**: +1. **App code** — the consumer's service, at the top level of the repo +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 -- Write infrastructure modules. -- Author workflow YAML beyond the one-line `uses:` wrapper. -- Clone the platform repo. -- Hold cloud credentials. -- Maintain a state backend, a VPC, or a runner. +The developer does **not**: write infrastructure modules, clone the platform repo, hold cloud credentials, or maintain a state backend. > **Speaker notes:** Hold this slide. The audience should sit with how small the consumer surface is. Every item in the "does not" list is a category of toil the platform removes. The contract is the API — deliberately tiny so that it can be reviewed, validated, and audited. For the Head of DevOps: this is the lever for throughput — the bottleneck moves off the platform team's ticket queue. --- -## Slide 4 — The Developer Feedback Loop - -Once you push, here's what you see — in real time, in your own logs. +## Slide 4 — See what the platform does, in real time 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. -- **PR comments after every successful pipeline stage** — a developer always knows where they stand without refreshing a dashboard. +- **Streamed output by default** — the 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. - **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 go to encrypted Parameter Store (KMS-encrypted, namespaced), never to logs. -- **Errors become GitHub issues, automatically** — a failed deploy opens an issue on the platform repo. The consumer's only grant is the onboarding-granted Lambda-invoke permission — no separate `issues: write` scope on the consumer side. +- **Errors become GitHub issues, automatically** — a failed deploy opens an issue on the platform repo. -> **Speaker notes:** This directly answers "but developers hate platforms that hide what they're doing." The platform is opinionated about *what* runs, not *opaque* about *that* it runs. The PR-comment-after-each-stage pattern is a small thing that compounds into trust. The "errors become issues" point is a DX win that also helps the platform team — every consumer failure is a tracked, queryable artifact, not a lost log line. The Head of DevOps should hear: the platform closes the feedback loop, it doesn't just push a green/red status. +> **Speaker notes:** This directly answers "but developers hate platforms that hide what they're doing." The platform is opinionated about *what* runs, not *opaque* about *that* it runs. The PR-comment-after-each-stage pattern is a small thing that compounds into trust. The "errors become issues" point is a DX win that also helps the platform team — every consumer failure is a tracked, queryable artifact, not a lost log line. --- -## Slide 5 — Versioned, Predictable Releases +## Slide 5 — Pick from pre-built, security-reviewed blocks -You control when you absorb platform improvements — no surprise upgrades. +Developers pick from **pre-built, security-reviewed building blocks.** Testing + +```mermaid +flowchart LR + subgraph PRIM ["Primitives"] + direction TB + P1["S3"] + P2["VPC"] + P3["ECS"] + P4["IAM"] + P5["ALB"] + P6["ECR"] + P7["CloudFront"] + P8["WAF"] + P9["RDS"] + end + subgraph MOD ["Modules — composed patterns"] + direction TB + M1["Static site\nCDN + WAF + S3"] + M2["Microservice\nVPC + ECS + ALB + ECR"] + end + PRIM --> MOD +``` + +- **Primitives** — single-purpose resources (S3, VPC, ECS, IAM, ALB, ECR, CloudFront, WAF, RDS), each with documented inputs/outputs and versioning. +- **Modules** — composed patterns (a static site with CDN + WAF; a microservice with VPC + ECS + ALB + ECR). +- **Validated examples per module** — `simple.yaml` + `complex.yaml`, validated against the contract schema in CI. Examples cannot drift from the schema silently. +- **Auto-promotion of patterns** — auto-promoted to the catalog after 3 observed usages. Planned Agentic +- **Compliance extension points** — each module lists where GDPR, SOX, SOC2, DORA controls will wire in. Planned + +> **Speaker notes:** The catalog is what makes "declare intent" practical — you can only declare a module that exists. For leadership: the catalog is the leverage. One well-reviewed module serves every consumer; a fix to the module serves every consumer on the next run. This is the compounding asset. + +--- + +## Slide 6 — The bar rises automatically with sensitivity + +The contract is environment-agnostic. The platform raises the bar automatically. + +```mermaid +flowchart LR + DEV["dev
      autonomous"] -->|raise the bar| QA["qa
      QA attests"] + QA -->|raise the bar| PROD["prod
      SRE attests"] + PROD -->|raise the bar| DR["dr
      SRE attests + DR drill"] +``` + +| Environment | What the platform adds | Maturity | +|---|---|---| +| dev | Confidence ≥ 0.50, fully autonomous | Testing | +| qa | QA human attestation + confidence ≥ 0.75 | Planned | +| prod | SRE human attestation + confidence ≥ 0.90 | Planned | +| dr | SRE human attestation + confidence ≥ 0.95 + DR drill reference | Planned | + +- **No staging environment** — the design deliberately removes the "staging is basically prod but not really" anti-pattern. +- **Separation of duties is enforced** — the QA approver cannot be the prod approver. +- **Timeout discipline** — 1 business day = warn + escalate; 2 business days = auto-freeze + re-submit. + +> **Speaker notes:** Promotion is a workflow choice, not a contract mutation — this matters because it means a promotion can be reviewed as a *diff in the workflow*, not as a rewritten contract. The DX win: the contract stays stable across environments; the safety win: the platform raises the threshold and attestation bar automatically based on the target environment. The consumer can't bypass the gates — they pick *which* environment to target, and the platform applies the right bar. Be honest about maturity: dev is tested and pilot-ready; qa/prod/dr wiring is planned. + +--- + +## Slide 7 — Tearing down is as gated as deploying + +Tearing down a stack is **as deliberate as deploying one.** Testing + +```mermaid +flowchart LR + A["Validate CR\n(CMDB)"] + B["Disable\nprevent_destroy"] + C["SRE\napprove"] + D["Zero counts\n+ destroy"] + E["SRE\napprove"] + F["Key enters\ngrace window"] + A --> B --> C --> D --> E --> F +``` + +```yaml +uses: acdl/.github/workflows/deploy.yml@v1.12 +with: + contract: .acdl/contract.yml + mode: decommission + changeRequestId: "CHG0678912" +``` + +A 2-step pipeline with **two SRE human-attestation gates**: + +1. **Validate the change request** — the platform queries the CMDB and asserts the CR is `approved` and matches the consumer repo. No CR, no decommission. +2. **Disable deletion protection** → **SRE approves** → **Zero all counts + destroy** → **a second SRE approves.** + +The per-stack encryption key enters a **grace window** (default 30 days) so encrypted data remains recoverable. + +> **Speaker notes:** The counter-argument to "deletion protection makes cleanup impossible" is this slide. Decommission is a first-class, gated, two-approval flow — not a lock with no key, and not an ungated `terraform destroy`. For the Head of Infrastructure: the CMDB validation means decommission is auditable, not just possible. + +--- + +## Slide 8 — You control when you absorb improvements Consumers control **when** they absorb platform improvements. Testing -- **Floating MAJOR + MINOR tags** (e.g. `@v1.12`) — a consumer automatically receives patch updates within the line. +```mermaid +flowchart LR + subgraph FLOAT ["@v1.12 — floating MAJOR+MINOR"] + direction LR + F1["v1.12.0"] + F2["v1.12.1"] + F3["v1.12.2"] + F1 --> F2 --> F3 + end + subgraph PIN ["@v1.12.2 — pinned exact"] + direction LR + P1["v1.12.2"] + P2["v1.12.2"] + P3["v1.12.2"] + P1 --> P2 --> P3 + end + subgraph MAJ ["@v1 — float MAJOR only"] + direction LR + M1["v1.12.0"] + M2["v1.13.0"] + M3["v1.14.0"] + M1 --> M2 --> M3 + end +``` + +- **Floating MAJOR + MINOR tags** (e.g. `@v1.12`) — automatically receive 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. +- **Pin to an exact version** for maximum stability, or float on MAJOR only (`@v1`) to absorb new features on your 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. > **Speaker notes:** This is the "no surprise upgrades" story. Leadership hears two things: (1) consumers aren't forced to chase the platform, (2) the platform isn't forced to support N forks of every workflow. The versioning discipline is what makes both true. --- -## Slide 6 — Friendly Onboarding - -First impressions matter — the platform fails gracefully, not opaquely. +## Slide 9 — Fails gracefully, not opaquely First impressions of a platform are made **when it fails for the first time.** The platform fails gracefully. Testing @@ -149,114 +250,15 @@ The pipeline then **exits without attempting a deployment** — no partial state --- -## Slide 7 — Safe Promotion Path +## Slide 10 — The desired outcomes -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. - -```mermaid -flowchart LR - DEV["dev
      autonomous"] -->|raise the bar| QA["qa
      QA attests"] - QA -->|raise the bar| PROD["prod
      SRE attests"] - PROD -->|raise the bar| DR["dr
      SRE attests + DR drill"] -``` - -**Approach A — One contract, one job per environment.** A single contract is referenced by multiple jobs; the environment is passed by each job and interpolated at runtime. The contract itself never changes. - -```yaml -jobs: - dev: - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract.yml, environment: dev } - qa: - needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.12 - 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. - -```yaml -jobs: - dev: - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract-dev.yaml } - qa: - needs: dev - uses: acdl/.github/workflows/deploy.yml@v1.12 - with: { contract: .acdl/contract-qa.yaml } -``` - -Whichever approach a team picks, the platform applies the same rising bar: - -| Environment | What the platform adds | Maturity | -|---|---|---| -| dev | Confidence ≥ 0.50, fully autonomous | Testing | -| qa | QA human attestation + confidence ≥ 0.75 | Planned | -| prod | SRE human attestation + confidence ≥ 0.90 | Planned | -| dr | SRE human attestation + confidence ≥ 0.95 + a disaster-recovery drill reference | Planned | - -- **No staging environment** — the design deliberately removes the "staging is basically prod but not really" anti-pattern. Dev is the only autonomous environment. -- **Separation of duties is enforced** — the QA approver cannot be the prod approver. -- **Timeout discipline** — 1 business day = warn + escalate; 2 business days = auto-freeze + re-submit. - -> **Speaker notes:** Promotion is a workflow choice, not a contract mutation — this matters because it means a promotion can be reviewed as a *diff in the workflow*, not as a rewritten contract. Approach A keeps the single source of truth; Approach B lets teams whose inputs genuinely vary keep that variation explicit and reviewable. For leadership: the DX win is that the contract stays stable across environments; the safety win is that the platform raises the threshold and attestation bar automatically based on the target environment the job declares. The consumer can't bypass the gates — they pick *which* environment to target, and the platform applies the right bar. Be honest about maturity: dev is tested and pilot-ready; qa/prod/dr wiring is planned. - ---- - -## Slide 8 — Safe Decommission - -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.12 -with: - contract: .acdl/contract.yml - mode: decommission - changeRequestId: "CHG0678912" -``` - -A 2-step pipeline with **two SRE human-attestation gates**: - -1. **Validate the change request** — the platform queries the CMDB and asserts the CR is `approved` and matches the consumer repo. No CR, no decommission. -2. **Disable deletion protection** → **SRE approves** → **Zero all counts + destroy** → **a second SRE approves.** - -The per-stack encryption key enters a **grace window** (default 30 days) so encrypted data remains recoverable. The key is permanently deleted only after the window expires. - -> **Speaker notes:** The counter-argument to "deletion protection makes cleanup impossible" is this slide. Decommission is a first-class, gated, two-approval flow — not a lock with no key, and not an ungated `terraform destroy`. For the Head of Infrastructure: the CMDB validation means decommission is auditable, not just possible. - ---- - -## Slide 9 — Self-Service Module Catalog - -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 has documented inputs/outputs, usage, compliance extension points, and versioning. -- **Modules** — composed patterns (a static site with CDN + WAF; a microservice with VPC + ECS + load balancer + registry). -- **Validated examples per module** — `simple.yaml` + `complex.yaml` + variation files, validated against the contract schema in CI. Examples cannot drift from the schema silently. -- **Auto-promotion of patterns** — auto-promoted to the catalog after 3 observed usages. Planned Agentic -- **Compliance extension points** — each module lists where GDPR, SOX, SOC2, DORA controls will wire in. Planned - -> **Speaker notes:** The catalog is what makes "declare intent" practical — you can only declare a module that exists. For leadership: the catalog is the leverage. One well-reviewed module serves every consumer; a fix to the module serves every consumer on the next run. This is the compounding asset. - ---- - -## Slide 10 — The Desired Outcomes - -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. Encryption, deletion protection, uptime monitoring, policy checks, and evidence are on by construction. -- **Auditability as a byproduct, not a project.** Every production change is traceable to a human attestation and a tamper-evident evidence event — captured during the deploy, not reconstructed for the audit. -- **Blast radius contained by design.** Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources. One consumer can never affect another. -- **The bottleneck moves off the platform team's ticket queue.** A merged change progresses through lower environments without a platform engineer joining a thread. The platform team invests in the platform, not in per-deployment hand-holding. -- **Infrastructure as a utility, not a craft.** Teams consume infrastructure, they don't maintain it — and the platform compounds value over time by learning from recurring patterns. -- **A path to the citizen developer.** The same safety envelope that serves a senior engineer will serve a non-technical consumer. Agentic +- **Velocity without sacrificing safety.** Speed is in the ergonomics; 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. +- **Blast radius contained by design.** Zero-trust OIDC + ABAC means a consumer can only touch its own tagged resources. +- **The bottleneck moves off the platform team's ticket queue.** A merged change progresses through lower environments without a platform engineer joining a thread. +- **Infrastructure as a utility, not a craft.** Teams consume infrastructure, they don't maintain it. +- **A path to the citizen developer.** The same safety envelope serves a senior engineer and a non-technical consumer. Agentic > **Speaker notes:** Close on the strategic frame. The platform is not "a CI/CD tool" — it is the organizational lever for shipping safely at the pace the business demands, with the security and audit posture the regulators require. Invite questions; the companion deck ("How the Platform Works") covers the internal mechanics in more depth.