@luanpdd/kit-mcp 1.8.1 → 1.9.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.
Files changed (41) hide show
  1. package/README.md +39 -1
  2. package/gates/obs-agents-mcp-supabase.md +86 -0
  3. package/gates/obs-skills-frontmatter.md +76 -0
  4. package/gates/omm-no-regression.md +83 -0
  5. package/gates/skill-must-include.md +21 -19
  6. package/kit/agents/burn-rate-forecaster.md +160 -0
  7. package/kit/agents/incident-investigator.md +245 -0
  8. package/kit/agents/observability-instrumenter.md +200 -0
  9. package/kit/agents/omm-auditor.md +199 -0
  10. package/kit/agents/slo-engineer.md +224 -0
  11. package/kit/agents/supabase-architect.md +13 -0
  12. package/kit/agents/supabase-auth-bootstrapper.md +17 -0
  13. package/kit/agents/supabase-edge-fn-writer.md +22 -0
  14. package/kit/agents/supabase-migration-writer.md +18 -0
  15. package/kit/agents/supabase-realtime-implementer.md +23 -0
  16. package/kit/agents/supabase-rls-writer.md +17 -0
  17. package/kit/agents/supabase-storage-implementer.md +18 -0
  18. package/kit/commands/auditar-marco.md +22 -1
  19. package/kit/commands/auditar-observabilidade.md +103 -0
  20. package/kit/commands/burn-rate-status.md +140 -0
  21. package/kit/commands/concluir-marco.md +19 -1
  22. package/kit/commands/definir-slo.md +108 -0
  23. package/kit/commands/discutir-fase.md +26 -0
  24. package/kit/commands/forense.md +20 -1
  25. package/kit/commands/instrumentar-fase.md +200 -0
  26. package/kit/commands/investigar-producao.md +162 -0
  27. package/kit/commands/observabilidade.md +116 -0
  28. package/kit/commands/planejar-fase.md +20 -0
  29. package/kit/commands/verificar-trabalho.md +26 -0
  30. package/kit/skills/_shared-observability/glossary.md +396 -0
  31. package/kit/skills/burn-rate-alerting/SKILL.md +258 -0
  32. package/kit/skills/core-analysis-loop/SKILL.md +352 -0
  33. package/kit/skills/distributed-tracing/SKILL.md +362 -0
  34. package/kit/skills/event-based-slos/SKILL.md +274 -0
  35. package/kit/skills/observability-driven-development/SKILL.md +315 -0
  36. package/kit/skills/observability-maturity-model/SKILL.md +222 -0
  37. package/kit/skills/opentelemetry-standard/SKILL.md +351 -0
  38. package/kit/skills/structured-events/SKILL.md +265 -0
  39. package/kit/skills/telemetry-pipelines/SKILL.md +259 -0
  40. package/kit/skills/telemetry-sampling/SKILL.md +256 -0
  41. package/package.json +1 -1
@@ -0,0 +1,396 @@
1
+ # Glossário Observabilidade — Termos, Comandos e Patterns Canônicos
2
+
3
+ > Arquivo de referência compartilhado pelas skills `observability-*` e `*-events`, `*-tracing`, `*-slo*`, `*-sampling`, `*-pipelines`, `*-maturity-model`. **NÃO é skill** — não tem `description:` triggerável; não aparece em `listKit`. Cross-referenciado pelas skills via Markdown link relativo.
4
+
5
+ > **Material-fonte:** *Observability Engineering* — Charity Majors, Liz Fong-Jones, George Miranda (O'Reilly, 2022). ISBN 978-1-492-07644-5.
6
+
7
+ ---
8
+
9
+ ## (a) Termos PT-BR ↔ EN
10
+
11
+ ### Conceitos centrais
12
+
13
+ | EN | PT-BR / Significado |
14
+ |---|---|
15
+ | **observability** | Observabilidade — capacidade de explicar **qualquer** estado novo do sistema sem precisar fazer novo deploy de instrumentação. Contraste com **monitoring**, que requer prever falhas em advance. |
16
+ | **monitoring** | Monitoramento — coleta de métricas pré-definidas para detectar **estados conhecidos** (CPU > 80%, memória < 10%). Insuficiente para distributed systems modernos. |
17
+ | **cardinality** | Cardinalidade — número de valores únicos possíveis em um campo. `user.id` em app com 1M usuários = cardinalidade 1M. **Alta cardinalidade é essencial** para observabilidade. |
18
+ | **dimensionality** | Dimensionalidade — número de campos/atributos em um evento. Wide events têm alta dimensionalidade (100+ campos). |
19
+ | **first principles** | Primeiros princípios — raciocínio do zero sobre o sistema, sem assumir nada. Base do `core-analysis-loop`. |
20
+ | **wide event** | Evento amplo — 1 evento por request com muitos campos (alta dimensionalidade) e alta cardinalidade. **Building block** da observabilidade (cap 5). |
21
+
22
+ ### Telemetria
23
+
24
+ | EN | PT-BR / Significado |
25
+ |---|---|
26
+ | **structured event** | Evento estruturado — registro tipado com campos nomeados (JSON ou similar). Contrário de log unstructured (texto livre). |
27
+ | **trace** | Rastro distribuído — coleção de spans relacionados por `trace_id` que descreve o caminho completo de um request através de múltiplos serviços. |
28
+ | **span** | Span — unidade de trabalho dentro de um trace. Identificada por `span_id` único; aponta para `parent_span_id`. |
29
+ | **trace_id** | Identificador único do trace (32 hex chars / 16 bytes). Compartilhado entre todos os spans do mesmo trace. |
30
+ | **span_id** | Identificador único do span (16 hex chars / 8 bytes). |
31
+ | **parent_span_id** | `span_id` do span pai. Null no root span. Define a árvore de spans. |
32
+ | **W3C TraceContext** | Padrão W3C para propagar contexto cross-service via header HTTP `traceparent: 00-{trace_id}-{span_id}-{flags}`. |
33
+ | **B3 / B3M** | Padrão Zipkin de propagação. Headers `X-B3-TraceId`, `X-B3-SpanId`, `X-B3-Sampled`. Suporte secundário em OTel. |
34
+ | **stitching** | Costura — ligar spans relacionados em um trace via `trace_id` + `parent_span_id`. Funciona além de RPCs (batch jobs, lambdas, S3 uploads). |
35
+ | **context propagation** | Propagação de contexto — mecanismo de OTel SDK que serializa/deserializa contexto entre services (header HTTP, gRPC metadata, queue message attrs). |
36
+ | **head-based sampling** | Sampling no início — decisão de sample tomada quando trace é iniciado (no service de entrada). Propagada via flag em `traceparent`. |
37
+ | **tail-based sampling** | Sampling no fim — decisão tomada após trace completar (requer buffer/collector). Permite manter erros + outliers preservando custo. |
38
+
39
+ ### OpenTelemetry
40
+
41
+ | EN | PT-BR / Significado |
42
+ |---|---|
43
+ | **OTel** | OpenTelemetry — projeto CNCF, união de OpenTracing + OpenCensus (2019). Padrão vendor-neutral para telemetria. |
44
+ | **OTel API** | Especificação que devs usam para instrumentar (sem implementação). |
45
+ | **OTel SDK** | Implementação concreta da API: state, batching, exportação. |
46
+ | **Tracer** | Componente do SDK que cria/gerencia spans. |
47
+ | **Meter** | Componente do SDK que cria/gerencia métricas. |
48
+ | **Exporter** | Plug-in do SDK que traduz dados in-memory em formato de destino (OTLP, Jaeger, Prometheus, vendor-specific). |
49
+ | **OTLP** | OpenTelemetry Protocol — wire format default. HTTP em porta 4318; gRPC em 4317. Protobuf schema. |
50
+ | **Collector** | Binário standalone (proxy/sidecar) que recebe telemetria, processa e roteia para múltiplos destinos. |
51
+ | **auto-instrumentation** | Instrumentação automática via wrappers/middleware (HTTP, gRPC, DB drivers). Time-to-first-value baixo. |
52
+ | **custom instrumentation** | Instrumentação manual com atributos de business logic (`customer.tier`, `feature_flag`, `experiment_arm`). |
53
+
54
+ ### SLOs e Burn Rate
55
+
56
+ | EN | PT-BR / Significado |
57
+ |---|---|
58
+ | **SLI** | Service-Level Indicator — métrica que classifica eventos como "good" ou "bad". Deve ser **event-based**, não time-based. |
59
+ | **SLO** | Service-Level Objective — meta interna de SLI (ex: 99.9% das requests com `result.success = true` em 30 dias). |
60
+ | **SLA** | Service-Level Agreement — acordo externo com cliente/usuário. Geralmente menos rígido que SLO interno. |
61
+ | **error budget** | Orçamento de erro — fração de eventos "bad" tolerável dentro de um SLO (ex: SLO 99.9% → 0.1% de budget). |
62
+ | **burn rate** | Taxa de queima — velocidade com que o error budget está sendo consumido. Burn rate 1 = budget durará a janela exata; burn rate 10 = budget acaba 10× mais rápido. |
63
+ | **sliding window** | Janela deslizante — recorte de tempo que avança continuamente (ex: últimos 30d). Recomendado vs **fixed window** (calendário). |
64
+ | **fixed window** | Janela fixa — recorte alinhado ao calendário (ex: dia 1 a 30 do mês). Anti-pattern: cliente não esquece bug do dia 30 só porque virou mês. |
65
+ | **lookahead window** | Janela de previsão — quanto tempo no futuro o burn alert prevê (ex: alert se vai esgotar em 4h). |
66
+ | **baseline window** | Janela de base — quanto tempo passado é usado para calcular burn atual (ex: últimos 1h). Regra: lookahead ≤ 4× baseline sem ajuste de seasonality. |
67
+ | **predictive burn alert** | Alerta preditivo — dispara quando taxa atual prevê esgotamento dentro do lookahead. Mais cedo que zero-level. |
68
+ | **context-aware burn alert** | Alerta com contexto — leva em conta budget remanescente (10% restante = mais urgente que 90%). Mais caro computacionalmente. |
69
+ | **short-term burn alert** | Alerta de curto prazo — só extrapola baseline recente, ignora budget total. Mais barato. |
70
+
71
+ ### Observability-Driven Development (ODD)
72
+
73
+ | EN | PT-BR / Significado |
74
+ |---|---|
75
+ | **ODD** | Observability-Driven Development — análogo a TDD mas para production. Bundle telemetria com feature; valide em prod, não só em testes. |
76
+ | **shift-left observability** | Empurrar observabilidade para a esquerda do SDLC — instrumentar **antes** do PR, não depois do incident. |
77
+ | **production as glass castle** | Anti-pattern — equipes têm medo de mexer em prod porque não conseguem entender o que acontece lá. ODD transforma em "interactive playground". |
78
+ | **auto-page the merger** | Padrão — paginar automaticamente quem mergeou o PR por 30-60min após deploy. Tighten feedback loop. |
79
+ | **decoupling deployments from releases** | Separar deploy de release — feature flags, progressive delivery. Permite observar comportamento antes de expor a 100%. |
80
+
81
+ ### Sampling e Pipelines
82
+
83
+ | EN | PT-BR / Significado |
84
+ |---|---|
85
+ | **constant probability sampling** | Sampling com probabilidade fixa (ex: 1 em 1000). Falha em low volume — eventos raros desaparecem. |
86
+ | **dynamic sampling** | Sampling adaptativo — taxa muda com volume de tráfego ou conteúdo do evento. |
87
+ | **by-key sampling** | Sampling por chave — taxa diferente por valor de campo (ex: 100% de erros, 1% de sucessos, 50% de paying customers). |
88
+ | **telemetry pipeline** | Pipeline de telemetria — sequência de stages (receive → process → route → export). OTel Collector é exemplo. |
89
+ | **routing** | Roteamento — mandar telemetria para destinos diferentes baseado em conteúdo (severity, tenant). |
90
+ | **buffering** | Buffer — armazenar temporariamente para tolerar falhas/lentidão downstream. |
91
+
92
+ ### Observability Maturity Model (OMM)
93
+
94
+ | EN | PT-BR / Significado |
95
+ |---|---|
96
+ | **OMM** | Observability Maturity Model — framework de 5 capacidades para avaliar maturidade de observabilidade de um time/projeto. |
97
+ | **resilience capability** | Capacidade de resiliência — responder a falhas com recovery mensurável (MTTR, on-call burden). |
98
+ | **code quality capability** | Capacidade de qualidade de código — observability ajuda a fechar feedback loop entre dev e prod. |
99
+ | **complexity capability** | Capacidade de manejar complexidade — encontrar gargalos sem chutes; debugging em sistemas grandes. |
100
+ | **release cadence capability** | Capacidade de cadência de release — métrica chave: tempo do commit ao prod. |
101
+ | **user behavior capability** | Capacidade de entender comportamento de usuário — observability data ≈ behavioral data + technical data. |
102
+
103
+ ---
104
+
105
+ ## (b) Comandos canônicos
106
+
107
+ ### OpenTelemetry CLI
108
+
109
+ ```bash
110
+ # Receiver/exporter dev — local OTel Collector via Docker
111
+ docker run -p 4317:4317 -p 4318:4318 \
112
+ -v "$(pwd)/otelcol-config.yaml":/etc/otelcol/config.yaml \
113
+ otel/opentelemetry-collector:latest
114
+
115
+ # Validar config OTLP
116
+ otelcol validate --config=otelcol-config.yaml
117
+
118
+ # Tracegen — gera traces sintéticos para testar pipelines
119
+ telemetrygen traces --otlp-insecure --traces 100 --rate 10
120
+ ```
121
+
122
+ ### Supabase / Postgres — queries para SLI events
123
+
124
+ ```sql
125
+ -- PT-BR: SLI event-based — boa request = HTTP 2xx + duration < 300ms
126
+ -- Materializa contagem em view para alimentar burn rate
127
+ create or replace view obs.sli_endpoint_home as
128
+ select
129
+ date_trunc('minute', created_at) as bucket,
130
+ count(*) filter (where status_code < 400 and duration_ms < 300) as good,
131
+ count(*) filter (where status_code >= 400 or duration_ms >= 300) as bad,
132
+ count(*) as total
133
+ from obs.events
134
+ where event_name = 'http_request' and path = '/home'
135
+ group by bucket;
136
+
137
+ -- PT-BR: burn rate atual com janela deslizante 1h
138
+ select
139
+ sum(bad)::float / nullif(sum(total), 0) as error_rate,
140
+ (sum(bad)::float / nullif(sum(total), 0)) / (1 - 0.999) as burn_rate
141
+ from obs.sli_endpoint_home
142
+ where bucket >= now() - interval '1 hour';
143
+ ```
144
+
145
+ ### Logflare (Supabase logs platform) — equivalentes
146
+
147
+ ```bash
148
+ # CLI logflare — buscar eventos
149
+ supabase logs api --filter "request.path=/home" --limit 100
150
+
151
+ # Via SQL no schema 'logs'
152
+ select metadata->>'request.path', count(*)
153
+ from logs.edge_function_logs
154
+ where timestamp > now() - interval '1h'
155
+ group by 1;
156
+ ```
157
+
158
+ ### MCP tools Supabase (canônico kit-mcp)
159
+
160
+ ```text
161
+ mcp__supabase__get_logs — logs por service (api, postgres, edge-function, auth)
162
+ mcp__supabase__execute_sql — query SQL para validar hipóteses
163
+ mcp__supabase__get_advisors — security/performance lints
164
+ mcp__supabase__list_tables — schema atual
165
+ mcp__supabase__apply_migration — aplicar migration que materializa SLI events
166
+ ```
167
+
168
+ ---
169
+
170
+ ## (c) Patterns canônicos
171
+
172
+ ### Pattern: campos canônicos em wide events
173
+
174
+ Convenção de nomes para atributos OTel/JSON estruturado (dot notation). **Use sempre estes nomes** ao instrumentar:
175
+
176
+ | Campo | Tipo | Exemplo | Por quê |
177
+ |---|---|---|---|
178
+ | `user.id` | uuid | `"550e8400-e29b-41d4-..."` | Cardinalidade alta — debug por usuário |
179
+ | `tenant_id` | uuid/text | `"acme"` | Multi-tenancy — debug por tenant |
180
+ | `request.id` | uuid v4 | `"req_abc123"` | Correlação — propagado via header `x-request-id` |
181
+ | `result.success` | bool | `true` / `false` | SLI event-based — bom/mau |
182
+ | `error.type` | enum | `"timeout"`, `"validation"`, `"auth"`, `"rate_limit"`, `"db"` | Categoria de erro — filtragem rápida |
183
+ | `error.message` | text | `"connection refused"` | Debug — não usado em SLI |
184
+ | `duration_ms` | int | `127` | Latência — sempre milissegundos |
185
+ | `build_id` | text | `"abc123f"` ou `"v1.9.0"` | Debug — comparar versões |
186
+ | `feature_flag.<name>` | bool | `feature_flag.new_checkout: true` | Experimentação — slice/dice |
187
+ | `customer.tier` | enum | `"free"`, `"pro"`, `"enterprise"` | Priorização — sample diferente |
188
+ | `endpoint` | text | `"/api/v1/orders"` | Agrupamento — by-route |
189
+ | `http.status_code` | int | `200`, `404`, `503` | SLI — código HTTP |
190
+
191
+ ### Pattern: estrutura de span OTel
192
+
193
+ ```ts
194
+ // PT-BR: instrumentação canônica de handler com atributos custom
195
+ import { trace } from '@opentelemetry/api'
196
+
197
+ const tracer = trace.getTracer('checkout-service')
198
+
199
+ export async function placeOrder(req: Request) {
200
+ return tracer.startActiveSpan('place_order', async (span) => {
201
+ // PT-BR: atributos canônicos sempre
202
+ span.setAttribute('user.id', req.user.id)
203
+ span.setAttribute('tenant_id', req.tenant)
204
+ span.setAttribute('customer.tier', req.user.tier)
205
+ span.setAttribute('request.id', req.id)
206
+
207
+ try {
208
+ const order = await db.insertOrder(req.body)
209
+ span.setAttribute('result.success', true)
210
+ span.setAttribute('order.id', order.id)
211
+ return order
212
+ } catch (e) {
213
+ span.setAttribute('result.success', false)
214
+ span.setAttribute('error.type', classify(e)) // 'validation' | 'db' | 'rate_limit'
215
+ span.setAttribute('error.message', e.message)
216
+ throw e
217
+ } finally {
218
+ span.end() // PT-BR: SEMPRE em finally — duration_ms calculado aqui
219
+ }
220
+ })
221
+ }
222
+ ```
223
+
224
+ ### Pattern: SLI event-based vs time-based
225
+
226
+ ```ts
227
+ // PT-BR: BAD — time-based SLI (anti-pattern)
228
+ // "p99 latency < 300ms over each 5-minute window"
229
+ // Problema: 5 min de violação no fim de uma janela some quando janela vira
230
+
231
+ // PT-BR: GOOD — event-based SLI
232
+ // "proportion of events with duration < 300ms in last 30d"
233
+ function isGoodEvent(event: HttpEvent): boolean {
234
+ return event.status_code < 400 && event.duration_ms < 300
235
+ }
236
+
237
+ // PT-BR: contagem para SLO
238
+ const total = events.length
239
+ const good = events.filter(isGoodEvent).length
240
+ const slo_compliance = good / total // ≥ 0.999 para SLO 99.9%
241
+ ```
242
+
243
+ ### Pattern: Core Analysis Loop em prosa
244
+
245
+ ```text
246
+ 1. SINTOMA: alerta dispara — "checkout SLO burn rate = 8 (4× acima de 2)"
247
+
248
+ 2. HIPÓTESE inicial (de dados, NÃO intuição):
249
+ - Query 1: GROUP BY error.type — qual erro domina?
250
+ - Resultado: error.type = 'rate_limit' representa 78% dos eventos bad
251
+
252
+ 3. VALIDAÇÃO/REFINAMENTO:
253
+ - Query 2: GROUP BY tenant_id WHERE error.type = 'rate_limit'
254
+ - Resultado: tenant_id = 'acme' representa 95% dos rate_limits
255
+
256
+ 4. PRÓXIMA ITERAÇÃO:
257
+ - Query 3: GROUP BY endpoint WHERE tenant_id = 'acme' AND error.type = 'rate_limit'
258
+ - Resultado: endpoint = '/api/v1/bulk_orders' = 100%
259
+ - ROOT CAUSE: tenant acme está fazendo bulk orders acima do quota.
260
+ - AÇÃO: aumentar quota OU contactar acme OU adicionar backpressure.
261
+ ```
262
+
263
+ ---
264
+
265
+ ## (d) Anti-patterns explícitos
266
+
267
+ ### Dashboard-flipping
268
+
269
+ ```text
270
+ ANTI-PATTERN: ver spike num dashboard, abrir 12 outros dashboards, procurar visualmente
271
+ por "shape similar" para identificar correlação.
272
+
273
+ POR QUÊ É RUIM: pattern matching humano não escala; depende de dashboards pré-criados;
274
+ não funciona para emergent failures (Cap 8).
275
+
276
+ CERTO: usar Core Analysis Loop — partir de uma query, refinar com GROUP BY iterativo,
277
+ chegar à root cause via dados.
278
+ ```
279
+
280
+ ### Cause-based alerts
281
+
282
+ ```text
283
+ ANTI-PATTERN: alertar em CPU > 80%, memória < 10%, threads > N, etc.
284
+ Misturar "what" (sintoma) com "why" (causa raiz).
285
+
286
+ POR QUÊ É RUIM: gera false positives (cron job legítimo dispara CPU alta);
287
+ gera false negatives (sistema lento sem CPU alta);
288
+ normalização do desvio (Cap 12 — "Challenger disaster").
289
+
290
+ CERTO: alertar APENAS em SLO burn rate (event-based, customer-impacting).
291
+ Decouple "what" de "why" — alert diz que tem dor, debug descobre porquê.
292
+ ```
293
+
294
+ ### Fixed-window error budget
295
+
296
+ ```text
297
+ ANTI-PATTERN: error budget reseta dia 1 do mês.
298
+ "Tivemos outage dia 31, mas reseta amanhã."
299
+
300
+ POR QUÊ É RUIM: clientes não esquecem outage por causa de calendar reset;
301
+ gera comportamento perverso (postpone fix para depois do reset);
302
+ dificulta planejamento de capacidade.
303
+
304
+ CERTO: sliding window 30d.
305
+ Outage dia 31 ainda conta no budget até dia 30 do mês seguinte (sai gradualmente).
306
+ ```
307
+
308
+ ### Constant probability sampling em low volume
309
+
310
+ ```text
311
+ ANTI-PATTERN: sample rate fixo 1/1000 mesmo para erros.
312
+
313
+ POR QUÊ É RUIM: se você tem 1000 req/min e 1% de erro = 10 erros/min,
314
+ samplados 1/1000 = 0.01 erros/min = perde sinal de erro.
315
+
316
+ CERTO: by-key sampling — 100% de erros, 1% de sucessos.
317
+ Em low volume, prefira capturar tudo ou usar dynamic sampling.
318
+ ```
319
+
320
+ ### AIOps como solução
321
+
322
+ ```text
323
+ ANTI-PATTERN: comprar "AIOps platform" para agrupar/suprimir/processar alertas.
324
+
325
+ POR QUÊ É RUIM: você está pagando para mascarar normalização do desvio (Cap 12).
326
+ ML não cria sinal onde não há — apenas filtra ruído de alertas
327
+ que não deveriam existir em primeiro lugar.
328
+
329
+ CERTO: deletar alertas inúteis. Migrar para SLO-based alerting (Cap 12).
330
+ Investir em observability tooling, não em alert noise reduction.
331
+ ```
332
+
333
+ ### Time-based SLI
334
+
335
+ ```text
336
+ ANTI-PATTERN: "99% das janelas de 5 minutos têm p99 < 300ms"
337
+
338
+ POR QUÊ É RUIM: pre-aggregation perde fidelidade; janela com 1 outlier puxa p99 acima
339
+ mesmo com 99.9% das requests boas; difícil de compor com error budget.
340
+
341
+ CERTO: event-based SLI — "99.9% dos eventos individuais têm duration < 300ms".
342
+ ```
343
+
344
+ ### Observability como debugger
345
+
346
+ ```text
347
+ ANTI-PATTERN: usar observability tool para debugar lógica de função (line-by-line).
348
+
349
+ POR QUÊ É RUIM: scale errado — emitir 1 evento por linha de código gera GB/min e
350
+ custa 10× o sistema observado (Cap 11).
351
+
352
+ CERTO: observability é para ENCONTRAR ONDE debugar (qual service, qual hop, qual versão).
353
+ Para line-level use debugger (gdb, pdb) ou profiler.
354
+ ```
355
+
356
+ ### Glass castle production
357
+
358
+ ```text
359
+ ANTI-PATTERN: equipe tem medo de mexer em produção porque "qualquer mexida quebra tudo".
360
+
361
+ POR QUÊ É RUIM: feature freeze efetivo; rollback automático sem entender;
362
+ deploys raros que batchean N changes (cada deploy é alto risco).
363
+
364
+ CERTO: ODD — bundle telemetria com feature; deploy frequente + observable;
365
+ pequenas mudanças isoladas; auto-page do merger por 30-60min.
366
+ ```
367
+
368
+ ---
369
+
370
+ ## (e) Cross-references
371
+
372
+ Skills que consultam este glossário:
373
+
374
+ - `kit/skills/structured-events/SKILL.md`
375
+ - `kit/skills/distributed-tracing/SKILL.md`
376
+ - `kit/skills/opentelemetry-standard/SKILL.md`
377
+ - `kit/skills/core-analysis-loop/SKILL.md`
378
+ - `kit/skills/observability-driven-development/SKILL.md` *(Phase 30)*
379
+ - `kit/skills/event-based-slos/SKILL.md` *(Phase 32)*
380
+ - `kit/skills/burn-rate-alerting/SKILL.md` *(Phase 32)*
381
+ - `kit/skills/telemetry-sampling/SKILL.md` *(Phase 34)*
382
+ - `kit/skills/telemetry-pipelines/SKILL.md` *(Phase 34)*
383
+ - `kit/skills/observability-maturity-model/SKILL.md` *(Phase 34)*
384
+
385
+ Agentes que consultam este glossário:
386
+
387
+ - `kit/agents/observability-instrumenter.md` *(Phase 30)*
388
+ - `kit/agents/incident-investigator.md` *(Phase 30)*
389
+ - `kit/agents/slo-engineer.md` *(Phase 32)*
390
+ - `kit/agents/burn-rate-forecaster.md` *(Phase 32)*
391
+ - `kit/agents/omm-auditor.md` *(Phase 34)*
392
+
393
+ ---
394
+
395
+ *Glossário criado em 2026-05-06 (Phase 29 do milestone v1.9 Observabilidade).*
396
+ *Material-fonte: Observability Engineering — O'Reilly, 2022 (978-1-492-07644-5).*
@@ -0,0 +1,258 @@
1
+ ---
2
+ name: burn-rate-alerting
3
+ description: Use ao calcular burn rate predictive — lookahead/baseline window com fator 4×, context-aware vs short-term, fórmula de extrapolação para alert page vs ticket.
4
+ ---
5
+
6
+ # Observabilidade — Burn Rate Alerting
7
+
8
+ ## Quando usar
9
+
10
+ LLM carrega esta skill ao configurar alertas SLO ou avaliar burn rate. Trigger phrases:
11
+
12
+ - "burn rate alert", "burn rate forecast"
13
+ - "lookahead window", "baseline window"
14
+ - "predictive vs context-aware"
15
+ - "quando paginar vs quando criar ticket"
16
+ - "extrapolar exhaustão de budget"
17
+
18
+ ## Fórmula canônica
19
+
20
+ ```
21
+ burn_rate = error_rate / (1 - SLO_target)
22
+ ```
23
+
24
+ | Burn rate | Significado |
25
+ |---|---|
26
+ | 1× | Budget durará exatamente a janela do SLO |
27
+ | 2× | Budget acabará em metade da janela |
28
+ | 10× | Budget acabará em 1/10 da janela |
29
+ | 100× | Budget esgotado em horas, não dias |
30
+
31
+ **Predictive forecast (Cap 13 p145):**
32
+
33
+ ```
34
+ projected_remaining_at_lookahead = current_remaining - (burn_rate_now × lookahead_window)
35
+ ALERT iff projected_remaining_at_lookahead < 0
36
+ ```
37
+
38
+ ## Regras absolutas
39
+
40
+ - **Lookahead ≤ 4× baseline** — extrapolar 4 horas a partir de baseline 1h é confiável; extrapolar 1 dia a partir de 1h é flappy. (Sem ajuste de seasonality)
41
+ - **Sliding window 30d** para o SLO — alinha com customer memory (skill [`event-based-slos`](../skills/event-based-slos/SKILL.md))
42
+ - **2 alertas por SLO** — short-term (page) + long-term (ticket). Não 1 só, não 5+.
43
+ - **Short-term: lookahead 4h, baseline 1h** — paga on-call em horas
44
+ - **Long-term: lookahead 3d, baseline 18h** — abre ticket, não acorda alguém
45
+ - **Context-aware vs short-term** — escolher por trade-off de custo vs sensibilidade. Default short-term para a maioria; context-aware se "10% restante = mais urgente que 90%".
46
+ - **Não alertar zero-level** — se você só alerta quando budget = 0, não há tempo de reagir. Use predictive sempre.
47
+
48
+ ## Patterns canônicos
49
+
50
+ ### Pattern: 2 alertas canônicos por SLO
51
+
52
+ ```yaml
53
+ # PT-BR: para SLO 99.9% checkout_success com window 30d
54
+ slo: checkout_success
55
+ target: 0.999
56
+ window: 30d_sliding
57
+
58
+ alerts:
59
+ # PT-BR: PAGE — paginar on-call (urgent)
60
+ - name: short_term_burn
61
+ type: predictive
62
+ lookahead: 4h # PT-BR: forecast 4h à frente
63
+ baseline: 1h # PT-BR: 4× regra (4h ≤ 4× 1h ✓)
64
+ severity: page
65
+ threshold_burn_rate: 14.4 # PT-BR: 4h × 14.4 = ~58h, esgota budget de 30d×0.001 = 43.2min em <4h
66
+ routing: pagerduty:on-call
67
+
68
+ # PT-BR: TICKET — criar ticket Jira/Linear (não-urgent)
69
+ - name: long_term_burn
70
+ type: predictive
71
+ lookahead: 3d
72
+ baseline: 18h # PT-BR: 4× regra (3d ≤ 4× 18h = 72h ✓)
73
+ severity: ticket
74
+ threshold_burn_rate: 1.0 # PT-BR: 1× = vai esgotar em 30d se continuar
75
+ routing: jira:engineering
76
+ ```
77
+
78
+ ### Pattern: query de burn rate atual (Postgres)
79
+
80
+ ```sql
81
+ -- PT-BR: burn rate atual em janela baseline (último 1h)
82
+ -- Para SLO 99.9% checkout_success
83
+ with baseline as (
84
+ select
85
+ sum(good) as good,
86
+ sum(bad) as bad,
87
+ sum(total) as total
88
+ from obs.sli_checkout_success
89
+ where bucket > now() - interval '1 hour' -- baseline window
90
+ )
91
+ select
92
+ total,
93
+ bad,
94
+ bad::float / nullif(total, 0) as error_rate,
95
+ (bad::float / nullif(total, 0)) / (1 - 0.999) as burn_rate,
96
+ case
97
+ when bad::float / nullif(total, 0) >= 0.0144 then 'PAGE' -- burn_rate ≥ 14.4
98
+ when bad::float / nullif(total, 0) >= 0.001 then 'TICKET' -- burn_rate ≥ 1
99
+ else 'OK'
100
+ end as alert_status
101
+ from baseline;
102
+ ```
103
+
104
+ ### Pattern: predictive forecast — esgotamento
105
+
106
+ ```sql
107
+ -- PT-BR: ETA exhaustão do budget em horas
108
+ with current_state as (
109
+ select
110
+ sum(case when bucket > now() - interval '30 days' then bad else 0 end) as bad_30d,
111
+ sum(case when bucket > now() - interval '30 days' then total else 0 end) as total_30d,
112
+ sum(case when bucket > now() - interval '1 hour' then bad else 0 end) as bad_1h,
113
+ sum(case when bucket > now() - interval '1 hour' then total else 0 end) as total_1h
114
+ from obs.sli_checkout_success
115
+ )
116
+ select
117
+ -- PT-BR: budget restante em eventos
118
+ (1 - 0.999) * total_30d - bad_30d as remaining_budget,
119
+ -- PT-BR: taxa atual de queima (eventos/hora)
120
+ bad_1h::float / 1 as burn_per_hour,
121
+ -- PT-BR: ETA = budget restante / taxa
122
+ case
123
+ when bad_1h = 0 then 'NO_BURN'
124
+ else round(((1 - 0.999) * total_30d - bad_30d) / nullif(bad_1h, 0))::text || 'h'
125
+ end as eta_to_exhaustion
126
+ from current_state;
127
+ ```
128
+
129
+ ### Pattern: context-aware vs short-term
130
+
131
+ ```text
132
+ SHORT-TERM (cheap):
133
+ - Olha apenas baseline window (último 1h)
134
+ - Não considera quanto budget já foi gasto
135
+ - Mais barato; default para maioria
136
+ - Pode causar false positive se budget está cheio (90% restante)
137
+
138
+ CONTEXT-AWARE (expensive):
139
+ - Considera budget remanescente
140
+ - "Remaining budget × tolerable_burn_rate ≥ lookahead × current_burn_rate"
141
+ - Mais caro (query SLO total + recente)
142
+ - Recomendado para SLOs de alto risco onde 10% restante > 90% restante
143
+ ```
144
+
145
+ ### Pattern: dashboard de burn rate (Markdown gerado por `/burn-rate-status`)
146
+
147
+ ```markdown
148
+ # Burn Rate Status — 2026-05-06 14:32 UTC
149
+
150
+ | SLO | Target | Window | Budget gasto | Burn rate atual | ETA exhaustão | Ação |
151
+ |---|---|---|---|---|---|---|
152
+ | checkout_success | 99.9% | 30d sliding | 23% | 1.4× | 12d | informativo |
153
+ | login_success | 99.95% | 30d sliding | 78% | 8.0× | 4h | **PAGE on-call** |
154
+ | search_latency | 99% | 30d sliding | 15% | 0.7× | — | OK |
155
+ | admin_panel | (sem SLO) | — | — | — | — | — |
156
+ ```
157
+
158
+ ### Pattern: tightening alerts gradualmente
159
+
160
+ ```text
161
+ SEMANA 1: SLO + alerts em test channel (não real page)
162
+ SEMANA 2: SLO + alerts em low-priority email
163
+ SEMANA 3-4: validar que SLO detecta incidents reais
164
+ SEMANA 5+: alerts SLO viram primários, threshold antigos para test channel
165
+ SEMANA 8+: deletar threshold antigos completamente
166
+
167
+ PT-BR: case study Honeycomb (Cap 12 p135) — SLO detectou outage 8h antes
168
+ de threshold tradicional alertar. Confiança = deletar antigos.
169
+ ```
170
+
171
+ ## Anti-patterns
172
+
173
+ ### ANTI: 1 alerta apenas (zero-level)
174
+
175
+ ```text
176
+ ANTI: alert dispara quando budget == 0 (totalmente exausto)
177
+
178
+ PROBLEMA: você não tem tempo de reagir. Budget zerou, SLO violado, cliente afetado.
179
+
180
+ CERTO: 2 alertas:
181
+ - Short-term: burn rate 14.4× → page (4h de runway)
182
+ - Long-term: burn rate 1× → ticket (3d de runway)
183
+ ```
184
+
185
+ ### ANTI: lookahead >> baseline
186
+
187
+ ```text
188
+ ANTI: lookahead 1d a partir de baseline 1h (24×)
189
+
190
+ PROBLEMA: extrapolação linear de janela curta para janela longa é inválida.
191
+ Ciclos diários, semanais, sazonalidades distorcem.
192
+ Alert flappa (entra/sai a cada hora).
193
+
194
+ CERTO: lookahead ≤ 4× baseline (regra empírica do livro p145)
195
+ Para alertar 1d à frente: baseline ≥ 6h
196
+ ```
197
+
198
+ ### ANTI: burn rate threshold = 1×
199
+
200
+ ```text
201
+ ANTI: page on-call quando burn rate >= 1× (igual à taxa que esgota a janela)
202
+
203
+ PROBLEMA: 1× sustained durante 1 mês = budget zerou ao final.
204
+ Time tem 30d para reagir. NÃO é page-worthy.
205
+
206
+ CERTO: page = 14.4× (esgota em 4h, ação imediata)
207
+ ticket = 1× (esgota em 30d, ação planejada)
208
+ ```
209
+
210
+ ### ANTI: burn rate calculation com janela errada
211
+
212
+ ```text
213
+ ANTI: calcular burn rate sobre janela inteira de SLO (30d)
214
+
215
+ PROBLEMA: smooth out spikes recentes. Você vê "compliance ok 99.7%" mesmo
216
+ quando última 1h queimou 30% do budget. Reage tarde.
217
+
218
+ CERTO: burn rate sobre baseline window (1h ou 18h), comparado ao SLO inteiro
219
+ para avaliar remaining budget.
220
+ ```
221
+
222
+ ### ANTI: ignorar seasonality
223
+
224
+ ```text
225
+ ANTI: alertar 1d à frente sem considerar que sábado tem 1/3 do tráfego
226
+
227
+ PROBLEMA: false positive sexta à noite (sábado vai ser baixo);
228
+ false negative segunda de manhã (sábado foi baixo, segunda explode).
229
+
230
+ CERTO: ou (a) usar baseline window grande o suficiente para capturar 1 ciclo
231
+ (≥ 24h cobre dia/noite; ≥ 7d cobre semana);
232
+ ou (b) modelar seasonality (cíclico) — context-aware burn alerts
233
+ que conhecem padrões.
234
+ ```
235
+
236
+ ## Verificação
237
+
238
+ Antes de promover burn alerts a produção:
239
+
240
+ 1. **2 alertas por SLO** — short-term (page) + long-term (ticket)
241
+ 2. **Lookahead ≤ 4× baseline** — verifique aritmética em cada
242
+ 3. **Threshold burn rate calculado** — `target=99.9% → page=14.4×, ticket=1×`
243
+ 4. **Routing nomeado** — `pagerduty:on-call` ou `jira:engineering`
244
+ 5. **Test channel primeiro** — 1+ semana em low-priority antes de promover
245
+ 6. **SLO já provou valor** — detectou incident antes de threshold antigo
246
+ 7. **Documentação** — runbook de "o que fazer quando alert dispara"
247
+
248
+ ---
249
+
250
+ ## Ver também
251
+
252
+ - `kit/skills/_shared-observability/glossary.md` — burn rate, lookahead/baseline
253
+ - `kit/skills/event-based-slos/SKILL.md` — SLO definition
254
+ - `kit/skills/core-analysis-loop/SKILL.md` — investigar root cause após alert
255
+ - `kit/agents/burn-rate-forecaster.md` — agente que calcula via SQL
256
+ - `kit/commands/burn-rate-status.md` — comando que invoca forecaster
257
+
258
+ *Material-fonte: Observability Engineering (O'Reilly, 2022) — Cap 13: "Acting on and Debugging SLO-Based Alerts".*