agentic-team-templates 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +280 -0
- package/bin/cli.js +5 -0
- package/package.json +47 -0
- package/src/index.js +521 -0
- package/templates/_shared/code-quality.md +162 -0
- package/templates/_shared/communication.md +114 -0
- package/templates/_shared/core-principles.md +62 -0
- package/templates/_shared/git-workflow.md +165 -0
- package/templates/_shared/security-fundamentals.md +173 -0
- package/templates/blockchain/.cursorrules/defi-patterns.md +520 -0
- package/templates/blockchain/.cursorrules/gas-optimization.md +339 -0
- package/templates/blockchain/.cursorrules/overview.md +130 -0
- package/templates/blockchain/.cursorrules/security.md +318 -0
- package/templates/blockchain/.cursorrules/smart-contracts.md +364 -0
- package/templates/blockchain/.cursorrules/testing.md +415 -0
- package/templates/blockchain/.cursorrules/web3-integration.md +538 -0
- package/templates/blockchain/CLAUDE.md +389 -0
- package/templates/cli-tools/.cursorrules/architecture.md +412 -0
- package/templates/cli-tools/.cursorrules/arguments.md +406 -0
- package/templates/cli-tools/.cursorrules/distribution.md +546 -0
- package/templates/cli-tools/.cursorrules/error-handling.md +455 -0
- package/templates/cli-tools/.cursorrules/overview.md +136 -0
- package/templates/cli-tools/.cursorrules/testing.md +537 -0
- package/templates/cli-tools/.cursorrules/user-experience.md +545 -0
- package/templates/cli-tools/CLAUDE.md +356 -0
- package/templates/data-engineering/.cursorrules/data-modeling.md +367 -0
- package/templates/data-engineering/.cursorrules/data-quality.md +455 -0
- package/templates/data-engineering/.cursorrules/overview.md +85 -0
- package/templates/data-engineering/.cursorrules/performance.md +339 -0
- package/templates/data-engineering/.cursorrules/pipeline-design.md +280 -0
- package/templates/data-engineering/.cursorrules/security.md +460 -0
- package/templates/data-engineering/.cursorrules/testing.md +452 -0
- package/templates/data-engineering/CLAUDE.md +974 -0
- package/templates/devops-sre/.cursorrules/capacity-planning.md +653 -0
- package/templates/devops-sre/.cursorrules/change-management.md +584 -0
- package/templates/devops-sre/.cursorrules/chaos-engineering.md +651 -0
- package/templates/devops-sre/.cursorrules/disaster-recovery.md +641 -0
- package/templates/devops-sre/.cursorrules/incident-management.md +565 -0
- package/templates/devops-sre/.cursorrules/observability.md +714 -0
- package/templates/devops-sre/.cursorrules/overview.md +230 -0
- package/templates/devops-sre/.cursorrules/postmortems.md +588 -0
- package/templates/devops-sre/.cursorrules/runbooks.md +760 -0
- package/templates/devops-sre/.cursorrules/slo-sli.md +617 -0
- package/templates/devops-sre/.cursorrules/toil-reduction.md +567 -0
- package/templates/devops-sre/CLAUDE.md +1007 -0
- package/templates/documentation/.cursorrules/adr.md +277 -0
- package/templates/documentation/.cursorrules/api-documentation.md +411 -0
- package/templates/documentation/.cursorrules/code-comments.md +253 -0
- package/templates/documentation/.cursorrules/maintenance.md +260 -0
- package/templates/documentation/.cursorrules/overview.md +82 -0
- package/templates/documentation/.cursorrules/readme-standards.md +306 -0
- package/templates/documentation/CLAUDE.md +120 -0
- package/templates/fullstack/.cursorrules/api-contracts.md +331 -0
- package/templates/fullstack/.cursorrules/architecture.md +298 -0
- package/templates/fullstack/.cursorrules/overview.md +109 -0
- package/templates/fullstack/.cursorrules/shared-types.md +348 -0
- package/templates/fullstack/.cursorrules/testing.md +386 -0
- package/templates/fullstack/CLAUDE.md +349 -0
- package/templates/ml-ai/.cursorrules/data-engineering.md +483 -0
- package/templates/ml-ai/.cursorrules/deployment.md +601 -0
- package/templates/ml-ai/.cursorrules/model-development.md +538 -0
- package/templates/ml-ai/.cursorrules/monitoring.md +658 -0
- package/templates/ml-ai/.cursorrules/overview.md +131 -0
- package/templates/ml-ai/.cursorrules/security.md +637 -0
- package/templates/ml-ai/.cursorrules/testing.md +678 -0
- package/templates/ml-ai/CLAUDE.md +1136 -0
- package/templates/mobile/.cursorrules/navigation.md +246 -0
- package/templates/mobile/.cursorrules/offline-first.md +302 -0
- package/templates/mobile/.cursorrules/overview.md +71 -0
- package/templates/mobile/.cursorrules/performance.md +345 -0
- package/templates/mobile/.cursorrules/testing.md +339 -0
- package/templates/mobile/CLAUDE.md +233 -0
- package/templates/platform-engineering/.cursorrules/ci-cd.md +778 -0
- package/templates/platform-engineering/.cursorrules/developer-experience.md +632 -0
- package/templates/platform-engineering/.cursorrules/infrastructure-as-code.md +600 -0
- package/templates/platform-engineering/.cursorrules/kubernetes.md +710 -0
- package/templates/platform-engineering/.cursorrules/observability.md +747 -0
- package/templates/platform-engineering/.cursorrules/overview.md +215 -0
- package/templates/platform-engineering/.cursorrules/security.md +855 -0
- package/templates/platform-engineering/.cursorrules/testing.md +878 -0
- package/templates/platform-engineering/CLAUDE.md +850 -0
- package/templates/utility-agent/.cursorrules/action-control.md +284 -0
- package/templates/utility-agent/.cursorrules/context-management.md +186 -0
- package/templates/utility-agent/.cursorrules/hallucination-prevention.md +253 -0
- package/templates/utility-agent/.cursorrules/overview.md +78 -0
- package/templates/utility-agent/.cursorrules/token-optimization.md +369 -0
- package/templates/utility-agent/CLAUDE.md +513 -0
- package/templates/web-backend/.cursorrules/api-design.md +255 -0
- package/templates/web-backend/.cursorrules/authentication.md +309 -0
- package/templates/web-backend/.cursorrules/database-patterns.md +298 -0
- package/templates/web-backend/.cursorrules/error-handling.md +366 -0
- package/templates/web-backend/.cursorrules/overview.md +69 -0
- package/templates/web-backend/.cursorrules/security.md +358 -0
- package/templates/web-backend/.cursorrules/testing.md +395 -0
- package/templates/web-backend/CLAUDE.md +366 -0
- package/templates/web-frontend/.cursorrules/accessibility.md +296 -0
- package/templates/web-frontend/.cursorrules/component-patterns.md +204 -0
- package/templates/web-frontend/.cursorrules/overview.md +72 -0
- package/templates/web-frontend/.cursorrules/performance.md +325 -0
- package/templates/web-frontend/.cursorrules/state-management.md +227 -0
- package/templates/web-frontend/.cursorrules/styling.md +271 -0
- package/templates/web-frontend/.cursorrules/testing.md +311 -0
- package/templates/web-frontend/CLAUDE.md +399 -0
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
# Developer Experience
|
|
2
|
+
|
|
3
|
+
Guidelines for building internal developer platforms that developers love to use.
|
|
4
|
+
|
|
5
|
+
## Core Principles
|
|
6
|
+
|
|
7
|
+
1. **Developers Are Your Customers** - Understand their needs, measure satisfaction
|
|
8
|
+
2. **Golden Paths, Not Golden Cages** - Opinionated defaults with escape hatches
|
|
9
|
+
3. **Self-Service First** - Reduce time-to-value without tickets
|
|
10
|
+
4. **Documentation Is Product** - If it's not documented, it doesn't exist
|
|
11
|
+
5. **Fast Feedback Loops** - Minutes, not hours or days
|
|
12
|
+
|
|
13
|
+
## Internal Developer Platform (IDP)
|
|
14
|
+
|
|
15
|
+
### Platform Capabilities Matrix
|
|
16
|
+
|
|
17
|
+
| Capability | Self-Service Level | Time to Complete |
|
|
18
|
+
|------------|-------------------|------------------|
|
|
19
|
+
| Create new service | Fully automated | < 5 minutes |
|
|
20
|
+
| Deploy to staging | Fully automated | < 10 minutes |
|
|
21
|
+
| Deploy to production | Approval-gated | < 15 minutes |
|
|
22
|
+
| Provision database | Fully automated | < 5 minutes |
|
|
23
|
+
| Request cloud resources | Template-based | < 30 minutes |
|
|
24
|
+
| View service health | Always available | Instant |
|
|
25
|
+
| Access logs/traces | Always available | Instant |
|
|
26
|
+
| Rotate secrets | Self-service | < 2 minutes |
|
|
27
|
+
|
|
28
|
+
### Service Scaffolding (Backstage)
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
# backstage/templates/microservice/template.yaml
|
|
32
|
+
apiVersion: scaffolder.backstage.io/v1beta3
|
|
33
|
+
kind: Template
|
|
34
|
+
metadata:
|
|
35
|
+
name: microservice-template
|
|
36
|
+
title: Production Microservice
|
|
37
|
+
description: |
|
|
38
|
+
Create a production-ready microservice with all platform integrations:
|
|
39
|
+
- CI/CD pipeline
|
|
40
|
+
- Kubernetes manifests
|
|
41
|
+
- Observability (metrics, logs, traces)
|
|
42
|
+
- Documentation scaffold
|
|
43
|
+
tags:
|
|
44
|
+
- recommended
|
|
45
|
+
- nodejs
|
|
46
|
+
- python
|
|
47
|
+
- go
|
|
48
|
+
spec:
|
|
49
|
+
owner: platform-team
|
|
50
|
+
type: service
|
|
51
|
+
|
|
52
|
+
parameters:
|
|
53
|
+
- title: Service Information
|
|
54
|
+
required:
|
|
55
|
+
- name
|
|
56
|
+
- owner
|
|
57
|
+
- language
|
|
58
|
+
properties:
|
|
59
|
+
name:
|
|
60
|
+
title: Service Name
|
|
61
|
+
type: string
|
|
62
|
+
description: Lowercase, alphanumeric, hyphens allowed
|
|
63
|
+
pattern: '^[a-z][a-z0-9-]*[a-z0-9]$'
|
|
64
|
+
maxLength: 63
|
|
65
|
+
ui:autofocus: true
|
|
66
|
+
|
|
67
|
+
description:
|
|
68
|
+
title: Description
|
|
69
|
+
type: string
|
|
70
|
+
description: What does this service do?
|
|
71
|
+
|
|
72
|
+
owner:
|
|
73
|
+
title: Owner
|
|
74
|
+
type: string
|
|
75
|
+
description: Team that owns this service
|
|
76
|
+
ui:field: OwnerPicker
|
|
77
|
+
ui:options:
|
|
78
|
+
catalogFilter:
|
|
79
|
+
kind: Group
|
|
80
|
+
|
|
81
|
+
language:
|
|
82
|
+
title: Language
|
|
83
|
+
type: string
|
|
84
|
+
enum:
|
|
85
|
+
- nodejs
|
|
86
|
+
- python
|
|
87
|
+
- go
|
|
88
|
+
enumNames:
|
|
89
|
+
- Node.js (TypeScript)
|
|
90
|
+
- Python
|
|
91
|
+
- Go
|
|
92
|
+
|
|
93
|
+
- title: Infrastructure
|
|
94
|
+
properties:
|
|
95
|
+
needsDatabase:
|
|
96
|
+
title: Needs Database
|
|
97
|
+
type: boolean
|
|
98
|
+
default: false
|
|
99
|
+
|
|
100
|
+
databaseType:
|
|
101
|
+
title: Database Type
|
|
102
|
+
type: string
|
|
103
|
+
enum: [postgresql, mysql]
|
|
104
|
+
ui:widget: select
|
|
105
|
+
dependencies:
|
|
106
|
+
needsDatabase:
|
|
107
|
+
oneOf:
|
|
108
|
+
- const: true
|
|
109
|
+
|
|
110
|
+
needsCache:
|
|
111
|
+
title: Needs Cache
|
|
112
|
+
type: boolean
|
|
113
|
+
default: false
|
|
114
|
+
|
|
115
|
+
needsQueue:
|
|
116
|
+
title: Needs Message Queue
|
|
117
|
+
type: boolean
|
|
118
|
+
default: false
|
|
119
|
+
|
|
120
|
+
- title: Repository
|
|
121
|
+
required:
|
|
122
|
+
- repoUrl
|
|
123
|
+
properties:
|
|
124
|
+
repoUrl:
|
|
125
|
+
title: Repository Location
|
|
126
|
+
type: string
|
|
127
|
+
ui:field: RepoUrlPicker
|
|
128
|
+
ui:options:
|
|
129
|
+
allowedHosts:
|
|
130
|
+
- github.com
|
|
131
|
+
allowedOwners:
|
|
132
|
+
- company
|
|
133
|
+
|
|
134
|
+
steps:
|
|
135
|
+
- id: fetch-base
|
|
136
|
+
name: Fetch Base Template
|
|
137
|
+
action: fetch:template
|
|
138
|
+
input:
|
|
139
|
+
url: ./skeleton/${{ parameters.language }}
|
|
140
|
+
values:
|
|
141
|
+
name: ${{ parameters.name }}
|
|
142
|
+
description: ${{ parameters.description }}
|
|
143
|
+
owner: ${{ parameters.owner }}
|
|
144
|
+
needsDatabase: ${{ parameters.needsDatabase }}
|
|
145
|
+
databaseType: ${{ parameters.databaseType }}
|
|
146
|
+
needsCache: ${{ parameters.needsCache }}
|
|
147
|
+
needsQueue: ${{ parameters.needsQueue }}
|
|
148
|
+
|
|
149
|
+
- id: fetch-kubernetes
|
|
150
|
+
name: Fetch Kubernetes Manifests
|
|
151
|
+
action: fetch:template
|
|
152
|
+
input:
|
|
153
|
+
url: ./kubernetes
|
|
154
|
+
targetPath: ./kubernetes
|
|
155
|
+
values:
|
|
156
|
+
name: ${{ parameters.name }}
|
|
157
|
+
owner: ${{ parameters.owner }}
|
|
158
|
+
|
|
159
|
+
- id: fetch-docs
|
|
160
|
+
name: Fetch Documentation Template
|
|
161
|
+
action: fetch:template
|
|
162
|
+
input:
|
|
163
|
+
url: ./docs
|
|
164
|
+
targetPath: ./docs
|
|
165
|
+
values:
|
|
166
|
+
name: ${{ parameters.name }}
|
|
167
|
+
description: ${{ parameters.description }}
|
|
168
|
+
|
|
169
|
+
- id: publish
|
|
170
|
+
name: Publish to GitHub
|
|
171
|
+
action: publish:github
|
|
172
|
+
input:
|
|
173
|
+
allowedHosts: ['github.com']
|
|
174
|
+
repoUrl: ${{ parameters.repoUrl }}
|
|
175
|
+
defaultBranch: main
|
|
176
|
+
protectDefaultBranch: true
|
|
177
|
+
requiredApprovingReviewCount: 1
|
|
178
|
+
|
|
179
|
+
- id: create-argocd-app
|
|
180
|
+
name: Create Argo CD Application
|
|
181
|
+
action: argocd:create-resources
|
|
182
|
+
input:
|
|
183
|
+
appName: ${{ parameters.name }}
|
|
184
|
+
projectName: default
|
|
185
|
+
repoUrl: ${{ steps.publish.output.remoteUrl }}
|
|
186
|
+
path: kubernetes/overlays/dev
|
|
187
|
+
|
|
188
|
+
- id: register
|
|
189
|
+
name: Register in Catalog
|
|
190
|
+
action: catalog:register
|
|
191
|
+
input:
|
|
192
|
+
repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
|
|
193
|
+
catalogInfoPath: /catalog-info.yaml
|
|
194
|
+
|
|
195
|
+
output:
|
|
196
|
+
links:
|
|
197
|
+
- title: Repository
|
|
198
|
+
url: ${{ steps.publish.output.remoteUrl }}
|
|
199
|
+
- title: Open in Catalog
|
|
200
|
+
icon: catalog
|
|
201
|
+
entityRef: ${{ steps.register.output.entityRef }}
|
|
202
|
+
- title: View in Argo CD
|
|
203
|
+
url: https://argocd.example.com/applications/${{ parameters.name }}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Service Catalog Entry
|
|
207
|
+
|
|
208
|
+
```yaml
|
|
209
|
+
# catalog-info.yaml
|
|
210
|
+
apiVersion: backstage.io/v1alpha1
|
|
211
|
+
kind: Component
|
|
212
|
+
metadata:
|
|
213
|
+
name: api-server
|
|
214
|
+
description: Main API server for the platform
|
|
215
|
+
annotations:
|
|
216
|
+
github.com/project-slug: company/api-server
|
|
217
|
+
argocd/app-name: api-server
|
|
218
|
+
prometheus.io/alert: api-server
|
|
219
|
+
pagerduty.com/service-id: P123ABC
|
|
220
|
+
sonarqube.org/project-key: company_api-server
|
|
221
|
+
tags:
|
|
222
|
+
- nodejs
|
|
223
|
+
- typescript
|
|
224
|
+
- api
|
|
225
|
+
links:
|
|
226
|
+
- url: https://api.example.com
|
|
227
|
+
title: Production URL
|
|
228
|
+
- url: https://grafana.example.com/d/api-server
|
|
229
|
+
title: Grafana Dashboard
|
|
230
|
+
- url: https://runbooks.example.com/api-server
|
|
231
|
+
title: Runbook
|
|
232
|
+
spec:
|
|
233
|
+
type: service
|
|
234
|
+
lifecycle: production
|
|
235
|
+
owner: platform-team
|
|
236
|
+
system: core-platform
|
|
237
|
+
|
|
238
|
+
dependsOn:
|
|
239
|
+
- resource:default/postgres-main
|
|
240
|
+
- resource:default/redis-cache
|
|
241
|
+
|
|
242
|
+
providesApis:
|
|
243
|
+
- api-server-rest
|
|
244
|
+
|
|
245
|
+
consumesApis:
|
|
246
|
+
- auth-service-api
|
|
247
|
+
- notification-service-api
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Golden Paths
|
|
251
|
+
|
|
252
|
+
### What Makes a Good Golden Path
|
|
253
|
+
|
|
254
|
+
1. **Low Friction** - Works out of the box
|
|
255
|
+
2. **Well Documented** - Clear guides and examples
|
|
256
|
+
3. **Best Practices Built-In** - Security, observability, reliability
|
|
257
|
+
4. **Escape Hatches** - Can deviate when justified
|
|
258
|
+
5. **Maintained** - Kept up to date with dependencies
|
|
259
|
+
|
|
260
|
+
### Example Golden Path: New Service
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
264
|
+
│ 1. Create Service (5 min) │
|
|
265
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
266
|
+
│ │ Backstage Template → GitHub Repo → Argo CD App │ │
|
|
267
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
268
|
+
│ ↓ │
|
|
269
|
+
│ 2. First Deploy to Dev (10 min) │
|
|
270
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
271
|
+
│ │ git push → CI Pipeline → Container Build → Deploy │ │
|
|
272
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
273
|
+
│ ↓ │
|
|
274
|
+
│ 3. Verify (2 min) │
|
|
275
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
276
|
+
│ │ Health Check → Logs in Grafana → Traces in Tempo │ │
|
|
277
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
278
|
+
│ ↓ │
|
|
279
|
+
│ 4. Production Ready (varies) │
|
|
280
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
281
|
+
│ │ Tests → Security Scan → Staging → Approval → Production │ │
|
|
282
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
283
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Database Golden Path
|
|
287
|
+
|
|
288
|
+
```yaml
|
|
289
|
+
# Self-service database provisioning via Crossplane
|
|
290
|
+
apiVersion: database.example.com/v1alpha1
|
|
291
|
+
kind: PostgreSQLInstance
|
|
292
|
+
metadata:
|
|
293
|
+
name: api-server-db
|
|
294
|
+
namespace: production
|
|
295
|
+
spec:
|
|
296
|
+
# Pre-defined size classes
|
|
297
|
+
sizeClass: small # small, medium, large, xlarge
|
|
298
|
+
|
|
299
|
+
# Automatic configuration
|
|
300
|
+
version: "15"
|
|
301
|
+
highAvailability: true
|
|
302
|
+
|
|
303
|
+
# Backup policy (automatic)
|
|
304
|
+
backupRetentionDays: 30
|
|
305
|
+
|
|
306
|
+
# Connection pooling (automatic)
|
|
307
|
+
enablePgBouncer: true
|
|
308
|
+
|
|
309
|
+
# Monitoring (automatic)
|
|
310
|
+
enableMetrics: true
|
|
311
|
+
|
|
312
|
+
# Owner for access
|
|
313
|
+
ownerRef:
|
|
314
|
+
kind: Component
|
|
315
|
+
name: api-server
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
# Size class definitions (managed by platform team)
|
|
319
|
+
# small: 1 vCPU, 2GB RAM, 20GB storage
|
|
320
|
+
# medium: 2 vCPU, 4GB RAM, 50GB storage
|
|
321
|
+
# large: 4 vCPU, 8GB RAM, 100GB storage
|
|
322
|
+
# xlarge: 8 vCPU, 16GB RAM, 200GB storage
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Documentation Standards
|
|
326
|
+
|
|
327
|
+
### Service Documentation Template
|
|
328
|
+
|
|
329
|
+
```markdown
|
|
330
|
+
# Service Name
|
|
331
|
+
|
|
332
|
+
## Overview
|
|
333
|
+
Brief description of what this service does and why it exists.
|
|
334
|
+
|
|
335
|
+
## Quick Start
|
|
336
|
+
\`\`\`bash
|
|
337
|
+
# Clone and run locally
|
|
338
|
+
git clone https://github.com/company/service-name
|
|
339
|
+
cd service-name
|
|
340
|
+
make dev
|
|
341
|
+
\`\`\`
|
|
342
|
+
|
|
343
|
+
## API Reference
|
|
344
|
+
Link to OpenAPI spec or API documentation.
|
|
345
|
+
|
|
346
|
+
## Architecture
|
|
347
|
+
High-level architecture diagram and key design decisions.
|
|
348
|
+
|
|
349
|
+
## Configuration
|
|
350
|
+
| Variable | Description | Default | Required |
|
|
351
|
+
|----------|-------------|---------|----------|
|
|
352
|
+
| DATABASE_URL | PostgreSQL connection string | - | Yes |
|
|
353
|
+
| LOG_LEVEL | Logging verbosity | info | No |
|
|
354
|
+
|
|
355
|
+
## Runbook
|
|
356
|
+
|
|
357
|
+
### Common Issues
|
|
358
|
+
|
|
359
|
+
#### Service won't start
|
|
360
|
+
1. Check database connectivity
|
|
361
|
+
2. Verify environment variables
|
|
362
|
+
3. Check resource limits
|
|
363
|
+
|
|
364
|
+
#### High latency
|
|
365
|
+
1. Check database query times
|
|
366
|
+
2. Review recent deployments
|
|
367
|
+
3. Check downstream services
|
|
368
|
+
|
|
369
|
+
### Escalation
|
|
370
|
+
- **L1**: #team-platform-support
|
|
371
|
+
- **L2**: @platform-oncall
|
|
372
|
+
- **L3**: Page platform-engineering
|
|
373
|
+
|
|
374
|
+
## SLOs
|
|
375
|
+
| Metric | Target | Current |
|
|
376
|
+
|--------|--------|---------|
|
|
377
|
+
| Availability | 99.9% | [Dashboard](link) |
|
|
378
|
+
| P99 Latency | < 500ms | [Dashboard](link) |
|
|
379
|
+
|
|
380
|
+
## Links
|
|
381
|
+
- [Grafana Dashboard](link)
|
|
382
|
+
- [Argo CD](link)
|
|
383
|
+
- [PagerDuty](link)
|
|
384
|
+
- [Runbook](link)
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### ADR (Architecture Decision Record) Template
|
|
388
|
+
|
|
389
|
+
```markdown
|
|
390
|
+
# ADR-001: Use PostgreSQL for Primary Database
|
|
391
|
+
|
|
392
|
+
## Status
|
|
393
|
+
Accepted
|
|
394
|
+
|
|
395
|
+
## Context
|
|
396
|
+
We need a primary database for storing application data. Key requirements:
|
|
397
|
+
- ACID compliance
|
|
398
|
+
- Strong consistency
|
|
399
|
+
- JSON support for semi-structured data
|
|
400
|
+
- Mature ecosystem and tooling
|
|
401
|
+
|
|
402
|
+
## Decision
|
|
403
|
+
We will use PostgreSQL as our primary database.
|
|
404
|
+
|
|
405
|
+
## Consequences
|
|
406
|
+
|
|
407
|
+
### Positive
|
|
408
|
+
- Mature, well-understood technology
|
|
409
|
+
- Excellent JSON/JSONB support
|
|
410
|
+
- Strong community and tooling
|
|
411
|
+
- Team has existing expertise
|
|
412
|
+
|
|
413
|
+
### Negative
|
|
414
|
+
- Horizontal scaling requires additional tooling (Citus, read replicas)
|
|
415
|
+
- Not ideal for time-series data at scale
|
|
416
|
+
|
|
417
|
+
### Neutral
|
|
418
|
+
- Need to manage connection pooling (PgBouncer)
|
|
419
|
+
- Regular maintenance (vacuuming, index management)
|
|
420
|
+
|
|
421
|
+
## Alternatives Considered
|
|
422
|
+
|
|
423
|
+
### MySQL
|
|
424
|
+
- Rejected: Weaker JSON support, less feature-rich
|
|
425
|
+
|
|
426
|
+
### MongoDB
|
|
427
|
+
- Rejected: Consistency concerns, team lacks expertise
|
|
428
|
+
|
|
429
|
+
### CockroachDB
|
|
430
|
+
- Rejected: Higher operational complexity for our scale
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Developer Portal Features
|
|
434
|
+
|
|
435
|
+
### Self-Service Capabilities
|
|
436
|
+
|
|
437
|
+
```yaml
|
|
438
|
+
# Backstage plugins for self-service
|
|
439
|
+
plugins:
|
|
440
|
+
# Service scaffolding
|
|
441
|
+
- '@backstage/plugin-scaffolder'
|
|
442
|
+
|
|
443
|
+
# Kubernetes visibility
|
|
444
|
+
- '@backstage/plugin-kubernetes'
|
|
445
|
+
|
|
446
|
+
# CI/CD visibility
|
|
447
|
+
- '@backstage/plugin-github-actions'
|
|
448
|
+
- '@roadiehq/backstage-plugin-argo-cd'
|
|
449
|
+
|
|
450
|
+
# Observability
|
|
451
|
+
- '@backstage/plugin-grafana'
|
|
452
|
+
- '@backstage/plugin-pagerduty'
|
|
453
|
+
|
|
454
|
+
# Documentation
|
|
455
|
+
- '@backstage/plugin-techdocs'
|
|
456
|
+
|
|
457
|
+
# API catalog
|
|
458
|
+
- '@backstage/plugin-api-docs'
|
|
459
|
+
|
|
460
|
+
# Cost visibility
|
|
461
|
+
- '@backstage/plugin-cost-insights'
|
|
462
|
+
|
|
463
|
+
# Security
|
|
464
|
+
- '@backstage/plugin-sonarqube'
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### Developer Metrics Dashboard
|
|
468
|
+
|
|
469
|
+
```yaml
|
|
470
|
+
# Track platform adoption and satisfaction
|
|
471
|
+
metrics:
|
|
472
|
+
adoption:
|
|
473
|
+
- services_using_golden_path
|
|
474
|
+
- services_with_complete_docs
|
|
475
|
+
- services_with_slos_defined
|
|
476
|
+
- services_with_runbooks
|
|
477
|
+
|
|
478
|
+
efficiency:
|
|
479
|
+
- time_to_first_deploy
|
|
480
|
+
- deployment_frequency
|
|
481
|
+
- lead_time_for_changes
|
|
482
|
+
- mttr (mean time to recovery)
|
|
483
|
+
|
|
484
|
+
satisfaction:
|
|
485
|
+
- developer_nps_score
|
|
486
|
+
- platform_support_ticket_volume
|
|
487
|
+
- time_to_resolve_support_tickets
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## Environment Management
|
|
491
|
+
|
|
492
|
+
### Preview Environments
|
|
493
|
+
|
|
494
|
+
```yaml
|
|
495
|
+
# Automatic preview environments for PRs
|
|
496
|
+
apiVersion: argoproj.io/v1alpha1
|
|
497
|
+
kind: ApplicationSet
|
|
498
|
+
metadata:
|
|
499
|
+
name: preview-environments
|
|
500
|
+
spec:
|
|
501
|
+
generators:
|
|
502
|
+
- pullRequest:
|
|
503
|
+
github:
|
|
504
|
+
owner: company
|
|
505
|
+
repo: api-server
|
|
506
|
+
tokenRef:
|
|
507
|
+
secretName: github-token
|
|
508
|
+
key: token
|
|
509
|
+
requeueAfterSeconds: 60
|
|
510
|
+
|
|
511
|
+
template:
|
|
512
|
+
metadata:
|
|
513
|
+
name: 'api-server-pr-{{number}}'
|
|
514
|
+
labels:
|
|
515
|
+
environment: preview
|
|
516
|
+
pr: '{{number}}'
|
|
517
|
+
spec:
|
|
518
|
+
project: preview
|
|
519
|
+
source:
|
|
520
|
+
repoURL: https://github.com/company/api-server.git
|
|
521
|
+
targetRevision: '{{head_sha}}'
|
|
522
|
+
path: kubernetes/overlays/preview
|
|
523
|
+
helm:
|
|
524
|
+
parameters:
|
|
525
|
+
- name: ingress.host
|
|
526
|
+
value: 'pr-{{number}}.preview.example.com'
|
|
527
|
+
destination:
|
|
528
|
+
server: https://kubernetes.default.svc
|
|
529
|
+
namespace: 'preview-{{number}}'
|
|
530
|
+
syncPolicy:
|
|
531
|
+
automated:
|
|
532
|
+
prune: true
|
|
533
|
+
selfHeal: true
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### Environment Promotion
|
|
537
|
+
|
|
538
|
+
```yaml
|
|
539
|
+
# Promote between environments
|
|
540
|
+
# dev -> staging -> production
|
|
541
|
+
apiVersion: batch/v1
|
|
542
|
+
kind: Job
|
|
543
|
+
metadata:
|
|
544
|
+
name: promote-to-staging
|
|
545
|
+
spec:
|
|
546
|
+
template:
|
|
547
|
+
spec:
|
|
548
|
+
containers:
|
|
549
|
+
- name: promote
|
|
550
|
+
image: company/gitops-promoter:latest
|
|
551
|
+
args:
|
|
552
|
+
- promote
|
|
553
|
+
- --from=dev
|
|
554
|
+
- --to=staging
|
|
555
|
+
- --service=api-server
|
|
556
|
+
- --version=$(cat /workspace/version.txt)
|
|
557
|
+
restartPolicy: Never
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
## Support Model
|
|
561
|
+
|
|
562
|
+
### Tiered Support
|
|
563
|
+
|
|
564
|
+
```
|
|
565
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
566
|
+
│ L0: Self-Service │
|
|
567
|
+
│ ├── Documentation │
|
|
568
|
+
│ ├── Runbooks │
|
|
569
|
+
│ ├── FAQs │
|
|
570
|
+
│ └── Automated troubleshooting │
|
|
571
|
+
├─────────────────────────────────────────────────────────────┤
|
|
572
|
+
│ L1: Community Support │
|
|
573
|
+
│ ├── #platform-help Slack channel │
|
|
574
|
+
│ ├── Office hours (weekly) │
|
|
575
|
+
│ └── Response time: 4 hours │
|
|
576
|
+
├─────────────────────────────────────────────────────────────┤
|
|
577
|
+
│ L2: Platform Team │
|
|
578
|
+
│ ├── Escalated tickets │
|
|
579
|
+
│ ├── Complex issues │
|
|
580
|
+
│ └── Response time: 1 hour │
|
|
581
|
+
├─────────────────────────────────────────────────────────────┤
|
|
582
|
+
│ L3: Platform Engineering │
|
|
583
|
+
│ ├── Critical incidents │
|
|
584
|
+
│ ├── Platform bugs │
|
|
585
|
+
│ └── Response time: 15 minutes (PagerDuty) │
|
|
586
|
+
└─────────────────────────────────────────────────────────────┘
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
### Feedback Loops
|
|
590
|
+
|
|
591
|
+
```yaml
|
|
592
|
+
# Quarterly developer surveys
|
|
593
|
+
survey:
|
|
594
|
+
questions:
|
|
595
|
+
- "How easy is it to deploy a new service? (1-10)"
|
|
596
|
+
- "How easy is it to debug production issues? (1-10)"
|
|
597
|
+
- "How well does documentation help you? (1-10)"
|
|
598
|
+
- "What's your biggest pain point?"
|
|
599
|
+
- "What should we build next?"
|
|
600
|
+
|
|
601
|
+
actions:
|
|
602
|
+
- review_results_monthly
|
|
603
|
+
- prioritize_top_pain_points
|
|
604
|
+
- communicate_roadmap_changes
|
|
605
|
+
- follow_up_on_feedback
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
## Common Pitfalls
|
|
609
|
+
|
|
610
|
+
### 1. Building Without User Research
|
|
611
|
+
|
|
612
|
+
❌ **Wrong**: Build what you think developers need
|
|
613
|
+
|
|
614
|
+
✅ **Right**: Interview developers, watch them work, measure pain points
|
|
615
|
+
|
|
616
|
+
### 2. One-Size-Fits-All
|
|
617
|
+
|
|
618
|
+
❌ **Wrong**: Force every team into identical workflows
|
|
619
|
+
|
|
620
|
+
✅ **Right**: Provide golden paths with documented escape hatches
|
|
621
|
+
|
|
622
|
+
### 3. Documentation Rot
|
|
623
|
+
|
|
624
|
+
❌ **Wrong**: Documentation that's always out of date
|
|
625
|
+
|
|
626
|
+
✅ **Right**: Docs-as-code, tested documentation, ownership assignment
|
|
627
|
+
|
|
628
|
+
### 4. Invisible Platform
|
|
629
|
+
|
|
630
|
+
❌ **Wrong**: Developers don't know what the platform offers
|
|
631
|
+
|
|
632
|
+
✅ **Right**: Regular communication, demos, office hours, changelog
|