ADR-028: Platform Foundations
| Field | Value |
|---|---|
| Type | Skill Resource |
| Source | ~/.copilot/skills/adr/references/adr-028-platform-foundations.md |
| Description | Not specified |
Source Content
ADR-028: Platform Foundations
Decision
Kubernetes is the default orchestration platform and Terraform is the default infrastructure-as-code tool. Prefer managed, in-cluster services over self-managed equivalents, and retain persistent storage by default.
Key rules
- Kubernetes is the default orchestration platform — no bare Docker Compose in production.
- Terraform manages infrastructure as code — no manual console clicks for persistent resources.
- Prefer managed in-cluster services (CloudNativePG, Valkey, SeaweedFS) over self-managed equivalents when available.
- Persistent storage must carry the
"helm.sh/resource-policy": keepannotation so it survives a Helm uninstall. - Platform infrastructure lives in
p3-*namespaces — never generic names likemonitoringorlogging. - Kubernetes CRDs are installed as a separate
kubectl applytask before any Helm release that depends on them — never via Helm CRD hooks,installCRDs,crds.enabled, or app-of-apps sync. Helm may install controllers and namespaced resources only after the CRDs exist.
Code patterns
# Retain a PersistentVolumeClaim across a Helm uninstall.apiVersion: v1kind: PersistentVolumeClaimmetadata: name: app-data namespace: p3-app annotations: "helm.sh/resource-policy": keepWhy
A single managed-Kubernetes platform with Terraform-owned infrastructure keeps environments reproducible, auditable, and free of console drift. The keep resource policy prevents accidental data loss when a release is removed. Namespaced p3-* prefixes keep platform components discoverable and collision-free across tenants. The CRD-as-separate-kubectl-task rule reconciles this record with current dmwd-io practice: the global hard rules require CRDs to be applied directly before Helm-managed controllers, so Helm never owns CRD lifecycle even though it provisions the dependent resources.
Applies when
You are setting up CI/CD or infrastructure, writing Helm charts, applying Kubernetes CRDs, or making namespace or persistent-storage decisions.
Related
- ADR-027 — default tech stack (Kubernetes platform stack details).
- ADR-029 — multi-tenancy by default.