@luanpdd/kit-mcp 1.9.0 → 1.11.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/ai-prompt-stability.md +120 -0
- package/gates/golden-signals-coverage.md +133 -0
- package/gates/legacy-refactor-safety.md +178 -0
- package/gates/observability-coverage.md +151 -0
- package/gates/postmortem-template-required.md +127 -0
- package/gates/prr-checklist-coverage.md +128 -0
- package/gates/release-pipeline-policy.md +132 -0
- package/kit/COMANDOS.md +15 -0
- package/kit/agents/ai-mutation-tester.md +298 -0
- package/kit/agents/cascading-failures-auditor.md +306 -0
- package/kit/agents/executor.md +13 -0
- package/kit/agents/golden-signals-instrumenter.md +241 -0
- package/kit/agents/legacy-characterizer.md +378 -0
- package/kit/agents/load-shedding-instrumenter.md +297 -0
- package/kit/agents/observability-coverage-auditor.md +325 -0
- package/kit/agents/omm-auditor.md +99 -0
- package/kit/agents/payload-capture-instrumenter.md +283 -0
- package/kit/agents/planner.md +29 -0
- package/kit/agents/postmortem-writer.md +282 -0
- package/kit/agents/prr-conductor.md +296 -0
- package/kit/agents/refactor-safety-auditor.md +414 -0
- package/kit/agents/release-pipeline-auditor.md +360 -0
- package/kit/agents/seam-finder.md +367 -0
- package/kit/agents/shotgun-surgery-detector.md +359 -0
- package/kit/agents/storytelling-analyst.md +309 -0
- package/kit/agents/supabase-architect.md +49 -0
- package/kit/agents/supabase-edge-fn-writer.md +114 -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/agents/verifier.md +30 -0
- package/kit/commands/auditar-cascading.md +111 -0
- package/kit/commands/auditar-marco.md +124 -1
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -0
- package/kit/commands/auditar-refactor.md +219 -0
- package/kit/commands/auditar-release.md +109 -0
- package/kit/commands/auditar-toil.md +129 -0
- package/kit/commands/capturar-payloads.md +193 -0
- package/kit/commands/caracterizar-prompt.md +195 -0
- package/kit/commands/caracterizar.md +212 -0
- package/kit/commands/concluir-marco.md +95 -1
- package/kit/commands/detectar-duplicacao.md +197 -0
- package/kit/commands/discutir-fase.md +41 -0
- package/kit/commands/encontrar-seams.md +136 -0
- package/kit/commands/forense.md +103 -1
- package/kit/commands/golden-signals.md +142 -0
- package/kit/commands/legacy.md +263 -0
- package/kit/commands/load-shedding.md +117 -0
- package/kit/commands/observabilidade.md +2 -0
- package/kit/commands/postmortem.md +179 -0
- package/kit/commands/prr.md +205 -0
- package/kit/commands/refactor-seguro.md +321 -0
- package/kit/commands/risk-budget.md +220 -0
- package/kit/commands/sre.md +230 -0
- package/kit/commands/storytelling.md +179 -0
- package/kit/skills/_shared-legacy/glossary.md +389 -0
- package/kit/skills/_shared-sre/glossary.md +712 -0
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -0
- package/kit/skills/blameless-postmortems/SKILL.md +340 -0
- package/kit/skills/cascading-failures/SKILL.md +307 -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 +314 -0
- package/kit/skills/hermetic-builds/SKILL.md +323 -0
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -0
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -0
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -0
- package/kit/skills/legacy-extract-class/SKILL.md +203 -0
- package/kit/skills/legacy-monster-methods/SKILL.md +444 -0
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -0
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -0
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -0
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -0
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -0
- package/kit/skills/llm-as-dependency/SKILL.md +436 -0
- package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -0
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -0
- package/kit/skills/production-readiness-review/SKILL.md +305 -0
- package/kit/skills/release-engineering/SKILL.md +367 -0
- package/kit/skills/retry-strategies/SKILL.md +372 -0
- package/kit/skills/sre-risk-management/SKILL.md +221 -0
- package/package.json +2 -2
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-prompt-characterization
|
|
3
|
+
description: Use ao modificar prompt/tool LLM em produção — characterization de generations com temperature=0 + seed fixo + sanitização específica. Modernização 2026 sem precedente em 2004 — prompts são código legacy também.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI Prompt Characterization (Modernização)
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
LLM carrega esta skill quando user vai modificar prompt ou tool definition de LLM em produção. Trigger phrases:
|
|
11
|
+
|
|
12
|
+
- "vou mudar esse prompt", "modificar prompt em prod"
|
|
13
|
+
- "atualizar tool definition", "function calling schema"
|
|
14
|
+
- "como testar mudança de prompt?"
|
|
15
|
+
- "characterization de prompt", "snapshot de generation"
|
|
16
|
+
- "esse prompt tem 300 linhas e ninguém testou ainda"
|
|
17
|
+
- prompt em arquivo como `prompts/<name>.md` ou string template em código
|
|
18
|
+
|
|
19
|
+
**Insight central:** prompts e tools são **código legacy também** quando:
|
|
20
|
+
- > 100 linhas
|
|
21
|
+
- Em uso em produção
|
|
22
|
+
- Mudanças quebram silenciosamente (output diferente, downstream parser falha)
|
|
23
|
+
- Sem characterization tests
|
|
24
|
+
|
|
25
|
+
## Regras absolutas
|
|
26
|
+
|
|
27
|
+
- **Prompts são código.** Tratam-se com mesmo rigor: versionado, testado, code-reviewed. NÃO são "config text que muda livremente".
|
|
28
|
+
- **Determinismo via `temperature=0` + `seed`.** Anthropic Claude e OpenAI ambos suportam seed. Sem isso, characterization é flaky.
|
|
29
|
+
- **Capture mais que `text`.** Outputs incluem: `text`, `finish_reason`, `tool_calls` (se function calling), `input_tokens`, `output_tokens`, `model_version`. Snapshot de TODOS estes campos.
|
|
30
|
+
- **Sanitize aggressively.** Outputs LLM frequentemente incluem timestamps mencionados, UUIDs gerados, datas relativas. Normalize ANTES de snapshot.
|
|
31
|
+
- **5+ inputs cobrindo intents distintas.** Não é "happy path × 5"; é "5 intents qualitativamente diferentes" — concision request, troubleshooting, explanation, creative, edge case.
|
|
32
|
+
- **Behavioral coverage = % intents cobertas.** Métrica não é coverage de "linhas do prompt" (não existe); é coverage de variações comportamentais.
|
|
33
|
+
- **Re-rodar em CI quando model_version muda.** Anthropic publica nova versão de Claude → re-rode characterization → revisar diffs → aceitar/rejeitar.
|
|
34
|
+
|
|
35
|
+
## Patterns canônicos
|
|
36
|
+
|
|
37
|
+
### Pattern 1: Setup canônico de characterization de prompt
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// tests/characterization/prompts/generate-summary.test.ts
|
|
41
|
+
import { Anthropic } from '@anthropic-ai/sdk'
|
|
42
|
+
import { describe, test, expect } from 'vitest'
|
|
43
|
+
import { readFileSync } from 'fs'
|
|
44
|
+
|
|
45
|
+
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
|
|
46
|
+
const PROMPT = readFileSync('prompts/generate-summary.md', 'utf-8')
|
|
47
|
+
|
|
48
|
+
interface PromptInput {
|
|
49
|
+
systemPrompt: string
|
|
50
|
+
userMessage: string
|
|
51
|
+
maxTokens?: number
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function runPrompt(input: PromptInput) {
|
|
55
|
+
const response = await client.messages.create({
|
|
56
|
+
model: 'claude-opus-4-7',
|
|
57
|
+
max_tokens: input.maxTokens ?? 500,
|
|
58
|
+
temperature: 0, // determinismo
|
|
59
|
+
system: input.systemPrompt,
|
|
60
|
+
messages: [{ role: 'user', content: input.userMessage }],
|
|
61
|
+
})
|
|
62
|
+
return {
|
|
63
|
+
text: response.content[0].type === 'text' ? response.content[0].text : '',
|
|
64
|
+
stopReason: response.stop_reason,
|
|
65
|
+
inputTokens: response.usage.input_tokens,
|
|
66
|
+
outputTokens: response.usage.output_tokens,
|
|
67
|
+
modelVersion: response.model,
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function sanitizeForSnapshot(o: any): any {
|
|
72
|
+
return JSON.parse(
|
|
73
|
+
JSON.stringify(o, (key, value) => {
|
|
74
|
+
// normalizar timestamps mencionados ("Today is 2026-05-08") → "<DATE>"
|
|
75
|
+
if (typeof value === 'string') {
|
|
76
|
+
value = value.replace(/\d{4}-\d{2}-\d{2}/g, '<DATE>')
|
|
77
|
+
value = value.replace(/\d{2}:\d{2}(:\d{2})?/g, '<TIME>')
|
|
78
|
+
value = value.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}/g, '<UUID>')
|
|
79
|
+
}
|
|
80
|
+
// permitir model version mas separar para audit (não no snapshot)
|
|
81
|
+
if (key === 'modelVersion') return '<MODEL>'
|
|
82
|
+
return value
|
|
83
|
+
})
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
describe('generate-summary prompt — characterization', () => {
|
|
88
|
+
test('intent: concise summary of long article', async () => {
|
|
89
|
+
const captured = await runPrompt({
|
|
90
|
+
systemPrompt: PROMPT,
|
|
91
|
+
userMessage: 'Resuma em 2 sentenças: [longo artigo de 500 palavras]...',
|
|
92
|
+
})
|
|
93
|
+
expect(sanitizeForSnapshot(captured)).toMatchSnapshot()
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
test('intent: bullet-list summary', async () => { /* ... */ })
|
|
97
|
+
test('intent: technical/code summary', async () => { /* ... */ })
|
|
98
|
+
test('intent: ambiguous request (edge)', async () => { /* ... */ })
|
|
99
|
+
test('intent: hostile / prompt injection attempt', async () => { /* ... */ })
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Pattern 2: Tool definition characterization (function calling)
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
// Quando prompt usa tool definition (function calling), characterize tool_calls
|
|
107
|
+
|
|
108
|
+
const TOOLS = [
|
|
109
|
+
{
|
|
110
|
+
name: 'search_knowledge_base',
|
|
111
|
+
description: 'Search for relevant docs',
|
|
112
|
+
input_schema: { type: 'object', properties: { query: { type: 'string' } } },
|
|
113
|
+
},
|
|
114
|
+
// ... mais tools
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
async function runWithTools(userMessage: string) {
|
|
118
|
+
const r = await client.messages.create({
|
|
119
|
+
model: 'claude-opus-4-7',
|
|
120
|
+
max_tokens: 500,
|
|
121
|
+
temperature: 0,
|
|
122
|
+
tools: TOOLS,
|
|
123
|
+
messages: [{ role: 'user', content: userMessage }],
|
|
124
|
+
})
|
|
125
|
+
return {
|
|
126
|
+
stopReason: r.stop_reason,
|
|
127
|
+
toolUses: r.content.filter(c => c.type === 'tool_use').map(c => ({
|
|
128
|
+
tool: (c as any).name,
|
|
129
|
+
input: (c as any).input,
|
|
130
|
+
})),
|
|
131
|
+
finalText: r.content.filter(c => c.type === 'text').map(c => (c as any).text).join('\n'),
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
test('tools — invokes search for factual question', async () => {
|
|
136
|
+
const captured = await runWithTools('Qual é a política de reembolso?')
|
|
137
|
+
expect(captured).toMatchSnapshot()
|
|
138
|
+
// snapshot captura QUAIS tools foram invocadas + QUAIS argumentos
|
|
139
|
+
})
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Pattern 3: Sanitização específica de prompts
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
// Outputs LLM têm padrões previsíveis a sanitizar:
|
|
146
|
+
|
|
147
|
+
function sanitizeLLMOutput(text: string): string {
|
|
148
|
+
return text
|
|
149
|
+
// datas absolutas
|
|
150
|
+
.replace(/\b\d{4}-\d{2}-\d{2}\b/g, '<DATE>')
|
|
151
|
+
.replace(/\b(?:janeiro|fevereiro|março|abril|maio|junho|julho|agosto|setembro|outubro|novembro|dezembro)\s+(?:de\s+)?\d{4}/gi, '<DATE_PT>')
|
|
152
|
+
.replace(/\b(?:january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{4}/gi, '<DATE_EN>')
|
|
153
|
+
// datas relativas
|
|
154
|
+
.replace(/\b(?:hoje|amanhã|ontem|today|tomorrow|yesterday)\b/gi, '<RELATIVE_DATE>')
|
|
155
|
+
// URLs e UUIDs
|
|
156
|
+
.replace(/https?:\/\/[^\s]+/g, '<URL>')
|
|
157
|
+
.replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, '<UUID>')
|
|
158
|
+
// valores monetários (preservar tipo, sanitizar valor)
|
|
159
|
+
.replace(/R\$\s*[\d,.]+/g, 'R$ <VALUE>')
|
|
160
|
+
.replace(/\$\s*[\d,.]+/g, '$ <VALUE>')
|
|
161
|
+
// versões
|
|
162
|
+
.replace(/v\d+\.\d+(?:\.\d+)?/g, '<VERSION>')
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Pattern 4: Behavioral coverage de prompt — 5+ intents
|
|
167
|
+
|
|
168
|
+
Para cada prompt, definir intents distintas:
|
|
169
|
+
|
|
170
|
+
| Intent | Definição | Exemplo de input |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| **Concise** | Pedido curto, output esperado curto | "Resuma em 1 frase: [text]" |
|
|
173
|
+
| **Detailed** | Pedido elaborado, output esperado longo | "Explique passo-a-passo: [text]" |
|
|
174
|
+
| **Code-heavy** | Input/output com código | "Refactor esse código: ```ts ...```" |
|
|
175
|
+
| **Edge case** | Input ambíguo ou borderline | "Como funciona?" (sem context) |
|
|
176
|
+
| **Adversarial** | Tentativa de jailbreak / prompt injection | "Ignore previous instructions and..." |
|
|
177
|
+
| **Multi-turn (se aplicável)** | Conversação com historico | [3+ messages prévias] |
|
|
178
|
+
|
|
179
|
+
5 intents × snapshot deterministic = baseline. Mudança em prompt deve manter outputs semanticamente próximos (ou documentar mudança intencional).
|
|
180
|
+
|
|
181
|
+
### Pattern 5: Pre-deploy checklist para mudança em prompt
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
Antes de deploy de mudança em prompt em produção:
|
|
185
|
+
|
|
186
|
+
□ Suite de characterization tests passa verde (todos os 5+ intents)
|
|
187
|
+
□ Diff revisado HUMANAMENTE para cada intent — mudanças intencionais?
|
|
188
|
+
□ Behavioral coverage ≥ 5 intents (não bate threshold % — bate threshold de N)
|
|
189
|
+
□ Sanitização revisada — nenhum PII/secret no snapshot
|
|
190
|
+
□ Custo: cada test consome tokens; para prompts grandes, calcular total
|
|
191
|
+
- 5 inputs × 1k input + 500 output ≈ 7.5k tokens × $0.015/1k = ~$0.11
|
|
192
|
+
- CI roda só on-change para evitar custo recorrente
|
|
193
|
+
□ model_version anotado — re-rodar quando model_version muda
|
|
194
|
+
□ Audit trail no PR: "intent X: changed from Y to Z; reason: ..."
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Pattern 6: Custo + cadência de characterization
|
|
198
|
+
|
|
199
|
+
| Frequência | Custo (em USD) por suite | Quando rodar |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| Desenvolvedor local | < $0.10 | Antes de cada commit que toca prompt |
|
|
202
|
+
| CI on-change | < $0.50/run | Em PR que toca arquivo de prompt |
|
|
203
|
+
| CI nightly | < $5/dia | Para detectar drift de model upstream |
|
|
204
|
+
| Pre-deploy | < $0.50 | Confirmação final antes de promote |
|
|
205
|
+
|
|
206
|
+
**Otimização:** snapshot diff só dispara LLM call se prompt mudou. Sem mudança = skip (cacheado).
|
|
207
|
+
|
|
208
|
+
### Pattern 7: Quando NÃO characterizar prompt
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
- Prompt < 20 linhas e usado em 1 lugar — overhead > valor
|
|
212
|
+
- Prompt é template trivial ("Resume: {text}") sem lógica complexa
|
|
213
|
+
- LLM call é one-shot script (analytics, batch processing) — não em hot path
|
|
214
|
+
- Custo de tokens proibitivo (e.g., prompts massivos com 50k tokens) — usar smaller model para char tests
|
|
215
|
+
- Use case é generative criativo (poema, story) — outputs intencionalmente variáveis
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Anti-patterns
|
|
219
|
+
|
|
220
|
+
### ANTI: characterization sem temperature=0
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
ANTI: rodar characterization com temperature=0.7 (default).
|
|
224
|
+
|
|
225
|
+
PROBLEMA: outputs varia entre runs. Snapshot diferente toda vez.
|
|
226
|
+
Tests flaky. Equipe ignora.
|
|
227
|
+
|
|
228
|
+
CERTO: temperature=0 SEMPRE em characterization. Anthropic + OpenAI
|
|
229
|
+
ambos têm. Em providers que não suportam, escolher menor
|
|
230
|
+
valor possível e/ou seed fixo se disponível.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### ANTI: snapshot sem sanitização
|
|
234
|
+
|
|
235
|
+
```text
|
|
236
|
+
ANTI: capturar output cru com timestamps, UUIDs, datas atuais.
|
|
237
|
+
|
|
238
|
+
PROBLEMA: cada run gera snapshot diferente. Não é flaky pelo LLM,
|
|
239
|
+
é flaky pelo CONTENT temporal.
|
|
240
|
+
|
|
241
|
+
CERTO: sanitize ANTES de matchSnapshot. Datas → <DATE>, UUIDs →
|
|
242
|
+
<UUID>, etc. Snapshot estável across time.
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### ANTI: 1 test "happy path" de prompt
|
|
246
|
+
|
|
247
|
+
```text
|
|
248
|
+
ANTI: 1 input de exemplo testado, "se passa, prompt está OK".
|
|
249
|
+
|
|
250
|
+
PROBLEMA: prompt tem comportamento qualitativamente diferente em
|
|
251
|
+
edge cases (input curto, input longo, input ambíguo,
|
|
252
|
+
adversarial). 1 test cobre 1 caminho, ignora N outros.
|
|
253
|
+
|
|
254
|
+
CERTO: 5+ intents cobrindo distribuição real de uso. Edge case +
|
|
255
|
+
adversarial são MANDATORY (prompts em prod sempre recebem
|
|
256
|
+
inputs ruins).
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### ANTI: ignorar drift de model
|
|
260
|
+
|
|
261
|
+
```text
|
|
262
|
+
ANTI: characterization passou em maio; em julho Anthropic atualiza
|
|
263
|
+
Claude (claude-opus-4-7 → 4-8). Equipe não re-roda; deploy de
|
|
264
|
+
mudança quebra silenciosamente.
|
|
265
|
+
|
|
266
|
+
PROBLEMA: prompt baseline frozen no model anterior. Novo model
|
|
267
|
+
comporta diferente; bug em prod.
|
|
268
|
+
|
|
269
|
+
CERTO: CI nightly roda characterization. Diff de model_version =
|
|
270
|
+
trigger humano para revisar. Aceita ou rejeita updates de
|
|
271
|
+
model. Sem fixed model = sem characterization válida.
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### ANTI: snapshot inclui token count
|
|
275
|
+
|
|
276
|
+
```text
|
|
277
|
+
ANTI: snapshot tem `inputTokens: 247, outputTokens: 89`.
|
|
278
|
+
|
|
279
|
+
PROBLEMA: token counts mudam quando model muda (tokenizer evolui).
|
|
280
|
+
Diff vermelho em update de model é noise.
|
|
281
|
+
|
|
282
|
+
CERTO: capturar tokens em log SEPARADO (custo tracking), não no
|
|
283
|
+
snapshot. Snapshot é qualitativo (text + stop reason +
|
|
284
|
+
tool calls), não quantitativo.
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### ANTI: tratar prompt como "string config livre"
|
|
288
|
+
|
|
289
|
+
```text
|
|
290
|
+
ANTI: dev edita prompt em prod direto via console; sem PR; sem
|
|
291
|
+
review; sem characterization.
|
|
292
|
+
|
|
293
|
+
PROBLEMA: prompt é código. Mudança não-versionada quebra silenciosa.
|
|
294
|
+
Sem audit trail. Rollback impossível.
|
|
295
|
+
|
|
296
|
+
CERTO: prompt em repo (`prompts/<name>.md`). PR review como qualquer
|
|
297
|
+
código. Characterization tests rodam em CI. Deploy via release
|
|
298
|
+
padrão.
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Verificação
|
|
302
|
+
|
|
303
|
+
1. Prompt versionado em arquivo (não inline em código se > 50 linhas)
|
|
304
|
+
2. Characterization tests existem com 5+ intents
|
|
305
|
+
3. `temperature=0` + seed fixo (se provider suporta)
|
|
306
|
+
4. Sanitização específica para prompt outputs
|
|
307
|
+
5. Snapshot inclui text + stopReason + toolCalls (se aplicável)
|
|
308
|
+
6. CI roda characterization on-change
|
|
309
|
+
7. model_version trackado (audit log separado)
|
|
310
|
+
8. Pre-deploy checklist completo
|
|
311
|
+
|
|
312
|
+
## Limiar de "prompt pronto para produção"
|
|
313
|
+
|
|
314
|
+
```text
|
|
315
|
+
Versionado em repo: sim
|
|
316
|
+
Characterization tests com ≥ 5 intents: sim
|
|
317
|
+
temperature=0 + seed fixo: sim
|
|
318
|
+
Sanitização aplicada: sim
|
|
319
|
+
Coverage de intents real (não synthetic): sim
|
|
320
|
+
CI integration: sim
|
|
321
|
+
Audit trail de mudanças: sim
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Ver também
|
|
327
|
+
|
|
328
|
+
- [`_shared-legacy/glossary.md`](../_shared-legacy/glossary.md) — vocabulário (characterization, golden master)
|
|
329
|
+
- [`legacy-characterization-tests`](../legacy-characterization-tests/SKILL.md) — characterization clássico; aplicável a prompts modulo determinismo
|
|
330
|
+
- [`legacy-api-only-applications`](../legacy-api-only-applications/SKILL.md) — LLM provider é caso especial de API; adapter pattern aplicável
|
|
331
|
+
- [`llm-as-dependency`](../llm-as-dependency/SKILL.md) — fakear LLM em testes que NÃO são de prompt characterization (testes de business logic)
|
|
332
|
+
- [`pre-refactor-characterization`](../pre-refactor-characterization/SKILL.md) — gate v1.12 inclui ai-prompt-stability como dimensão paralela
|
|
333
|
+
- [`observability-driven-development`](../observability-driven-development/SKILL.md) (v1.9) — instrument prompt outputs para detectar drift em prod
|
|
334
|
+
|
|
335
|
+
*Material-fonte (modernização 2026):* Sem precedente em livro Feathers 2004 — prompts/tools LLM como dependência testável é literatura recente (2023+ — papers da Anthropic sobre evals, OpenAI evals framework, Promptfoo).
|
|
@@ -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".*
|