Blog

Orçamento de erro em atendimento automatizado: quando parar de lançar

A pergunta que trava toda reunião de produto quando o bot erra é sempre a mesma: a gente pausa o roadmap ou segue lançando? E ela é sempre respondida do mesmo jeito, que é o pior possível: quem grita mais alto decide. Se o time de suporte teve uma semana ruim, congela tudo. Se a pressão comercial é maior, segue lançando com uma promessa vaga de melhorar a qualidade depois. Nos dois casos a decisão foi tomada por política interna, não por evidência, e o resultado é um pêndulo entre paralisia e negligência que nunca converge. O orçamento de erro existe justamente para tirar essa decisão do campo da opinião. A ideia é declarar antes, com o negócio junto, quanta falha o atendimento pode ter em uma janela de tempo, medir o consumo real desse limite, e amarrar a política de deploy no número resultante. Quando o orçamento está sobrando, lançar é seguro e a discussão nem acontece. Quando está esgotado, o roadmap para sozinho, sem ninguém precisar convencer ninguém. Este artigo mostra como definir o SLI que realmente mede o atendimento, como escolher um alvo que não seja cem por cento disfarçado, como calcular consumo e taxa de queima, e como escrever a política de congelamento de forma que ela seja verificável em vez de negociável.

2026-08-24 / Confiabilidade / 15 min

01

O SLI de atendimento não é uptime, e essa é a parte difícil

Em um serviço de infraestrutura o indicador é direto: a requisição respondeu com sucesso dentro do prazo ou não. Em atendimento automatizado essa definição não cobre quase nada do que importa. O bot pode responder em duzentos milissegundos, com status 200, e ter dado uma resposta completamente errada. Do ponto de vista de disponibilidade, foi um sucesso. Do ponto de vista do cliente, foi uma falha pior do que uma indisponibilidade honesta, porque ele agiu com base numa informação incorreta.

Por isso o SLI precisa ser composto por sinais de qualidade, não só de resposta. Na prática funciona bem definir um evento bom como a conversa que teve primeira resposta dentro do prazo, não foi marcada como resposta errada pelo cliente, e não escalou para humano por falha do bot. Repare no qualificador na última condição: escalar porque o assunto exige um humano é o comportamento correto e não pode contar como falha, senão o sistema aprende a não escalar nunca, que é exatamente o oposto do desejado.

A segunda decisão difícil é o denominador. Toda conversa entra na conta? Não. A conversa que o cliente abandonou antes da primeira resposta não mede qualidade do bot, e incluí-la dilui o indicador com ruído. Mas cada exclusão precisa de justificativa escrita e revisão, porque a lista de exclusões é a porta dos fundos mais fácil para maquiar o número: basta ir marcando como não elegível tudo que ficou ruim.

// sli.js
// Um SLI de atendimento so vale se contar eventos elegiveis, nao todos.
// Conversa cancelada pelo cliente antes da primeira resposta nao e falha
// do bot: incluir isso no denominador dilui o sinal e esconde regressao.

// Motivos que tiram a conversa da conta. Cada exclusao precisa de
// justificativa escrita, senao vira porta dos fundos para maquiar o numero.
const NOT_ELIGIBLE = new Set([
  'client_abandoned_before_first_reply', // saiu antes de o bot poder agir
  'spam_or_test',                        // trafego sintetico
  'out_of_business_hours_by_policy',     // fora do escopo contratado
]);

export function isEligible(conversation) {
  return !NOT_ELIGIBLE.has(conversation.exclusionReason);
}

// Bom evento: resolvida sem escalonamento indevido, dentro do prazo,
// e sem que o cliente tenha marcado a resposta como errada.
export function isGood(conversation, { maxFirstReplyMs = 30000 } = {}) {
  if (conversation.firstReplyMs > maxFirstReplyMs) return false;
  if (conversation.wrongAnswerReported) return false;
  if (conversation.escalatedBecauseBotFailed) return false;
  return true;
}

// SLI = bons eventos elegiveis / total de eventos elegiveis.
export function computeSli(conversations, options) {
  const eligible = conversations.filter(isEligible);
  if (eligible.length === 0) return null; // sem trafego nao ha sinal
  const good = eligible.filter((c) => isGood(c, options)).length;
  return { sli: good / eligible.length, eligible: eligible.length, good };
}

Vale a pena começar com um SLI só. É tentador definir cinco indicadores no primeiro dia, mas cada um deles precisa de alvo, de alerta e de revisão periódica, e um time que não consegue manter um SLI honesto não vai manter cinco. Comece pelo que o cliente sente primeiro, tipicamente resposta correta dentro do prazo, e só adicione outro quando o primeiro estiver estável e confiável.

02

Escolher o alvo: por que 99,9% em atendimento é quase sempre errado

O reflexo de todo time técnico é copiar o alvo de disponibilidade de infraestrutura, e o número que sai é sempre alguma quantidade de noves. Mas atendimento automatizado não se parece com um serviço de rede: ele lida com linguagem ambígua, contexto incompleto e pedidos que às vezes nem têm resposta certa. Um alvo de 99,9% significa aceitar uma falha a cada mil conversas, o que na prática é indistinguível de exigir perfeição, e o efeito colateral é imediato: o orçamento estoura na primeira semana, o congelamento vira permanente, e o time simplesmente para de olhar para o indicador porque ele perdeu a utilidade.

O alvo certo é o menor número que ainda mantém o cliente satisfeito. Isso soa cínico e é justamente o ponto: confiabilidade acima do necessário custa caro e não é percebida. Se o cliente não distingue 97% de 99%, o alvo é 97%, e os dois pontos de diferença são orçamento real que compra velocidade de entrega. A forma de descobrir esse número não é técnica: é olhar reclamação, churn e volume de escalonamento nos períodos em que o indicador esteve em cada faixa.

AlvoFalhas em 100 mil conversasEfeito práticoQuando faz sentido
90%10.000Orçamento largo, quase nunca congelaBot novo, escopo experimental
95%5.000Folga real para experimentarOperação em amadurecimento
97%3.000Aperta em semana ruim, ainda gerenciávelOperação estável e madura
99%1.000Uma regressão média já esgotaSó com eval forte e canário
99,9%100Congelamento vira permanenteQuase nunca em atendimento

Um alvo bom também tem prazo de validade. Se o orçamento nunca chega perto de esgotar em seis meses, ele está frouxo e não está comprando nada: é hora de subir o alvo e converter a folga em exigência de qualidade. Se ele estoura todo mês, ou o alvo é irreal ou existe um problema estrutural que o congelamento não vai resolver sozinho. Revisar o alvo a cada trimestre, com o dado dos três meses anteriores na mesa, é o que impede que ele vire número decorativo.

03

Consumo e taxa de queima: dois números que respondem perguntas diferentes

O consumo do orçamento responde uma pergunta de estoque: quanto da folga desta janela já foi gasto. É o número que governa a política de deploy, porque ele diz se ainda há espaço para correr risco. A taxa de queima responde uma pergunta de fluxo: em que velocidade a folga está sendo consumida agora. É o número que governa alerta, porque ele detecta o problema antes do estoque acabar.

A distinção importa porque os dois falham sozinhos. Só com consumo, você descobre o incidente quando o orçamento já foi embora, tarde demais para agir. Só com taxa de queima, você recebe alerta de uma queima alta que dura dois minutos e não significa nada, e o time aprende a ignorar o alerta. Juntos, eles cobrem os dois modos de falha: a degradação lenta que corrói o mês inteiro sem nunca disparar um pico, e o incidente agudo que consome semanas de folga em uma hora.

alvo 97% em janela de 28 dias, 100 mil conversas elegiveis
orcamento total = 3% de 100 mil = 3.000 falhas permitidas

  |################................................| 32% consumido
  ^                                                ^
  dia 1                                            dia 28

regime normal (consumo < 75%):
  lanca feature normalmente, retry de risco permitido

regime de atencao (consumo entre 75% e 100%):
  so entra trabalho que reduz falha; feature nova espera

orcamento esgotado (consumo >= 100%):
  congela feature ate a janela deslizar e devolver folga

taxa de queima diz QUANDO agir, nao so SE agir:
  14,4x por 1h  -> queimou 2% do orcamento -> acorda alguem
   3,0x por 6h  -> queimou 5% do orcamento -> abre ticket
   1,0x         -> ritmo sustentavel, nada a fazer
// error-budget.js
// Orcamento de erro em janela deslizante de 28 dias.
// A politica de deploy le o resultado desta funcao, nao a opiniao de ninguem.

export const WINDOW_DAYS = 28;
const HOURS_IN_WINDOW = WINDOW_DAYS * 24;

// Consumo = falhas observadas / falhas permitidas pelo alvo.
// 1.0 significa orcamento esgotado; acima de 1.0, estourado.
export function budgetConsumption({ eligible, good, target }) {
  const allowedFailures = eligible * (1 - target);
  if (allowedFailures <= 0) return null; // alvo de 100% nao tem orcamento
  const observedFailures = eligible - good;
  return observedFailures / allowedFailures;
}

// Taxa de queima: quantas vezes mais rapido que o ritmo sustentavel.
// 1x consome exatamente o orcamento ao longo dos 28 dias.
export function burnRate({ eligible, good, target, windowHours }) {
  const errorRate = (eligible - good) / eligible;
  const sustainableRate = 1 - target;
  const speed = errorRate / sustainableRate;
  // Fracao do orcamento total queimada nesta janela de observacao.
  const budgetBurned = (speed * windowHours) / HOURS_IN_WINDOW;
  return { speed, windowHours, budgetBurned };
}

// Alertas de queima em duas janelas: uma rapida para pegar incidente agudo,
// uma lenta para pegar degradacao continua que a janela curta nao ve.
export function burnAlerts(shortWindow, longWindow) {
  const alerts = [];
  // 14.4x por 1h queima 2% do orcamento: pagina agora.
  if (shortWindow.speed >= 14.4) alerts.push({ severity: 'page', reason: 'fast burn' });
  // 3x por 6h queima 5% do orcamento: abre ticket, nao acorda ninguem.
  else if (longWindow.speed >= 3) alerts.push({ severity: 'ticket', reason: 'slow burn' });
  return alerts;
}

// A decisao de deploy sai daqui, sem espaco para interpretacao.
export function releaseDecision(consumption) {
  if (consumption === null) return { allow: true, mode: 'no-budget-defined' };
  if (consumption >= 1) return { allow: false, mode: 'freeze-feature-work' };
  if (consumption >= 0.75) return { allow: true, mode: 'reliability-only' };
  return { allow: true, mode: 'normal' };
}

Os números de 14,4x e 3x não são arbitrários. Uma queima de 14,4 vezes o ritmo sustentável durante uma hora consome exatamente dois por cento do orçamento de 28 dias, o que é rápido o bastante para justificar acordar alguém. Uma queima de 3 vezes durante seis horas consome cinco por cento, que é sério mas não é emergência: vira ticket priorizado. Esses dois patamares cobrem bem os casos reais sem gerar a enxurrada de alerta que faz o time desligar a notificação.

A janela deslizante de 28 dias é preferível ao mês de calendário por um motivo prático: com mês de calendário, o orçamento zera na virada, e o time aprende que basta aguentar até o dia primeiro para tudo ser perdoado. Com janela deslizante, o incidente de ontem continua pesando por 28 dias, e a folga volta gradualmente, o que reflete melhor a experiência real de quem foi mal atendido na semana passada.

04

A política de congelamento precisa ser escrita antes de precisar dela

O orçamento de erro só funciona se a consequência for automática. Um número bonito no painel que todo mundo olha e ignora não muda comportamento nenhum. A política precisa estar escrita, acordada com quem tem poder de decidir prioridade, e assinada antes do primeiro incidente, porque no meio do incidente ninguém aceita um congelamento que está sendo proposto na hora.

Três faixas costumam bastar. Abaixo de setenta e cinco por cento de consumo, operação normal: lança feature, faz experimento, aceita risco. Entre setenta e cinco e cem por cento, regime de atenção: entra apenas trabalho que reduz falha, e feature nova espera. Acima de cem por cento, congelamento de feature até a janela deslizar e devolver folga. O detalhe que decide se isso é levado a sério é o congelamento valer para todo mundo, incluindo o pedido urgente do cliente grande.

Consumo do orçamentoO que pode entrarO que fica bloqueadoQuem é avisado
Abaixo de 75%Feature, experimento, refatoraçãoNadaNinguém, é o normal
75% a 100%Correção de falha e redução de riscoFeature nova, mudança de prompt amplaTime e produto
Acima de 100%Só trabalho de confiabilidadeTodo roadmap de featureTime, produto e liderança
Acima de 150%Confiabilidade e revisão de escopoFeature e ampliação de cobertura do botLiderança e responsável pelo contrato
  • Escreva a política antes do incidente e obtenha aprovação de quem prioriza roadmap, não só do time técnico.
  • Defina uma exceção explícita e rara, com quem aprova e por quanto tempo, em vez de deixar a exceção implícita.
  • Publique o consumo do orçamento no mesmo lugar onde o roadmap é discutido, para que o número apareça na conversa certa.
  • Trate o congelamento como resultado esperado do sistema funcionando, não como punição do time.
  • Registre toda exclusão de conversa não elegível com justificativa auditável, para que o SLI não seja maquiado.

05

O que muda no ciclo de release quando o orçamento é levado a sério

A mudança mais visível é que a discussão sobre lançar ou não some da pauta. Com o orçamento sobrando, ninguém pergunta se pode lançar, porque a resposta já está no painel. Com o orçamento esgotado, ninguém precisa defender o congelamento, porque ele foi acordado meses antes. O tempo que o time gastava negociando prioridade em cima de percepção passa a ser gasto reduzindo falha, que é o que efetivamente libera orçamento.

A segunda mudança é no desenho do próprio release. Quando o custo do erro é explícito, o canário deixa de ser opcional. Lançar uma mudança de prompt para cinco por cento do tráfego e comparar o SLI do grupo exposto com o do grupo controle custa um dia a mais e evita queimar semanas de orçamento numa regressão que só apareceria no agregado dias depois. O orçamento não proíbe risco: ele cobra que o risco seja limitado e observável.

  1. Defina um SLI composto por resposta correta e prazo, com regras de elegibilidade escritas e revisadas.
  2. Escolha o alvo pelo menor valor que mantém o cliente satisfeito, com dado de reclamação e escalonamento na mesa.
  3. Calcule consumo em janela deslizante de 28 dias e publique no painel que o time realmente olha.
  4. Configure alerta de queima em duas janelas, uma rápida para incidente agudo e uma lenta para degradação contínua.
  5. Escreva a política de release nas três faixas e obtenha aprovação de quem prioriza roadmap.
  6. Revise alvo e regras de elegibilidade a cada trimestre com os dados dos três meses anteriores.

O erro mais comum na implantação é começar pela ferramenta. Painel, alerta e integração com o pipeline são a parte fácil e são inúteis sem acordo sobre o que conta como falha e o que acontece quando o orçamento acaba. Um mês de dado honesto sobre um SLI só, com uma política de três linhas que a liderança realmente assinou, produz mais mudança de comportamento do que um painel completo que ninguém usa para decidir nada.

FAQ

Perguntas frequentes

Como definir o alvo do SLI se não tenho histórico de qualidade?

Meça primeiro e defina depois. Rode o cálculo do SLI sobre trinta dias de conversas já arquivadas, sem alvo nenhum, só para descobrir onde você está hoje. Se o resultado for 94%, um alvo inicial razoável é algo próximo disso, talvez 93%, que é honesto e ainda cria alguma pressão. Definir 99% antes de saber que a realidade é 94% garante orçamento estourado desde o primeiro dia e um congelamento permanente que ninguém vai respeitar. Depois de dois ou três trimestres com dado real, o alvo pode subir de forma incremental, sempre acompanhado de investimento em qualidade que justifique a exigência maior.

O congelamento de features vale mesmo para pedido urgente de cliente grande?

Se não valer, o orçamento não existe: vira sugestão. A saída correta não é abrir exceção informal e sim ter um mecanismo de exceção escrito na própria política, com nome de quem aprova, prazo máximo e registro do motivo. Exceção rara e documentada preserva a credibilidade do sistema; exceção informal e frequente destrói. E vale notar que o pedido urgente do cliente grande costuma perder força quando a conversa muda de "o time não quer lançar" para "estamos com o orçamento de erro estourado e um incidente de qualidade em aberto", porque essa segunda frase é verificável.

Orçamento de erro serve para bot com pouco volume de conversas?

Serve, mas o cálculo precisa de cuidado com ruído estatístico. Com trezentas conversas por mês e alvo de 97%, o orçamento inteiro são nove falhas, e duas conversas ruins num dia já movem o indicador de forma dramática sem que nada estrutural tenha mudado. Nesse regime, use janela mais longa, de sessenta ou noventa dias, para acumular volume suficiente, e trate o alerta de queima rápida com ceticismo. A alternativa, em volume muito baixo, é revisar conversa por conversa e usar o orçamento como instrumento de conversa periódica em vez de gatilho automático de congelamento.

Quando parar de lançar deixa de ser opinião e vira leitura de painel

Um SLI que mede resposta correta dentro do prazo, com regras de elegibilidade escritas, um alvo escolhido pelo menor valor que mantém o cliente satisfeito, e o consumo calculado em janela deslizante transformam a decisão mais política do roadmap em consulta a um número. Alerta de queima em duas janelas pega tanto o incidente agudo quanto a degradação lenta, e uma política de três faixas acordada antes do incidente garante que a consequência seja automática. O ganho não é o congelamento: é parar de discutir.