@luanpdd/kit-mcp 1.8.1 → 1.10.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/CHANGELOG.md +86 -0
- package/README.md +97 -1
- package/gates/golden-signals-coverage.md +133 -0
- package/gates/obs-agents-mcp-supabase.md +86 -0
- package/gates/obs-skills-frontmatter.md +76 -0
- package/gates/omm-no-regression.md +83 -0
- package/gates/postmortem-template-required.md +127 -0
- package/gates/prr-checklist-coverage.md +128 -0
- package/gates/skill-must-include.md +21 -19
- package/kit/agents/burn-rate-forecaster.md +160 -0
- package/kit/agents/golden-signals-instrumenter.md +241 -0
- package/kit/agents/incident-investigator.md +245 -0
- package/kit/agents/observability-instrumenter.md +200 -0
- package/kit/agents/omm-auditor.md +251 -0
- package/kit/agents/postmortem-writer.md +282 -0
- package/kit/agents/prr-conductor.md +288 -0
- package/kit/agents/slo-engineer.md +224 -0
- package/kit/agents/supabase-architect.md +62 -0
- package/kit/agents/supabase-auth-bootstrapper.md +17 -0
- package/kit/agents/supabase-edge-fn-writer.md +124 -0
- package/kit/agents/supabase-migration-writer.md +98 -0
- package/kit/agents/supabase-realtime-implementer.md +23 -0
- package/kit/agents/supabase-rls-writer.md +17 -0
- package/kit/agents/supabase-storage-implementer.md +174 -0
- package/kit/agents/toil-auditor.md +277 -0
- package/kit/commands/auditar-marco.md +102 -1
- package/kit/commands/auditar-observabilidade.md +103 -0
- package/kit/commands/auditar-toil.md +129 -0
- package/kit/commands/burn-rate-status.md +140 -0
- package/kit/commands/concluir-marco.md +73 -1
- package/kit/commands/definir-slo.md +108 -0
- package/kit/commands/discutir-fase.md +26 -0
- package/kit/commands/forense.md +83 -1
- package/kit/commands/golden-signals.md +142 -0
- package/kit/commands/instrumentar-fase.md +200 -0
- package/kit/commands/investigar-producao.md +162 -0
- package/kit/commands/observabilidade.md +116 -0
- package/kit/commands/planejar-fase.md +20 -0
- package/kit/commands/postmortem.md +179 -0
- package/kit/commands/prr.md +205 -0
- package/kit/commands/risk-budget.md +220 -0
- package/kit/commands/sre.md +227 -0
- package/kit/commands/verificar-trabalho.md +26 -0
- package/kit/skills/_shared-observability/glossary.md +396 -0
- package/kit/skills/_shared-sre/glossary.md +573 -0
- package/kit/skills/blameless-postmortems/SKILL.md +340 -0
- package/kit/skills/burn-rate-alerting/SKILL.md +258 -0
- package/kit/skills/core-analysis-loop/SKILL.md +352 -0
- package/kit/skills/distributed-tracing/SKILL.md +362 -0
- package/kit/skills/eliminating-toil/SKILL.md +243 -0
- package/kit/skills/event-based-slos/SKILL.md +296 -0
- package/kit/skills/four-golden-signals/SKILL.md +297 -0
- package/kit/skills/observability-driven-development/SKILL.md +315 -0
- package/kit/skills/observability-maturity-model/SKILL.md +222 -0
- package/kit/skills/opentelemetry-standard/SKILL.md +351 -0
- package/kit/skills/production-readiness-review/SKILL.md +305 -0
- package/kit/skills/sre-risk-management/SKILL.md +221 -0
- package/kit/skills/structured-events/SKILL.md +265 -0
- package/kit/skills/telemetry-pipelines/SKILL.md +259 -0
- package/kit/skills/telemetry-sampling/SKILL.md +256 -0
- package/package.json +1 -1
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: observability-driven-development
|
|
3
|
+
description: Use ao bundlear telemetria com nova feature — 4 perguntas pré-PR, instrumentação shift-left, auto-page do autor por 30-60min após merge. Análogo TDD para produção.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Observabilidade — Observability-Driven Development (ODD)
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill ao escrever nova feature, planejar fase, ou code review. Trigger phrases:
|
|
11
|
+
|
|
12
|
+
- "ODD", "observability-driven development"
|
|
13
|
+
- "como sei que essa feature funciona em prod?"
|
|
14
|
+
- "instrumentar antes do PR"
|
|
15
|
+
- "shift-left observability"
|
|
16
|
+
- "auto-page do autor"
|
|
17
|
+
- "bundle telemetry com feature"
|
|
18
|
+
|
|
19
|
+
## As 4 perguntas pré-PR (canônicas)
|
|
20
|
+
|
|
21
|
+
Antes de submeter PR, todo autor responde EM CÓDIGO:
|
|
22
|
+
|
|
23
|
+
| # | Pergunta | Como instrumentar |
|
|
24
|
+
|---|----------|-------------------|
|
|
25
|
+
| **1** | **Faz o que esperei?** | `result.success` boolean por evento + atributos do happy path (`order.id`, `user.id`) |
|
|
26
|
+
| **2** | **Compara à versão anterior?** | `build_id` em todo evento — permite `WHERE build_id = X vs build_id = Y` |
|
|
27
|
+
| **3** | **Usuários estão usando?** | Atributo de identidade (`user.id`, `tenant_id`, `customer.tier`) e do path do request (`endpoint`, `feature_flag.<name>`) |
|
|
28
|
+
| **4** | **Anomalias emergem?** | `error.type` enumerado + `duration_ms` + capturar todos os branches de código (try/catch + early returns) |
|
|
29
|
+
|
|
30
|
+
**Sem isso, o PR não é mergeável.** Não é regra burocrática — é a diferença entre "funciona em testes" e "funciona em produção".
|
|
31
|
+
|
|
32
|
+
## Regras absolutas
|
|
33
|
+
|
|
34
|
+
- **Bundle telemetria com a feature** — instrumentação não é fase separada. Mesmo PR adiciona feature + spans + atributos.
|
|
35
|
+
- **Auto-page o autor por 30-60min após merge** — feedback loop curto. "Fui eu, eu sei o que era e eu posso reverter." NUNCA pular essa janela.
|
|
36
|
+
- **Decouple deploy de release** — feature flag por default. Deploy = código em prod desligado; release = liga aos poucos.
|
|
37
|
+
- **Test em prod com subset** — 1% de tráfego com flag ativada > 100% rollout em horário de baixa.
|
|
38
|
+
- **Rollback < rollforward em duvida** — observabilidade rica mostra o que está errado em segundos, mas só se você não rolou-back o evidência primeiro. Pause primeiro, investigue, então decida.
|
|
39
|
+
- **Toda code branch = atributo** — `if (x) { ... } else { ... }` precisa emitir atributo de qual branch foi tomada (`branch_taken: 'fast_path'` vs `'slow_path'`).
|
|
40
|
+
- **Tighten do feedback loop é o objetivo** — minutos do commit ao prod, não dias. Cada hora de delay multiplica custo de debug.
|
|
41
|
+
|
|
42
|
+
## Patterns canônicos
|
|
43
|
+
|
|
44
|
+
### Pattern: feature instrumentada nasce ODD-compliant
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
// PT-BR: feature nova "novo método de pagamento" — instrumentação BUNDLED
|
|
48
|
+
import { trace, SpanStatusCode } from '@opentelemetry/api'
|
|
49
|
+
|
|
50
|
+
const tracer = trace.getTracer('payments')
|
|
51
|
+
|
|
52
|
+
export async function processPaymentV2(req: PaymentRequest) {
|
|
53
|
+
return tracer.startActiveSpan('process_payment_v2', async (span) => {
|
|
54
|
+
// PT-BR: Pergunta 3 — quem está usando?
|
|
55
|
+
span.setAttribute('user.id', req.user.id)
|
|
56
|
+
span.setAttribute('customer.tier', req.user.tier)
|
|
57
|
+
span.setAttribute('tenant_id', req.user.tenant)
|
|
58
|
+
span.setAttribute('endpoint', '/api/v2/payments')
|
|
59
|
+
|
|
60
|
+
// PT-BR: Pergunta 2 — qual versão?
|
|
61
|
+
span.setAttribute('build_id', process.env.BUILD_ID ?? 'dev')
|
|
62
|
+
span.setAttribute('feature_flag.payments_v2', true) // PT-BR: assumed via flag
|
|
63
|
+
span.setAttribute('payment.method', req.method) // novo: 'pix' | 'crypto' | 'card'
|
|
64
|
+
|
|
65
|
+
// PT-BR: Pergunta 4 — atributo por branch
|
|
66
|
+
if (req.amount > 1_000_00) {
|
|
67
|
+
span.setAttribute('branch_taken', 'high_value')
|
|
68
|
+
span.setAttribute('requires_3ds', true)
|
|
69
|
+
} else {
|
|
70
|
+
span.setAttribute('branch_taken', 'standard')
|
|
71
|
+
span.setAttribute('requires_3ds', false)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const result = await chargeProvider(req)
|
|
76
|
+
|
|
77
|
+
// PT-BR: Pergunta 1 — fez o que esperei?
|
|
78
|
+
span.setAttribute('result.success', true)
|
|
79
|
+
span.setAttribute('payment.id', result.id)
|
|
80
|
+
span.setAttribute('payment.processor_response', result.processorCode)
|
|
81
|
+
span.setStatus({ code: SpanStatusCode.OK })
|
|
82
|
+
return result
|
|
83
|
+
} catch (e) {
|
|
84
|
+
// PT-BR: Pergunta 4 — anomalia identificada com type enum
|
|
85
|
+
span.setAttribute('result.success', false)
|
|
86
|
+
span.setAttribute('error.type', classify(e)) // 'provider_down' | 'declined' | 'fraud_block'
|
|
87
|
+
span.setAttribute('error.processor_code', e.code)
|
|
88
|
+
span.setStatus({ code: SpanStatusCode.ERROR })
|
|
89
|
+
throw e
|
|
90
|
+
} finally {
|
|
91
|
+
span.end()
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Pattern: auto-page autor (config CI/CD)
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
# PT-BR: GitHub Actions ou equivalente — paginar autor após merge
|
|
101
|
+
# .github/workflows/post-merge-watch.yml
|
|
102
|
+
name: post-merge-watch
|
|
103
|
+
on:
|
|
104
|
+
push:
|
|
105
|
+
branches: [main]
|
|
106
|
+
jobs:
|
|
107
|
+
page-author:
|
|
108
|
+
runs-on: ubuntu-latest
|
|
109
|
+
steps:
|
|
110
|
+
- name: Page commit author for 30-60min
|
|
111
|
+
run: |
|
|
112
|
+
AUTHOR_EMAIL="${{ github.event.head_commit.author.email }}"
|
|
113
|
+
PAGER_TOKEN="${{ secrets.PAGERDUTY_TOKEN }}"
|
|
114
|
+
# PT-BR: criar policy temporária — alertas SLO route para AUTHOR_EMAIL
|
|
115
|
+
# por 45 minutos. Após, retorna ao on-call normal.
|
|
116
|
+
curl -X POST https://api.pagerduty.com/oncall_overrides \
|
|
117
|
+
-H "Authorization: Token token=$PAGER_TOKEN" \
|
|
118
|
+
-d "{
|
|
119
|
+
\"override\": {
|
|
120
|
+
\"start\": \"$(date -u +%FT%TZ)\",
|
|
121
|
+
\"end\": \"$(date -u -d '+45 minutes' +%FT%TZ)\",
|
|
122
|
+
\"user\": {\"email\": \"$AUTHOR_EMAIL\"}
|
|
123
|
+
}
|
|
124
|
+
}"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Pattern: deploy ≠ release (feature flag)
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
// PT-BR: deploy do código com flag DESLIGADA
|
|
131
|
+
const isV2Enabled = (req: Request): boolean => {
|
|
132
|
+
// PT-BR: 0% inicialmente — deploy = código em prod, mas dormente
|
|
133
|
+
if (!flags.isEnabled('payments_v2', { user_id: req.user.id })) {
|
|
134
|
+
return false
|
|
135
|
+
}
|
|
136
|
+
return true
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export async function processPayment(req: PaymentRequest) {
|
|
140
|
+
if (isV2Enabled(req)) {
|
|
141
|
+
return processPaymentV2(req)
|
|
142
|
+
}
|
|
143
|
+
return processPaymentV1(req)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// PT-BR: depois do deploy, release gradual:
|
|
147
|
+
// 1. flag.set('payments_v2', { user_id: 'me' }) — só dev
|
|
148
|
+
// 2. flag.set('payments_v2', { customer.tier: 'free' }, 1%) — 1% free users
|
|
149
|
+
// 3. observe SLO + error rate; se OK, sobe para 10%, 50%, 100%
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Pattern: comparar versão antes/depois (Pergunta 2)
|
|
153
|
+
|
|
154
|
+
```sql
|
|
155
|
+
-- PT-BR: SLI antes vs depois do deploy do build_id `abc123`
|
|
156
|
+
-- Mostra error_rate per build, agrupado por versão
|
|
157
|
+
select
|
|
158
|
+
build_id,
|
|
159
|
+
count(*) as total,
|
|
160
|
+
sum(case when result_success = false then 1 else 0 end) as errors,
|
|
161
|
+
100.0 * sum(case when result_success = false then 1 else 0 end) / count(*) as error_pct,
|
|
162
|
+
percentile_cont(0.99) within group (order by duration_ms) as p99_ms
|
|
163
|
+
from observability.spans
|
|
164
|
+
where
|
|
165
|
+
service_name = 'payments'
|
|
166
|
+
and timestamp > '2026-05-06 10:00'
|
|
167
|
+
and build_id in ('v1.5.2', 'v1.5.3') -- versão anterior + atual
|
|
168
|
+
group by build_id;
|
|
169
|
+
|
|
170
|
+
-- PT-BR: se v1.5.3 tem error_pct ou p99_ms > v1.5.2 → regressão. Rollback ou fix.
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Pattern: instrumentação shift-left no PLAN.md de fase
|
|
174
|
+
|
|
175
|
+
```markdown
|
|
176
|
+
# PLAN: Fase 42 — Novo método de pagamento
|
|
177
|
+
|
|
178
|
+
## Tarefas
|
|
179
|
+
|
|
180
|
+
| # | Task | Output |
|
|
181
|
+
|---|------|--------|
|
|
182
|
+
| 1 | Implementar `processPaymentV2` em `src/payments/v2.ts` | função |
|
|
183
|
+
| 2 | **Instrumentação OTel — bundled** | spans + atributos |
|
|
184
|
+
| 3 | Adicionar feature flag `payments_v2` | flag config |
|
|
185
|
+
| 4 | Tests unitários | tests/v2.spec.ts |
|
|
186
|
+
| 5 | **ODD — 4 perguntas validadas** | comments no PR |
|
|
187
|
+
|
|
188
|
+
## ODD — Validação das 4 perguntas
|
|
189
|
+
|
|
190
|
+
1. **Faz o que esperei?**
|
|
191
|
+
- Span `process_payment_v2` com atributo `result.success`
|
|
192
|
+
- Query: `SELECT count(*) WHERE result_success=true / count(*)` deve ser ≥ 99% após release
|
|
193
|
+
|
|
194
|
+
2. **Compara à versão anterior?**
|
|
195
|
+
- `build_id` em todo span permite cross-version
|
|
196
|
+
- Query: ver "Pattern: comparar versão" acima
|
|
197
|
+
|
|
198
|
+
3. **Usuários estão usando?**
|
|
199
|
+
- `customer.tier`, `payment.method` permitem slice & dice
|
|
200
|
+
- Query: `SELECT customer.tier, payment.method, count(*) FROM ... WHERE feature_flag.payments_v2=true GROUP BY 1,2`
|
|
201
|
+
|
|
202
|
+
4. **Anomalias emergem?**
|
|
203
|
+
- `error.type` enum: `'provider_down'`, `'declined'`, `'fraud_block'`
|
|
204
|
+
- `branch_taken` para code paths
|
|
205
|
+
- Alert: SLO burn rate > 2 sobre `WHERE feature_flag.payments_v2=true`
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Anti-patterns
|
|
209
|
+
|
|
210
|
+
### ANTI: instrumentação como fase separada
|
|
211
|
+
|
|
212
|
+
```text
|
|
213
|
+
ANTI: "Vamos shipá-la primeiro, instrumentar na próxima sprint."
|
|
214
|
+
|
|
215
|
+
PROBLEMA: você está em prod cego. Quando algo quebrar, você não tem dados para
|
|
216
|
+
investigar. Adicionar instrumentação depois requer redeploy, que é
|
|
217
|
+
arriscado durante incident.
|
|
218
|
+
|
|
219
|
+
CERTO: instrumentação NO MESMO PR da feature. Não-negociável.
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### ANTI: glass castle (medo de mexer em prod)
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
ANTI: "Não deploy hoje, é véspera de feriado."
|
|
226
|
+
"Não deploy depois das 17h."
|
|
227
|
+
"Vamos esperar a próxima janela de manutenção."
|
|
228
|
+
(Equipe deploya 1× por semana, em batches grandes)
|
|
229
|
+
|
|
230
|
+
PROBLEMA: deploys raros = deploys grandes = mais código mudando = mais risco.
|
|
231
|
+
Cada deploy fica mais perigoso por sua raridade. Cycle vicioso.
|
|
232
|
+
|
|
233
|
+
CERTO: deploy frequente (várias vezes ao dia) com features pequenas atrás de flags.
|
|
234
|
+
Cada deploy quase nada. Reverter quase nada se quebra. Confiança aumenta.
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### ANTI: rollback antes de investigar
|
|
238
|
+
|
|
239
|
+
```text
|
|
240
|
+
ANTI: alerta dispara → rollback automático → "voltou ao normal" → ninguém
|
|
241
|
+
investiga porque "tá funcionando agora"
|
|
242
|
+
|
|
243
|
+
PROBLEMA: você perdeu a evidência. Próximo incident similar começa do zero.
|
|
244
|
+
Padrão de regressão acumula tech debt invisível.
|
|
245
|
+
|
|
246
|
+
CERTO: pause feature flag (não rollback do deploy) → investigue com observability →
|
|
247
|
+
fix root cause → re-release. Rollback só se investigation tomar > 30min.
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### ANTI: testar com 100% rollout em horário de baixa
|
|
251
|
+
|
|
252
|
+
```text
|
|
253
|
+
ANTI: "Faz deploy 4h da manhã quando ninguém usa."
|
|
254
|
+
|
|
255
|
+
PROBLEMA: você está rodando com 100% de risk em condições não-realistas.
|
|
256
|
+
0 tráfego = 0 sinal. Quando bug aparecer no horário de pico, você
|
|
257
|
+
não terá dados.
|
|
258
|
+
|
|
259
|
+
CERTO: deploy a qualquer hora atrás de feature flag em 1% → observe → 10% → 100%.
|
|
260
|
+
Bugs aparecem no progressive rollout, não no horário de pico.
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### ANTI: paginar on-call em vez do autor
|
|
264
|
+
|
|
265
|
+
```text
|
|
266
|
+
ANTI: alerta dispara 2h após merge → on-call (que não escreveu o código) é paginado
|
|
267
|
+
|
|
268
|
+
PROBLEMA: on-call não tem contexto. Vai procurar "que mudou ultimamente" — toma 30min.
|
|
269
|
+
Autor está dormindo / fora do contexto. Feedback loop quebrado.
|
|
270
|
+
|
|
271
|
+
CERTO: por 30-60min após merge, alertas vão para o AUTOR. Ele tem o contexto fresco,
|
|
272
|
+
sabe o que mudou, pode reverter ou fix em 5min. Após janela, volta para on-call.
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### ANTI: instrumentação só em happy path
|
|
276
|
+
|
|
277
|
+
```text
|
|
278
|
+
ANTI: span com atributos só no `try` block; catch sem instrumentação
|
|
279
|
+
|
|
280
|
+
PROBLEMA: você não sabe nada sobre falhas. Pergunta 4 (anomalias) impossível de responder.
|
|
281
|
+
|
|
282
|
+
CERTO: cada `catch` adiciona `error.type` enum + `error.message` + `result.success=false`.
|
|
283
|
+
Cada early return adiciona `branch_taken: 'short_circuit_validation'` etc.
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Verificação
|
|
287
|
+
|
|
288
|
+
Antes de mergear PR, verificar as 4 perguntas:
|
|
289
|
+
|
|
290
|
+
| # | Pergunta | Validação |
|
|
291
|
+
|---|----------|-----------|
|
|
292
|
+
| 1 | **Faz o que esperei?** | Existe atributo `result.success` em algum span do código tocado? |
|
|
293
|
+
| 2 | **Compara à versão anterior?** | `build_id` é setado no span? (geralmente em SDK setup, validar uma vez) |
|
|
294
|
+
| 3 | **Usuários estão usando?** | Existe `user.id` ou `tenant_id` ou `customer.tier` no span? |
|
|
295
|
+
| 4 | **Anomalias emergem?** | `catch` blocks emitem `error.type` enum? branches if/else emitem `branch_taken`? |
|
|
296
|
+
|
|
297
|
+
Se qualquer pergunta = NÃO → PR não mergeable. Adicione instrumentação.
|
|
298
|
+
|
|
299
|
+
Após merge:
|
|
300
|
+
- ✅ Feature flag desligada por default? (deploy ≠ release)
|
|
301
|
+
- ✅ Auto-page do autor configurado por 30-60min?
|
|
302
|
+
- ✅ SLI/SLO baseline sabido para comparação pré/pós release?
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Ver também
|
|
307
|
+
|
|
308
|
+
- `kit/skills/_shared-observability/glossary.md` — termos canônicos, ODD, glass castle
|
|
309
|
+
- `kit/skills/structured-events/SKILL.md` — campos canônicos
|
|
310
|
+
- `kit/skills/distributed-tracing/SKILL.md` — instrumentação cross-service
|
|
311
|
+
- `kit/skills/event-based-slos/SKILL.md` *(Phase 32)* — SLI para baseline pré/pós release
|
|
312
|
+
- `kit/agents/observability-instrumenter.md` — agente que gera instrumentação
|
|
313
|
+
- `kit/commands/instrumentar-fase.md` — comando que aplica ODD em fases
|
|
314
|
+
|
|
315
|
+
*Material-fonte: Observability Engineering (O'Reilly, 2022) — Cap 11: "Observability-Driven Development".*
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: observability-maturity-model
|
|
3
|
+
description: Use ao avaliar maturidade observabilidade — 5 capacidades (resiliência, qualidade, complexidade, cadência, comportamento) com sintomas doing well/poorly por capacidade.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Observabilidade — Maturity Model (OMM)
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill ao auditar maturidade observability de projeto/time. Trigger phrases:
|
|
11
|
+
|
|
12
|
+
- "OMM", "observability maturity"
|
|
13
|
+
- "estamos prontos para SRE?"
|
|
14
|
+
- "quanto vale investir em observability?"
|
|
15
|
+
- "auditar observabilidade"
|
|
16
|
+
- "como saber se time está bem?"
|
|
17
|
+
|
|
18
|
+
## As 5 capacidades (Cap 21)
|
|
19
|
+
|
|
20
|
+
OMM mede 5 capacidades sociotécnicas, cada uma com sintomas qualitativos. Não é checkbox — é trajetória.
|
|
21
|
+
|
|
22
|
+
| # | Capacidade | Pergunta central |
|
|
23
|
+
|---|------------|------------------|
|
|
24
|
+
| **1** | **Resiliência** (Respond to System Failure) | Quanto tempo MTTR? On-call sustentável? |
|
|
25
|
+
| **2** | **Qualidade de Código** (Deliver High-Quality Code) | Bugs encontrados em prod ou pre-merge? |
|
|
26
|
+
| **3** | **Complexidade / Tech Debt** (Manage Complexity) | Engineers conseguem encontrar gargalos sem chutes? |
|
|
27
|
+
| **4** | **Cadência de Release** (Predictable Release Cadence) | Tempo do commit ao prod? Deploy diariamente ou mensalmente? |
|
|
28
|
+
| **5** | **Comportamento de Usuário** (Understand User Behavior) | Time consegue responder "quem usa feature X?" |
|
|
29
|
+
|
|
30
|
+
## Capacidade 1 — Resiliência
|
|
31
|
+
|
|
32
|
+
### Doing well
|
|
33
|
+
- Uptime atinge metas de negócio e está melhorando
|
|
34
|
+
- On-call response a alertas é eficiente; alertas não são ignorados
|
|
35
|
+
- Plantão não é estressante; engineers aceitam shifts adicionais
|
|
36
|
+
- Engineers manejam workload de incidents sem horas extras
|
|
37
|
+
|
|
38
|
+
### Doing poorly
|
|
39
|
+
- Time gastando muito tempo + dinheiro em on-call
|
|
40
|
+
- Incidents frequentes e prolongados
|
|
41
|
+
- On-call sofre alert fatigue ou perde failures reais
|
|
42
|
+
- Investigators não conseguem diagnosticar incidents
|
|
43
|
+
- Mesmas pessoas sempre puxadas para emergências (knowledge silo)
|
|
44
|
+
|
|
45
|
+
### Como observability ajuda
|
|
46
|
+
Alertas relevantes/focados/acionáveis (reduzem alert fatigue). Relação clara entre error budget e customer needs. Wide events permitem investigators efetivos. Alta cardinalidade pinpoint sources rapidamente. Investigation paths democratizados (qualquer engineer respondedor).
|
|
47
|
+
|
|
48
|
+
## Capacidade 2 — Qualidade de Código
|
|
49
|
+
|
|
50
|
+
### Doing well
|
|
51
|
+
- Código é estável; menos bugs em prod; menos outages
|
|
52
|
+
- Após deploy, time foca em customer solutions, não suporte
|
|
53
|
+
- Engineers acham intuitivo debugar em qualquer estágio
|
|
54
|
+
- Issues isoladas são fix-áveis sem cascading failures
|
|
55
|
+
|
|
56
|
+
### Doing poorly
|
|
57
|
+
- Custo alto de customer support
|
|
58
|
+
- Alto % do tempo de eng gasto em bugs vs features novas
|
|
59
|
+
- Engineers reluctant em deployar (perceived risk)
|
|
60
|
+
- Reproduzir falhas demora muito
|
|
61
|
+
- Devs com baixa confidence no código pós-ship
|
|
62
|
+
|
|
63
|
+
### Como observability ajuda
|
|
64
|
+
Mesmo tooling para debugar 1 máquina ou 10k. Telemetry rica mostra código em ação. Validar fix é fácil. Watch deployments e fix antes de visível para usuários.
|
|
65
|
+
|
|
66
|
+
## Capacidade 3 — Complexidade / Tech Debt
|
|
67
|
+
|
|
68
|
+
### Doing well
|
|
69
|
+
- Engineers gastam maioria do tempo em forward progress
|
|
70
|
+
- Bug fixing minoritário
|
|
71
|
+
- Engineers raramente desorientados ("onde no codebase?")
|
|
72
|
+
|
|
73
|
+
### Doing poorly
|
|
74
|
+
- Eng time desperdiçado rebuilding após scaling limits
|
|
75
|
+
- Times distraídos fixando coisa errada
|
|
76
|
+
- Localized changes têm ripple effects descontrolados
|
|
77
|
+
- "Haunted graveyard" — código que ninguém quer mexer
|
|
78
|
+
|
|
79
|
+
### Como observability ajuda
|
|
80
|
+
Performance end-to-end claramente mensurada. Investigators encontram trilhas em parte desconhecida do sistema. Tracing aponta gargalo correto. Engineers identificam o que otimizar (não chutes).
|
|
81
|
+
|
|
82
|
+
## Capacidade 4 — Cadência de Release
|
|
83
|
+
|
|
84
|
+
### Doing well
|
|
85
|
+
- Cadência alinha com customer needs
|
|
86
|
+
- Código entra em prod logo após escrito; engineer dispara deploy próprio
|
|
87
|
+
- Code paths habilitáveis/desabilitáveis sem deploy (feature flags)
|
|
88
|
+
- Deploys e rollbacks são rápidos
|
|
89
|
+
|
|
90
|
+
### Doing poorly
|
|
91
|
+
- Releases infrequentes; muita intervenção humana
|
|
92
|
+
- Muitas mudanças shipped de uma vez (batches)
|
|
93
|
+
- Releases em ordem específica obrigatória
|
|
94
|
+
- Sales gating em release train específico
|
|
95
|
+
- Times evitando deploys em certos dias/horários
|
|
96
|
+
|
|
97
|
+
### Como observability ajuda
|
|
98
|
+
Entende build pipeline + production. Mostra degradação em tests ou erros de build. Confidence no release: comparar build_id antes/depois é trivial. Drilldown em eventos específicos.
|
|
99
|
+
|
|
100
|
+
## Capacidade 5 — Comportamento de Usuário
|
|
101
|
+
|
|
102
|
+
### Doing well
|
|
103
|
+
- Product team consegue responder "qual feature mais usada?", "qual customer tier mais ativo?"
|
|
104
|
+
- Adoption tracking de features novas
|
|
105
|
+
- Sucesso ou abandono mensurável por dimensão (geo, tier, feature flag)
|
|
106
|
+
|
|
107
|
+
### Doing poorly
|
|
108
|
+
- Time intui "users gostaram disso" sem dados
|
|
109
|
+
- BI reports lentos demais (dias) para steering decisions
|
|
110
|
+
- "Quantos users hit este bug?" leva sprint inteiro para responder
|
|
111
|
+
- Sales/Customer Success usam dashboards diferentes do eng (silos)
|
|
112
|
+
|
|
113
|
+
### Como observability ajuda
|
|
114
|
+
Data democratizada — Product, CS, Sales, Exec consultam mesma observability data. Granular por user/tenant. Time real (não BI overnight). Slice & dice ad hoc por feature flag, customer tier, region.
|
|
115
|
+
|
|
116
|
+
## Patterns canônicos
|
|
117
|
+
|
|
118
|
+
### Pattern: scoring de OMM (1-5 por capacidade)
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
1 = Initial: ad-hoc, individual heroics, sem padrão
|
|
122
|
+
2 = Repeatable: básico funciona; alguns engineers conseguem
|
|
123
|
+
3 = Defined: documentado e cross-team; new hires aprendem
|
|
124
|
+
4 = Managed: métricas + targets; tracking de regressão
|
|
125
|
+
5 = Optimizing: melhoria contínua; experimentação ativa
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Pattern: snapshot OMM (Markdown gerado por agent)
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
# OMM Snapshot — kit-mcp 2026-05-06
|
|
132
|
+
|
|
133
|
+
| Capacidade | Score (1-5) | Trend | Sintomas-chave |
|
|
134
|
+
|---|---|---|---|
|
|
135
|
+
| 1. Resiliência | 3 | ↑ | MTTR 2h (era 6h em v1.7) |
|
|
136
|
+
| 2. Qualidade | 4 | → | Bugs em prod ↓ 70% após v1.6 |
|
|
137
|
+
| 3. Complexidade | 2 | ↑ | Tracing recém adotado v1.9 |
|
|
138
|
+
| 4. Cadência | 4 | → | Daily deploy ativo |
|
|
139
|
+
| 5. Comportamento usuário | 1 | ↑ | Sem product analytics ainda |
|
|
140
|
+
|
|
141
|
+
## Action items (priorizados)
|
|
142
|
+
1. [Cap 5] Adicionar dashboards Product (mais alto ROI dado score 1)
|
|
143
|
+
2. [Cap 3] Skills de tracing (Phase 29-30 v1.9 endereçaram)
|
|
144
|
+
3. [Cap 1] Reduzir MTTR de 2h para < 1h (usar incident-investigator)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Pattern: regression check entre marcos
|
|
148
|
+
|
|
149
|
+
```text
|
|
150
|
+
ANTES de /concluir-marco, gerar OMM snapshot.
|
|
151
|
+
Se ALGUMA capacidade regrediu vs marco anterior:
|
|
152
|
+
- Bloquear conclusion (workflow.omm_no_regression = true)
|
|
153
|
+
- Ou abrir ticket explícito + warning, mas permitir conclusion
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Anti-patterns
|
|
157
|
+
|
|
158
|
+
### ANTI: scoring por checkbox (Maturity Model literal)
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
ANTI: "checklist com 50 items; score = N items checked / 50"
|
|
162
|
+
|
|
163
|
+
PROBLEMA: prática observability não cabe em checklist. Score = comportamento sociotécnico.
|
|
164
|
+
|
|
165
|
+
CERTO: avaliar SINTOMAS qualitativos. "On-call está sustentável?" "Engineers conseguem debugar sem help?" Score reflete trajetória.
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### ANTI: comparar org com peers (FAANG envy)
|
|
169
|
+
|
|
170
|
+
```text
|
|
171
|
+
ANTI: "FAANG faz X, então temos que fazer X também"
|
|
172
|
+
|
|
173
|
+
PROBLEMA: contexto importa. Org de 10 engineers ≠ Google.
|
|
174
|
+
|
|
175
|
+
CERTO: compare com VOCÊ MESMO (vs marco anterior). Cada org tem trajetória própria.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### ANTI: maturity model como ferramenta de marketing
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
ANTI: "estamos no nível 5 de OMM!" como bragging rights
|
|
182
|
+
|
|
183
|
+
PROBLEMA: nível 5 é teórico (continuous improvement, never done).
|
|
184
|
+
Self-promotion mascara gaps reais.
|
|
185
|
+
|
|
186
|
+
CERTO: OMM é diagnostic interno. Output → action items, não slides para sales.
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### ANTI: prática técnica sem cultura
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
ANTI: comprar tools de observability achando que resolve
|
|
193
|
+
|
|
194
|
+
PROBLEMA: tools sem skills/processo geram dashboards inúteis.
|
|
195
|
+
OMM é SOCIO-técnico.
|
|
196
|
+
|
|
197
|
+
CERTO: tooling + skills + processo + cultura + buy-in. OMM mede tudo.
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Verificação
|
|
201
|
+
|
|
202
|
+
OMM snapshot canônico:
|
|
203
|
+
|
|
204
|
+
1. **5 capacidades scored** — cada uma 1-5
|
|
205
|
+
2. **Sintomas qualitativos citados** — não números abstratos
|
|
206
|
+
3. **Trend vs último marco** — ↑ ↓ →
|
|
207
|
+
4. **Action items priorizados** — capacidade com score baixo = high priority
|
|
208
|
+
5. **Owner por action item** — sem owner = sem ação
|
|
209
|
+
6. **Regression check** — alertar se alguma capacidade regrediu
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Ver também
|
|
214
|
+
|
|
215
|
+
- `kit/skills/_shared-observability/glossary.md` — termos OMM
|
|
216
|
+
- `kit/skills/event-based-slos/SKILL.md` — Cap 1 (resiliência via SLO/burn rate)
|
|
217
|
+
- `kit/skills/observability-driven-development/SKILL.md` — Cap 2 (qualidade), Cap 4 (cadência)
|
|
218
|
+
- `kit/skills/core-analysis-loop/SKILL.md` — Cap 3 (complexidade — encontrar gargalo)
|
|
219
|
+
- `kit/agents/omm-auditor.md` — agente que pontua e gera OMM snapshot
|
|
220
|
+
- `kit/commands/auditar-observabilidade.md` — comando que invoca o agente
|
|
221
|
+
|
|
222
|
+
*Material-fonte: Observability Engineering (O'Reilly, 2022) — Cap 21: "An Observability Maturity Model".*
|