@luanpdd/kit-mcp 1.9.0 → 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 +58 -0
- package/gates/golden-signals-coverage.md +133 -0
- package/gates/postmortem-template-required.md +127 -0
- package/gates/prr-checklist-coverage.md +128 -0
- package/kit/agents/golden-signals-instrumenter.md +241 -0
- package/kit/agents/omm-auditor.md +52 -0
- package/kit/agents/postmortem-writer.md +282 -0
- package/kit/agents/prr-conductor.md +288 -0
- package/kit/agents/supabase-architect.md +49 -0
- package/kit/agents/supabase-edge-fn-writer.md +102 -0
- package/kit/agents/supabase-migration-writer.md +80 -0
- package/kit/agents/supabase-storage-implementer.md +156 -0
- package/kit/agents/toil-auditor.md +277 -0
- package/kit/commands/auditar-marco.md +81 -1
- package/kit/commands/auditar-toil.md +129 -0
- package/kit/commands/concluir-marco.md +55 -1
- package/kit/commands/forense.md +64 -1
- package/kit/commands/golden-signals.md +142 -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/skills/_shared-sre/glossary.md +573 -0
- package/kit/skills/blameless-postmortems/SKILL.md +340 -0
- package/kit/skills/eliminating-toil/SKILL.md +243 -0
- package/kit/skills/event-based-slos/SKILL.md +22 -0
- package/kit/skills/four-golden-signals/SKILL.md +297 -0
- package/kit/skills/production-readiness-review/SKILL.md +305 -0
- package/kit/skills/sre-risk-management/SKILL.md +221 -0
- package/package.json +1 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blameless-postmortems
|
|
3
|
+
description: Use após incident SEV1/SEV2 — template canônico (9 seções), cultura blameless (foco em sistema, não pessoas), no postmortem left unreviewed, Wheel of Misfortune.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SRE — Blameless Postmortems
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill ao escrever postmortem após incident, revisar postmortem de par, ou conduzir Wheel of Misfortune. Trigger phrases:
|
|
11
|
+
|
|
12
|
+
- "postmortem", "post-mortem"
|
|
13
|
+
- "incident review"
|
|
14
|
+
- "blameless", "sem culpa"
|
|
15
|
+
- "root cause analysis", "5 whys"
|
|
16
|
+
- "Wheel of Misfortune"
|
|
17
|
+
- "lessons learned"
|
|
18
|
+
- "Google SRE cap 15"
|
|
19
|
+
- "no postmortem left unreviewed"
|
|
20
|
+
|
|
21
|
+
## Regras absolutas
|
|
22
|
+
|
|
23
|
+
- **Foco em sistema/processo, NÃO em pessoas** — root cause é "ausência de canary release" ou "RPS limit não documentado", NÃO "Maria fez deploy errado". Pessoas são parte do sistema. Se Maria errou, pergunte: "que processo permitiu o erro chegar a prod?".
|
|
24
|
+
- **Trigger postmortem para SEV1/SEV2 + near-miss notáveis** — todo incident customer-facing com impacto ≥ 1 min de SLO burn ou ≥ 1 user reportado. Near-miss (incident detectado antes de impacto) também: oportunidade de aprender sem custo.
|
|
25
|
+
- **"No postmortem left unreviewed"** — todo postmortem revisado por par sênior antes de arquivar. Sem revisão, postmortem mente (involuntariamente — autor está perto demais).
|
|
26
|
+
- **Action items SMART com owner nomeado** — Specific, Measurable, Assignable, Realistic, Time-bound. "Melhorar monitoring" NÃO é SMART. "Adicionar alert SLO burn rate em /api/v1/orders por @bob até 2026-05-15" É SMART.
|
|
27
|
+
- **Timeline em UTC** — não "horário local Brasília" ou ambíguo. Times distribuídos compõem timeline e UTC é o único timezone universal. Sempre `HH:MM UTC`.
|
|
28
|
+
- **Quantificar impact** — usuários afetados (número/percentual), revenue impact, SLO budget consumido. Sem quantificação, severity é subjetivo.
|
|
29
|
+
- **Lições generalizáveis, não específicas** — "Adicionar alert para essa query específica" é local. "Adicionar alert SLO em todas as queries de write em paths críticos" é generalizável.
|
|
30
|
+
- **Wheel of Misfortune trimestral** — exercício de role-play onde uma pessoa narra um incident histórico e o time pratica response (sem dados reais expostos a stress real). Treina muscle memory para SEV1.
|
|
31
|
+
|
|
32
|
+
## Patterns canônicos
|
|
33
|
+
|
|
34
|
+
### Pattern: template canônico de postmortem (9 seções)
|
|
35
|
+
|
|
36
|
+
````markdown
|
|
37
|
+
```markdown
|
|
38
|
+
# Postmortem: <incident-id> — <título-curto>
|
|
39
|
+
|
|
40
|
+
**Data do incident:** YYYY-MM-DD
|
|
41
|
+
**Autores:** <nomes>
|
|
42
|
+
**Status:** Draft | Reviewed | Final
|
|
43
|
+
**Severidade:** SEV1 | SEV2 | SEV3
|
|
44
|
+
**Tempo até detecção:** XX min (entre trigger e alerta)
|
|
45
|
+
**Tempo até resolução:** XX min (entre alerta e SLO restored)
|
|
46
|
+
|
|
47
|
+
## Summary
|
|
48
|
+
|
|
49
|
+
1-2 parágrafos: o que aconteceu, quem foi afetado, como foi resolvido.
|
|
50
|
+
Escrito para audiência não-técnica (executivos, customer success, support).
|
|
51
|
+
|
|
52
|
+
## Impact
|
|
53
|
+
|
|
54
|
+
- Usuários afetados: XX% (X de Y usuários ativos no período)
|
|
55
|
+
- Duração: HH:MM (de HH:MM UTC a HH:MM UTC)
|
|
56
|
+
- SLO budget consumido: X% do budget mensal
|
|
57
|
+
- Revenue impact: $X (estimado por # de transações falhadas × ticket médio)
|
|
58
|
+
- Serviços downstream impactados: <lista>
|
|
59
|
+
- Customer support tickets gerados: X
|
|
60
|
+
- Reputação/marca: <impacto qualitativo, se houver>
|
|
61
|
+
|
|
62
|
+
## Root Causes
|
|
63
|
+
|
|
64
|
+
Condição mais profunda que, removida, previne recorrência.
|
|
65
|
+
NÃO é "deploy do fulano" ou "código tinha bug" — é a condição sistêmica que
|
|
66
|
+
permitiu o bug chegar a prod (ausência de canary, ausência de SLO alert,
|
|
67
|
+
teste não cobria o caso).
|
|
68
|
+
|
|
69
|
+
Use **5 Whys** para chegar lá. Pode haver múltiplas root causes (separadas
|
|
70
|
+
em subseções `### Root Cause 1`, `### Root Cause 2`).
|
|
71
|
+
|
|
72
|
+
## Trigger
|
|
73
|
+
|
|
74
|
+
Evento que iniciou a falha (deploy X às HH:MM UTC, config change Y, traffic
|
|
75
|
+
spike Z, dependency outage W). Trigger ≠ Root Cause — trigger é o "quando";
|
|
76
|
+
root cause é o "porquê o trigger virou incident".
|
|
77
|
+
|
|
78
|
+
## Resolution
|
|
79
|
+
|
|
80
|
+
Passos tomados para recuperar serviço, em ordem cronológica com horários UTC:
|
|
81
|
+
|
|
82
|
+
- HH:MM UTC — <ação>
|
|
83
|
+
- HH:MM UTC — <ação>
|
|
84
|
+
|
|
85
|
+
Inclui rollbacks, hotfixes, scaling decisions, manual interventions.
|
|
86
|
+
|
|
87
|
+
## Detection
|
|
88
|
+
|
|
89
|
+
Como descobrimos: alerta SLO burn rate? cliente reportou? monitoramento
|
|
90
|
+
interno? heartbeat?
|
|
91
|
+
|
|
92
|
+
Tempo de detecção (gap entre trigger e detecção). Se > 5 min, action item
|
|
93
|
+
para reduzir.
|
|
94
|
+
|
|
95
|
+
## Action Items
|
|
96
|
+
|
|
97
|
+
| # | Action (SMART) | Owner | Priority | Due |
|
|
98
|
+
|---|----------------|-------|----------|-----|
|
|
99
|
+
| 1 | Adicionar SLO burn rate alert em /api/v1/orders/{id} | @bob | P0 | 2026-05-15 |
|
|
100
|
+
| 2 | Documentar RPS limit por tier em runbook do orders-service | @alice | P1 | 2026-05-22 |
|
|
101
|
+
| 3 | Implementar canary release em CI para todos os Edge Functions | @platform | P1 | 2026-06-01 |
|
|
102
|
+
|
|
103
|
+
## Lessons Learned
|
|
104
|
+
|
|
105
|
+
Insights generalizáveis. Estrutura recomendada:
|
|
106
|
+
|
|
107
|
+
### O que fizemos bem
|
|
108
|
+
- <coisa que funcionou — reforçar>
|
|
109
|
+
|
|
110
|
+
### Onde podemos melhorar
|
|
111
|
+
- <gap identificado, generalizável a outros sistemas>
|
|
112
|
+
|
|
113
|
+
### Foi lucky?
|
|
114
|
+
- <foi sorte que detectamos rápido? que não escalou? — capturar para fix proativo>
|
|
115
|
+
|
|
116
|
+
## Timeline (UTC)
|
|
117
|
+
|
|
118
|
+
- 14:23 — <evento>
|
|
119
|
+
- 14:27 — <evento>
|
|
120
|
+
- 14:33 — <evento>
|
|
121
|
+
- 14:42 — <evento>
|
|
122
|
+
- 15:25 — Incident resolvido
|
|
123
|
+
|
|
124
|
+
## Supporting evidence
|
|
125
|
+
|
|
126
|
+
- Link para incident channel #inc-2026-05-06-01
|
|
127
|
+
- Link para SLO dashboard
|
|
128
|
+
- Link para investigation .planning/investigations/<id>.md (de incident-investigator v1.9)
|
|
129
|
+
- Screenshots/queries de chave
|
|
130
|
+
```
|
|
131
|
+
````
|
|
132
|
+
|
|
133
|
+
### Pattern: 5 whys para encontrar root cause
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
Sintoma: SLO burn rate de checkout_success disparou às 14:31 UTC.
|
|
137
|
+
|
|
138
|
+
Why 1: Por que o burn rate disparou?
|
|
139
|
+
→ Porque taxa de erro em /api/v1/orders saltou de 0.05% para 8%.
|
|
140
|
+
|
|
141
|
+
Why 2: Por que a taxa de erro saltou?
|
|
142
|
+
→ Porque deploy v2.3.0 introduziu N+1 query.
|
|
143
|
+
|
|
144
|
+
Why 3: Por que o deploy v2.3.0 chegou a prod com N+1?
|
|
145
|
+
→ Porque o teste de carga não cobria carrinhos com > 10 itens.
|
|
146
|
+
|
|
147
|
+
Why 4: Por que o teste de carga não cobria > 10 itens?
|
|
148
|
+
→ Porque o teste foi escrito antes do feature de "bulk add to cart" e não foi atualizado.
|
|
149
|
+
|
|
150
|
+
Why 5: Por que o teste não foi atualizado quando bulk add foi mergeado?
|
|
151
|
+
→ Porque não há gate de CI que exige re-rodar load test ao mudar paths críticos.
|
|
152
|
+
|
|
153
|
+
ROOT CAUSE: ausência de gate de CI obrigando re-rodar load test em mudanças de paths críticos.
|
|
154
|
+
ACTION ITEM: implementar gate `load-test-required-for-critical-paths` no CI.
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Pattern: revisão por par sênior ("no postmortem left unreviewed")
|
|
158
|
+
|
|
159
|
+
```markdown
|
|
160
|
+
Reviewer pergunta autor:
|
|
161
|
+
|
|
162
|
+
1. **Root cause é sistêmico, não pessoal?** — se cita pessoa, redirecionar para processo
|
|
163
|
+
2. **Action items são SMART?** — owner nomeado, due date, mensurável
|
|
164
|
+
3. **Timeline em UTC?** — sem ambiguidade timezone
|
|
165
|
+
4. **Impact quantificado?** — # usuários, duração, revenue
|
|
166
|
+
5. **Lessons generalizáveis?** — aplicáveis a outros serviços/incidents
|
|
167
|
+
6. **Detection time razoável?** — < 5 min ideal; se > 5, action item para reduzir
|
|
168
|
+
7. **Algo "lucky" capturado?** — foi sorte? Como remover dependência de sorte?
|
|
169
|
+
8. **5 whys aplicado?** — ou parou em "deploy ruim" sem ir mais fundo?
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Pattern: Wheel of Misfortune (training canônico)
|
|
173
|
+
|
|
174
|
+
```text
|
|
175
|
+
Frequência: trimestral (1× por quarter)
|
|
176
|
+
Duração: 60-90 min
|
|
177
|
+
Participantes: time on-call + interessados (4-8 pessoas idealmente)
|
|
178
|
+
|
|
179
|
+
Setup:
|
|
180
|
+
1. Facilitator escolhe um postmortem REAL de incident passado (>3 meses,
|
|
181
|
+
para não ter risco emocional fresco) — pode ser de outro time/empresa.
|
|
182
|
+
2. Facilitator narra timeline progressivamente, parando em pontos-chave.
|
|
183
|
+
3. Em cada parada, time discute: "O que vocês fariam agora? Por quê?"
|
|
184
|
+
4. Comparar respostas com decisão real do incident.
|
|
185
|
+
5. Discutir: "Quais decisões foram boas? Quais foram piores em retrospecto?"
|
|
186
|
+
|
|
187
|
+
Resultado:
|
|
188
|
+
- Time pratica response sem stress real
|
|
189
|
+
- Identifica gaps de conhecimento (nem todos sabem sobre runbook X)
|
|
190
|
+
- Cria muscle memory para próximo SEV1
|
|
191
|
+
- Materializa lições do postmortem original em ação prática
|
|
192
|
+
|
|
193
|
+
Anti-objetivo:
|
|
194
|
+
NÃO é "humilhar quem tomou decisão errada no incident original".
|
|
195
|
+
É blameless training — focar em sistema/processo de decisão.
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Pattern: postmortem chain — `/forense` → `/postmortem`
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
Fluxo natural após incident:
|
|
202
|
+
|
|
203
|
+
1. Detecção: alerta SLO burn rate dispara → on-call ack → Slack channel #inc-NN
|
|
204
|
+
2. Mitigation: rollback ou hotfix → SLO restored → incident closed
|
|
205
|
+
3. /forense (framework v1.10): Core Analysis Loop sobre logs/git/state →
|
|
206
|
+
gera .planning/investigations/<id>.md com hipóteses validadas e root cause
|
|
207
|
+
4. /postmortem --from-investigation <id> (Phase 38):
|
|
208
|
+
postmortem-writer (Phase 37) consome <id>.md e gera template preenchido
|
|
209
|
+
em .planning/postmortems/<id>.md
|
|
210
|
+
5. Reviewer lê draft e exige fixes (no postmortem left unreviewed)
|
|
211
|
+
6. Final marked + archived em milestone correspondente
|
|
212
|
+
7. Action items P0 viram phases inseridas no roadmap próximo (`/inserir-fase`)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Anti-patterns
|
|
216
|
+
|
|
217
|
+
### ANTI: blame culture
|
|
218
|
+
|
|
219
|
+
```text
|
|
220
|
+
ANTI: postmortem nomeia "fulano fez deploy errado", "@maria não testou direito",
|
|
221
|
+
"o time de X causou o problema"
|
|
222
|
+
|
|
223
|
+
PROBLEMA: engineers escondem incidents próximos ao limite por medo de retaliação;
|
|
224
|
+
psychological safety colapsa; replicação garantida (próximo near-miss
|
|
225
|
+
vira full incident porque ninguém reportou); team rotation aumenta;
|
|
226
|
+
quem fica deixa de propor mudanças arriscadas (mesmo as boas).
|
|
227
|
+
|
|
228
|
+
CERTO: foco em sistema/processo (ausência de canary, ausência de rollback
|
|
229
|
+
automatizado, gate de CI faltante); pessoas são parte do sistema, NÃO
|
|
230
|
+
o root cause; revisão por par sênior antes de arquivar — reviewer
|
|
231
|
+
redireciona toda menção a pessoa para "que processo permitiu?".
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### ANTI: action items vagos
|
|
235
|
+
|
|
236
|
+
```text
|
|
237
|
+
ANTI: "Melhorar monitoring", "Revisitar processo de deploy", "Investigar mais",
|
|
238
|
+
"Documentar melhor"
|
|
239
|
+
|
|
240
|
+
PROBLEMA: sem owner, sem due date, sem critério de "feito"; ficam pendentes
|
|
241
|
+
para sempre; mesma falha repete em 6 meses porque nada concreto
|
|
242
|
+
aconteceu; aprendizado do incident é perdido na próxima sprint.
|
|
243
|
+
|
|
244
|
+
CERTO: SMART (Specific, Measurable, Assignable, Realistic, Time-bound) —
|
|
245
|
+
"Bob adiciona SLO burn alert em /api/v1/orders até 2026-05-15";
|
|
246
|
+
"Alice documenta RPS limit em runbook orders-service até 2026-05-22".
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### ANTI: postmortem left unreviewed
|
|
250
|
+
|
|
251
|
+
```text
|
|
252
|
+
ANTI: autor escreve postmortem, ninguém revisa, vai direto para o arquivo
|
|
253
|
+
|
|
254
|
+
PROBLEMA: autor está perto demais (mente involuntariamente sobre próprio
|
|
255
|
+
papel — sem má-fé, é a natureza humana); root cause errado
|
|
256
|
+
documentado; lições não-generalizáveis; mesma falha repete porque
|
|
257
|
+
ação errada foi tomada com base em diagnóstico errado.
|
|
258
|
+
|
|
259
|
+
CERTO: revisor sênior aplica checklist (8 perguntas — ver Pattern: revisão
|
|
260
|
+
por par sênior); só depois `Final` status; "no postmortem left
|
|
261
|
+
unreviewed" é regra absoluta — incident sem postmortem revisado
|
|
262
|
+
conta como aberto, mesmo que serviço esteja restaurado.
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### ANTI: postmortem só para SEV1
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
ANTI: "só investigar incident que pagou on-call"; SEV2/SEV3 ignorados;
|
|
269
|
+
near-misses (detecção rápida evitou impacto) descartados
|
|
270
|
+
|
|
271
|
+
PROBLEMA: near-misses são oportunidade de aprender SEM CUSTO — perdê-los
|
|
272
|
+
é desperdício; SEV3s acumulam até virar SEV1 (mesma classe de
|
|
273
|
+
falha, escala diferente); tendências invisíveis (3 SEV3s em 1 mês
|
|
274
|
+
no mesmo serviço = sinal); team perde músculo de investigação.
|
|
275
|
+
|
|
276
|
+
CERTO: SEV1/SEV2 mandatório; SEV3 opcional mas encorajado; near-miss notável
|
|
277
|
+
(detection rápida evitou impacto) é candidato a postmortem leve
|
|
278
|
+
(Summary + Impact + Lessons Learned, sem timeline detalhada se durou
|
|
279
|
+
< 1 min). Investigation barata, lição grátis.
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### ANTI: timeline ambígua
|
|
283
|
+
|
|
284
|
+
```text
|
|
285
|
+
ANTI: "Por volta das 14h", "After lunch", "Em horário de pico",
|
|
286
|
+
"Ontem à tarde"
|
|
287
|
+
|
|
288
|
+
PROBLEMA: reviewers de outros timezones perdem contexto (15h Brasília
|
|
289
|
+
= 18h UTC = 11h US-East); reconstrução em > 30 dias impossível
|
|
290
|
+
(lembra "horário de pico"?); análise estatística (MTTR
|
|
291
|
+
distribution, time-to-detect) impossível sem timestamps; cross-
|
|
292
|
+
incident correlation falha.
|
|
293
|
+
|
|
294
|
+
CERTO: sempre `HH:MM UTC` no formato 24h; cada evento na timeline com
|
|
295
|
+
timestamp; UTC é o único timezone universal — converter quando
|
|
296
|
+
compartilhar com stakeholders locais, NUNCA armazenar local.
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### ANTI: copy-paste de postmortem template sem investigation
|
|
300
|
+
|
|
301
|
+
```text
|
|
302
|
+
ANTI: abrir template, preencher campos genéricos, "Resolution: investigamos
|
|
303
|
+
e resolvemos", "Root Cause: bug no código"; sem dados, sem 5 whys
|
|
304
|
+
|
|
305
|
+
PROBLEMA: root cause errado documentado; action items irrelevantes;
|
|
306
|
+
lessons learned superficiais; falha equivalente em 3 meses
|
|
307
|
+
porque diagnóstico verdadeiro nunca foi feito; postmortem vira
|
|
308
|
+
ritual burocrático em vez de instrumento de aprendizado.
|
|
309
|
+
|
|
310
|
+
CERTO: postmortem nasce de investigation real (Core Analysis Loop, /forense,
|
|
311
|
+
ou logs/state via mcp__supabase__get_logs); preencher com EVIDÊNCIAS
|
|
312
|
+
(queries que rodaram, logs específicos, métricas observadas), não
|
|
313
|
+
impressões; cada Root Cause precisa de prova citável.
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Verificação
|
|
317
|
+
|
|
318
|
+
Antes de marcar postmortem como `Final`:
|
|
319
|
+
|
|
320
|
+
1. **9 seções canônicas presentes** — Summary, Impact, Root Causes, Trigger, Resolution, Detection, Action Items, Lessons Learned, Timeline UTC
|
|
321
|
+
2. **Root cause sistêmico** — não nomeia pessoa; passou pelo 5 whys
|
|
322
|
+
3. **Action items SMART** — Specific, Measurable, Assignable (owner @user), Realistic, Time-bound (due date)
|
|
323
|
+
4. **Timeline em UTC** — sem timezone ambíguo
|
|
324
|
+
5. **Impact quantificado** — # usuários, duração HH:MM, SLO budget consumido, revenue
|
|
325
|
+
6. **Lições generalizáveis** — aplicáveis a outros serviços/incidents
|
|
326
|
+
7. **Reviewed por par sênior** — checklist 8 perguntas aplicado
|
|
327
|
+
8. **Supporting evidence linkada** — investigation, dashboards, queries
|
|
328
|
+
9. **Action items P0 escalonados** — viraram phases ou tasks no roadmap próximo
|
|
329
|
+
|
|
330
|
+
## Ver também
|
|
331
|
+
|
|
332
|
+
- [`_shared-sre/glossary.md`](../_shared-sre/glossary.md) — termos canônicos postmortem, blameless, root cause, Wheel of Misfortune
|
|
333
|
+
- [`core-analysis-loop`](../core-analysis-loop/SKILL.md) (v1.9) — Core Analysis Loop alimenta investigation que vira postmortem
|
|
334
|
+
- [`sre-risk-management`](../sre-risk-management/SKILL.md) — postmortem documenta budget consumido
|
|
335
|
+
- [`production-readiness-review`](../production-readiness-review/SKILL.md) — PRR axis "Emergency Response" exige postmortem culture
|
|
336
|
+
- [`eliminating-toil`](../eliminating-toil/SKILL.md) — toil-induced incidents geram postmortems
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
*Material-fonte: Site Reliability Engineering — Beyer, Jones, Petoff, Murphy (Google/O'Reilly, 2016) — Cap 15: "Postmortem Culture: Learning from Failure".*
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eliminating-toil
|
|
3
|
+
description: Use ao identificar/eliminar toil — 6 critérios canônicos (manual, repetitivo, automatizável, tático, sem valor durável, escala linear), regra ≤ 50%, automação como invariante.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SRE — Eliminating Toil
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill ao auditar tarefas operacionais, classificar trabalho como toil/non-toil, ou propor automação. Trigger phrases:
|
|
11
|
+
|
|
12
|
+
- "toil", "trabalho operacional"
|
|
13
|
+
- "eliminar toil", "reduzir toil"
|
|
14
|
+
- "≤ 50% toil", "regra 50%"
|
|
15
|
+
- "automation", "automatizar tarefa repetitiva"
|
|
16
|
+
- "isso é toil ou overhead?"
|
|
17
|
+
- "Google SRE cap 5"
|
|
18
|
+
- "TOIL-AUDIT"
|
|
19
|
+
|
|
20
|
+
## Regras absolutas
|
|
21
|
+
|
|
22
|
+
- **Toil tem 6 critérios canônicos** — uma tarefa É toil se TODOS os 6 valem: (1) **Manual** — humano executa cada vez; (2) **Repetitivo** — você já fez isso 3+ vezes; (3) **Automatizável** — script/cron resolve sem julgamento humano; (4) **Tático** — reage a evento, não planeja; (5) **Sem valor durável** — não cria asset permanente; (6) **Escala linear** — mais users = mais trabalho. Se QUALQUER um dos 6 = não, NÃO é toil (é overhead ou grungy work).
|
|
23
|
+
- **Regra ≤ 50%** — SRE não pode gastar mais que 50% do tempo em toil; restante é engineering (automação, capacity planning, instrumentation, postmortems). Se medindo > 50% por 1+ trimestre, é red flag — peça ajuda à liderança.
|
|
24
|
+
- **Toil ≠ overhead** — reuniões, RH, planejamento de quarter, performance review são **overhead** — necessários, não-elimináveis, NÃO contam para a regra ≤ 50%. Confundir overhead com toil = sub-medir.
|
|
25
|
+
- **Toil ≠ grungy work** — refactor de código legado, security cleanup, DB rebuild para reduzir bloat são **grungy work** — necessários, têm valor durável, são engineering trabalho. NÃO contam como toil.
|
|
26
|
+
- **Automação é o objetivo, não o meio** — automatizar parcialmente (humano clica botão A, depois B, depois C) ainda é toil. Automação completa (cron + script + alert se falhar) elimina toil. Meias-medidas perpetuam.
|
|
27
|
+
- **Toil tax cresce com produto** — cada feature nova adiciona toil potencial: deploy manual, migration manual, feature flag rotation, customer-specific config. Prevenir > remediar — design feature considerando "como auto-operar isso?".
|
|
28
|
+
- **Quantificar toil em horas-pessoa** — "TOIL-AUDIT.md" deve ter coluna `hours_per_week_per_person` para cada item. Sem quantificação, "muito toil" é subjetivo e não-acionável.
|
|
29
|
+
- **Priorizar por (frequency × pain) / automation_effort** — P0 = alto frequency + alto pain + baixo effort. P2 = baixa frequency OU alto effort. Não automatizar tudo de uma vez — começar pelo P0.
|
|
30
|
+
|
|
31
|
+
## Patterns canônicos
|
|
32
|
+
|
|
33
|
+
### Pattern: decision tree para classificar trabalho
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
Tarefa repetitiva detectada → aplicar 6 critérios canônicos:
|
|
37
|
+
|
|
38
|
+
1. Manual? (humano executa cada vez) ┐
|
|
39
|
+
2. Repetitiva? (já fiz isso 3+ vezes) │
|
|
40
|
+
3. Automatizável? (script/cron resolve sem julgamento) │── Se TODOS sim → TOIL
|
|
41
|
+
4. Tática? (reage a evento, não planeja) │ → automatizar / eliminar
|
|
42
|
+
5. Sem valor durável? (não cria asset permanente) │ → contar em ≤ 50% rule
|
|
43
|
+
6. Escala linear? (mais users = mais trabalho) ─┘
|
|
44
|
+
|
|
45
|
+
Se NÃO for toil mas repetitivo, classificar:
|
|
46
|
+
- OVERHEAD (reuniões, RH, planning) → não-eliminável; NÃO conta em ≤ 50%
|
|
47
|
+
- GRUNGY WORK (refactor, sec cleanup) → necessário, valor durável → projeto engineering
|
|
48
|
+
- PROJECT WORK (criar novo serviço) → engineering trabalho ≠ toil
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Pattern: template `TOIL-AUDIT.md`
|
|
52
|
+
|
|
53
|
+
Formato canônico que `toil-auditor` (Phase 37) gera:
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
# TOIL-AUDIT — <projeto> — <data>
|
|
57
|
+
|
|
58
|
+
## Métrica agregada
|
|
59
|
+
|
|
60
|
+
- Toil estimado: X.X horas-pessoa/semana (Y% do tempo do time)
|
|
61
|
+
- **Status vs ≤ 50% rule:** [GREEN: < 30%] | [YELLOW: 30-50%] | [RED: > 50%]
|
|
62
|
+
- Top 3 áreas: <lista>
|
|
63
|
+
|
|
64
|
+
## Itens identificados
|
|
65
|
+
|
|
66
|
+
| # | Item | Frequência | Hours/week | Pain (1-5) | Automation effort | Priority |
|
|
67
|
+
|---|------|------------|------------|------------|-------------------|----------|
|
|
68
|
+
| 1 | Reset DB seed manual antes de cada test run | 2×/dia | 1.5 h | 4 | M (3 dias) | P0 |
|
|
69
|
+
| 2 | Rotation de access_token de Edge Function | 1×/semana | 0.5 h | 2 | S (1 dia) | P1 |
|
|
70
|
+
| 3 | Rebuild de índice fts_search após batch import | 1×/mês | 0.5 h | 3 | M (2 dias) | P1 |
|
|
71
|
+
| 4 | Limpeza manual de orphan rows em audit_log | 1×/semana | 0.3 h | 1 | S (1 dia) | P2 |
|
|
72
|
+
|
|
73
|
+
## P0 (automatizar agora)
|
|
74
|
+
|
|
75
|
+
### Item 1: Reset DB seed manual
|
|
76
|
+
|
|
77
|
+
**Por que é toil:** atende 6 critérios canônicos (manual, repetitivo 2×/dia, automatizável via script + pg_cron, tática reativa, sem valor durável, escala com #devs).
|
|
78
|
+
|
|
79
|
+
**Automação proposta:** `make db-reset` que invoca `supabase db reset && pnpm run seed`. Adicionar pre-test hook em CI.
|
|
80
|
+
|
|
81
|
+
**Esforço estimado:** 3 dias (Med — script existe parcialmente, falta seed deterministic).
|
|
82
|
+
|
|
83
|
+
**Owner sugerido:** @dev-tools-team
|
|
84
|
+
|
|
85
|
+
## P1 / P2 (escalonar)
|
|
86
|
+
|
|
87
|
+
...
|
|
88
|
+
|
|
89
|
+
## Não-toil identificado
|
|
90
|
+
|
|
91
|
+
- **Overhead:** sprint planning (2h × semana × 5 pessoas = 10h/semana) — NÃO conta no ≤ 50%
|
|
92
|
+
- **Grungy work:** refactor de `legacy_orders_service` (8h × semana × 1 pessoa = 8h/semana) — projeto, não toil
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Pattern: estágios de automação (níveis Google)
|
|
96
|
+
|
|
97
|
+
| Estágio | Descrição | Exemplo |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| **L0: Manual** | 100% humano | "Cada deploy: SSH no host, copy binary, kill+restart" |
|
|
100
|
+
| **L1: Documented** | Runbook escrito; humano segue passos | "Doc passo-a-passo de deploy em wiki" |
|
|
101
|
+
| **L2: Tooled** | Script executa passos; humano invoca | "`./deploy.sh prod`" |
|
|
102
|
+
| **L3: Self-service** | UI/CLI trigger; humano clica | "GitHub Actions deploy on PR merge" |
|
|
103
|
+
| **L4: Autonomous** | Sem humano; só fail-state intervenção | "Auto-rollback se SLO burn rate > 4 nos primeiros 5 min após deploy" |
|
|
104
|
+
|
|
105
|
+
Meta SRE é mover toda toil de L0/L1 para L3/L4. L2 é meio-passo aceitável quando L3+ requer investimento maior. **L1 (apenas runbook) é toil disfarçado** — runbook é manual com passo extra de "ler doc".
|
|
106
|
+
|
|
107
|
+
### Pattern: identificação de toil via git log + scripts
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# PT-BR: scripts shell em runbooks/ ou docs/runbooks/
|
|
111
|
+
find . -name "*.sh" -path "*runbook*" -o -path "*ops*" | head -20
|
|
112
|
+
|
|
113
|
+
# PT-BR: "manual steps" em README/docs (heurística — frase canônica)
|
|
114
|
+
grep -rn "manually\|por favor\|run this\|every week\|cada semana" --include="*.md" .
|
|
115
|
+
|
|
116
|
+
# PT-BR: tarefas repetitivas via git log — commits de mesmo tipo
|
|
117
|
+
git log --since="3 months ago" --pretty=format:"%s" | sort | uniq -c | sort -rn | head -20
|
|
118
|
+
# Ex: "20× Re-run failed migration in prod" → TOIL candidato
|
|
119
|
+
# Ex: "15× Bump deploy-token" → TOIL candidato
|
|
120
|
+
|
|
121
|
+
# PT-BR: cron jobs já automatizados (saída esperada)
|
|
122
|
+
crontab -l 2>/dev/null
|
|
123
|
+
cat /etc/cron.d/* 2>/dev/null
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Pattern: "toil tax" — prevenir feature nascer com toil
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
Antes de mergear PR de nova feature, perguntar:
|
|
130
|
+
|
|
131
|
+
1. "Como auto-operar isso em prod?" → instrumentação ODD
|
|
132
|
+
2. "Como auto-monitorar?" → 4 golden signals
|
|
133
|
+
3. "Como auto-recuperar de fail comum?" → retry, circuit breaker
|
|
134
|
+
4. "Como auto-rotacionar credenciais?" → vault + cron rotation
|
|
135
|
+
5. "Como auto-limpar dados históricos?" → retention policy + scheduled cleanup
|
|
136
|
+
6. "Como onboarding de novo cliente?" → self-service signup, não Slack ping
|
|
137
|
+
|
|
138
|
+
Se QUALQUER resposta = "humano fará isso" → toil tax. Bloqueie ou descontar do release budget.
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Anti-patterns
|
|
142
|
+
|
|
143
|
+
### ANTI: confundir overhead com toil
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
ANTI: contar reuniões, RH, planning, performance review como toil — toda
|
|
147
|
+
atividade não-codificadora vira "toil" no audit.
|
|
148
|
+
|
|
149
|
+
PROBLEMA: métrica inflada (e.g., 60% "toil" falso); ações erradas — cortar
|
|
150
|
+
reunião não diminui toil real; equipe perde tempo em automação
|
|
151
|
+
de overhead (que é não-eliminável por design).
|
|
152
|
+
|
|
153
|
+
CERTO: overhead é categoria separada; ≤ 50% rule conta APENAS toil estrito
|
|
154
|
+
(6 critérios canônicos). Audit lista overhead em seção própria,
|
|
155
|
+
fora do total.
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### ANTI: hero culture (toil mascara via heroísmo)
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
ANTI: engineer fica 2h por dia executando deploys manuais e é "celebrado
|
|
162
|
+
por dedicação" / "salvador" — toil nunca aparece em métrica.
|
|
163
|
+
|
|
164
|
+
PROBLEMA: toil invisível para liderança; investimento em automação adiado
|
|
165
|
+
indefinidamente; engineer pede demissão; sucessor herda toil sem
|
|
166
|
+
context — incidente garantido. Ciclo se repete.
|
|
167
|
+
|
|
168
|
+
CERTO: TOIL-AUDIT trimestral mandatório; quantificar em hours/week por
|
|
169
|
+
pessoa; tornar visível em dashboards de produtividade. Heroísmo
|
|
170
|
+
sustentado = sinal de underinvestment, não de mérito.
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### ANTI: documentar runbook em vez de automatizar
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
ANTI: "Vamos só escrever um doc detalhado de como fazer isso passo-a-passo"
|
|
177
|
+
— runbook de 30 passos no wiki, sem script.
|
|
178
|
+
|
|
179
|
+
PROBLEMA: L1 (Documented) ainda é toil — humano lê doc, segue passos,
|
|
180
|
+
falha em algum, doc desatualiza em 3 meses; primeira pessoa que
|
|
181
|
+
segue após drift quebra prod; ninguém atualiza doc retroativamente.
|
|
182
|
+
|
|
183
|
+
CERTO: doc como passo intermediário (L1); meta é L3/L4 (autonomous);
|
|
184
|
+
marcar runbook com TODO de automação + owner + due date; sprint
|
|
185
|
+
seguinte transforma em script (L2) ou melhor.
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### ANTI: automatizar parcialmente
|
|
189
|
+
|
|
190
|
+
```text
|
|
191
|
+
ANTI: script faz 3 dos 5 passos; humano completa os outros 2 — "execute
|
|
192
|
+
primeiro ./step1.sh, depois manualmente faça X em prod, depois
|
|
193
|
+
./step3.sh".
|
|
194
|
+
|
|
195
|
+
PROBLEMA: ainda é toil (humano envolvido); contexto-switch entre script e
|
|
196
|
+
humano dobra tempo total; script raramente atualizado por estar
|
|
197
|
+
"incompleto"; degrada para chain frágil que ninguém quer mexer.
|
|
198
|
+
|
|
199
|
+
CERTO: automação completa OU não automatizar — meias-medidas perpetuam.
|
|
200
|
+
Se faltam 2 passos manuais, gastar mais 1 dia para fechar o loop;
|
|
201
|
+
resultado é L3/L4 autônomo, não L1.5 frankenstein.
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### ANTI: ignorar toil de baixa frequência
|
|
205
|
+
|
|
206
|
+
```text
|
|
207
|
+
ANTI: "Só faço isso 1× por trimestre, não vale automatizar" — descartar
|
|
208
|
+
tarefas raras do audit.
|
|
209
|
+
|
|
210
|
+
PROBLEMA: cumulative impact alto (10 tarefas trimestrais × 4 trimestres ×
|
|
211
|
+
30 min = 20h/ano); cada vez que retorna, pessoa esquece passos;
|
|
212
|
+
documentação envelhece entre execuções; DR exercises e migrations
|
|
213
|
+
raras são exatamente onde erro humano custa mais.
|
|
214
|
+
|
|
215
|
+
CERTO: priorizar por (frequency × pain) / effort; baixa frequência +
|
|
216
|
+
alto pain (e.g., DR exercise, schema migration crítica) = ainda
|
|
217
|
+
P1. Frequência baixa ≠ toil baixo — soma de raras é alta.
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Verificação
|
|
221
|
+
|
|
222
|
+
Antes de marcar audit de toil como completo:
|
|
223
|
+
|
|
224
|
+
1. **Aplicado os 6 critérios canônicos** — cada item passou pelo decision tree (manual, repetitivo, automatizável, tático, sem valor durável, escala linear)
|
|
225
|
+
2. **Quantificado em hours/week** — não "muito toil" mas "3.5h/week por pessoa"
|
|
226
|
+
3. **% do tempo do time** computado — comparado contra ≤ 50% rule
|
|
227
|
+
4. **Priorização por (frequency × pain) / effort** — P0/P1/P2 atribuído
|
|
228
|
+
5. **Owner nomeado** para cada item P0
|
|
229
|
+
6. **Overhead identificado separadamente** — não conta para ≤ 50%
|
|
230
|
+
7. **Grungy work identificado separadamente** — projeto engineering, não toil
|
|
231
|
+
8. **Pelo menos 1 item P0 escalonado** com automação proposta + esforço estimado
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Ver também
|
|
236
|
+
|
|
237
|
+
- [`_shared-sre/glossary.md`](../_shared-sre/glossary.md) — termos canônicos toil, overhead, grungy work, automation
|
|
238
|
+
- [`observability-maturity-model`](../observability-maturity-model/SKILL.md) (v1.9) — Capacidade 3 (Complexidade/Tech Debt) consome toil score
|
|
239
|
+
- [`production-readiness-review`](../production-readiness-review/SKILL.md) — PRR axis "Change Management" verifica deploy não é toil
|
|
240
|
+
- [`blameless-postmortems`](../blameless-postmortems/SKILL.md) — postmortems de toil-induced incidents alimentam audit
|
|
241
|
+
- [`sre-risk-management`](../sre-risk-management/SKILL.md) — toil reduz tempo para reduzir risk
|
|
242
|
+
|
|
243
|
+
*Material-fonte: Site Reliability Engineering — Beyer, Jones, Petoff, Murphy (Google/O'Reilly, 2016) — Cap 5: "Eliminating Toil".*
|
|
@@ -26,6 +26,28 @@ LLM carrega esta skill ao definir/avaliar SLOs ou substituir alertas threshold p
|
|
|
26
26
|
- **Owner explícito** — cada SLO tem dono nomeado. Sem owner = sem ação = sem valor.
|
|
27
27
|
- **Substituir alertas threshold gradualmente** — após SLO comprovar valor (1+ incident detectado por SLO antes de threshold), DELETAR threshold antigo.
|
|
28
28
|
|
|
29
|
+
## Risk continuum — SLO target é decisão explícita
|
|
30
|
+
|
|
31
|
+
> Cross-ref canônico: [sre-risk-management](../sre-risk-management/SKILL.md) (cap 3 do livro Google SRE — Embracing Risk).
|
|
32
|
+
|
|
33
|
+
SLO target NÃO é meta arbitrária ("queremos 99.99% porque soa bom"). É uma escolha consciente no **continuum risk × innovation**: cada nove adicional **multiplica custo** mas **divide benefício marginal** percebido pelo cliente.
|
|
34
|
+
|
|
35
|
+
| Target | Tolerância 30d | User-perceptible? | Quando faz sentido |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| 99% | 7.2 h | Sim, notável | Tier free, beta features, internal tools |
|
|
38
|
+
| 99.5% | 3.6 h | Notável em paths críticos | Tier free de produção |
|
|
39
|
+
| 99.9% | 43.2 min | Aceitável para maior parte de UX | Tier paid default |
|
|
40
|
+
| 99.95% | 21.6 min | Quase imperceptível | Tier enterprise / mission-critical |
|
|
41
|
+
| 99.99% | 4.3 min | Imperceptível em smartphone (~99% no canal do user) | Apenas se justificado por user perception (raro) |
|
|
42
|
+
|
|
43
|
+
**Sabedoria 99.99%** — cliente final acessa via smartphone (~99% disponibilidade) com ISP residencial (~99%). Serviço 99.99% **não é distinguível** de 99.999% nesse contexto: ambos parecem "sempre funcionando". Esforço além de 99.95% para serviço user-facing é tipicamente desperdício.
|
|
44
|
+
|
|
45
|
+
**Error budget é o instrumento contábil dessa decisão.** Para SLO 99.9% em 30d com 10M eventos: budget = `0.001 × 10M = 10k bad events`. Esse 10k é orçamento explícito para gastar em deploys arriscados, experimentos, refactors. Quando esgota, releases freezam até regenerar — não como punição, mas como **balanço explícito risk × innovation**.
|
|
46
|
+
|
|
47
|
+
**Diferentes tiers, diferentes targets** — `customer.tier='enterprise'` pode justificar 99.95%; `tier='free'` pode operar em 99.5%. Tratar todos como tier-1 desperdiça budget; tratar todos como tier-3 frustra clientes pagantes. A skill `sre-risk-management` documenta o framework completo de decisão.
|
|
48
|
+
|
|
49
|
+
> Em resumo: a regra `Target ≤ 99.95%` desta skill (acima) é **consequência** do risk continuum, não restrição arbitrária. Para 99.99%+ trate como métrica informativa (dashboard), NÃO como SLO acionável (alerts).
|
|
50
|
+
|
|
29
51
|
## Patterns canônicos
|
|
30
52
|
|
|
31
53
|
### Pattern: SLI event-based vs time-based
|