Pular para o conteúdo
Latchkey
Menu da documentação

Autorreparo: o que ele faz

Como os runners do Latchkey detectam e corrigem falhas transitórias de CI durante a execução, o que eles nunca vão tocar e como as propostas de reparo viram pull requests revisáveis.

A seção de autorreparo da página de Runners
A seção de autorreparo: KPIs de reparos, tendências e o feed Recent Heals.

Todo runner do Latchkey vem com autorreparo integrado, habilitado por padrão. Quando um passo de workflow falha, o runner diagnostica a falha localmente e, quando é uma classe transitória conhecida, a corrige e repete o passo no lugar. Seu build fica verde sem uma reexecução humana, e toda intervenção é registrada para você inspecionar.

3 estágios
de diagnóstico
códigos de saída, padrões, depois IA
6
categorias de falha
rede, memória, disco, ferramentas, config, código
0
mudanças de código na execução
correções só tocam o runner efêmero
Ligado
por padrão
todo runner, todo plano
01Passo falhaUm passo sai não-zero; o runner captura sua saída em linha
02DiagnosticaA cascata de três estágios identifica a classe de falha
03Corrige no runnerRepetir com backoff, elevar memória, liberar disco, instalar uma ferramenta
04Repete no lugarO passo é reexecutado na mesma máquina, mesmo workspace
05VerdeO job continua; o reparo é registrado em Recent Heals

A cascata de diagnóstico em três estágios#

O diagnóstico roda do mais rápido primeiro, então os casos comuns custam quase nada:

Consulta de código de saída (instantânea)

Algumas falhas se identificam sozinhas. A saída 137 é o kernel matando um processo que ficou sem memória; 127 significa que o comando não foi encontrado. Uma tabela de códigos de saída conhecidos os mapeia para sua correção imediatamente.

Biblioteca de padrões (determinística)

A saída do passo é comparada com uma biblioteca curada de assinaturas de falha conhecidas: timeouts de registry e respostas 5xx em npm, yarn, pnpm, pip, uv, módulos Go, cargo, NuGet, registries Docker e GitHub, Composer, Bundler, Maven, apt e git; contratempos de DNS e TLS; rate limits; exaustão de heap; erros de disco cheio; drift de lockfile. Uma correspondência de padrão é determinística: mesma falha, mesma correção, toda vez.

Diagnóstico de IA limitado (falhas novas)

Qualquer coisa que os dois primeiros estágios não reconheçam vai para um agente de IA em sandbox com um orçamento de tempo estrito (cerca de três minutos). Ele lê a saída capturada, raciocina sobre a causa raiz e, ou aplica uma correção segura no runner, ou propõe uma correção duradoura como um pull request, ou conclui que a falha é real e a deixa acontecer.

O que ele detecta, por categoria#

A maior fonte de CI instável: registries de pacotes e serviços externos tendo um mau momento. Timeouts, respostas 5xx, falhas de resolução de DNS, erros de handshake TLS e rate limits em todos os principais ecossistemas.

output
npm ERR! code ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org/react failed
npm ERR! network This is a problem related to network connectivity.

# self-heal: network/registry timeout -> retry with backoff -> passed on retry 2

Kills por falta de memória (exit 137) e exaustão de heap do runtime da linguagem. A correção eleva o limite para a repetição via variáveis de ambiente como NODE_OPTIONS=--max-old-space-size=4096 ou _JAVA_OPTIONS=-Xmx4g.

output
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

# self-heal: memory/node heap -> set NODE_OPTIONS=--max-old-space-size=4096 -> retried

Falhas ENOSPC e de disco cheio. A correção libera espaço podando camadas Docker e caches de npm, pip, yarn, Gradle e cargo, mais /tmp, e depois repete o passo.

output
Error: ENOSPC: no space left on device, write

# self-heal: disk/full -> pruned docker + package caches (14.2 GB freed) -> retried

Um passo assume uma ferramenta que o job nunca instalou (exit 127, "command not found"). A correção instala o pacote de sistema ausente a partir de uma allowlist verificada (o mesmo conjunto de pacotes encontrado nas imagens de runner hospedadas pelo GitHub) e repete; ferramentas fora da allowlist são deliberadamente deixadas em paz.

output
/usr/bin/bash: line 1: ffmpeg: command not found

# self-heal: tool_missing -> apt-get install ffmpeg (allowlisted) -> retried

Incompatibilidades de config conhecidas com reescritas seguras conhecidas, como um lockfile fora de sincronia com o manifesto, onde npm ci falha mas npm install é a remediação documentada.

output
npm ERR! `npm ci` can only install packages when your package.json and
package-lock.json are in sync.

# self-heal: config/lockfile drift -> command rewrite: npm ci -> npm install -> retried

A caixa de ferramentas de correção#

Toda correção é aplicada apenas dentro do runner efêmero, e o runner é destruído após o job:

fixRepetir com backoffPara falhas transitórias de rede: esperar, depois reexecutar o passo, escalando o atraso.
fixDefinir ambienteElevar limites de memória para a repetição: NODE_OPTIONS, _JAVA_OPTIONS e afins.
fixLiberar discoPodar camadas Docker, caches de pacotes e /tmp quando o disco enche no meio do job.
fixInstalar um pacoteapt-get install de uma ferramenta ausente, restrito a uma allowlist: o mesmo conjunto de pacotes encontrado nas imagens de runner hospedadas pelo GitHub.
fixReescrever comandoTrocar uma invocação sabidamente ruim pela remediação documentada (npm ci por npm install em drift de lockfile).

Como um reparo aparece nos seus logs#

A saída do seu passo transmite inalterada, em tempo real. Quando um reparo acontece, as linhas de diagnóstico do runner aparecem ao lado dela, então a intervenção nunca é invisível:

terminal
$ npm ci
npm ERR! code ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org/lodash failed
# [latchkey-bash-wrapper] step failed (exit 1), diagnosing...
# [latchkey-bash-wrapper] verdict: network/registry-timeout (stage 2 pattern match)
# [latchkey-bash-wrapper] action: retry with backoff (attempt 1 of 3, waiting 5s)
$ npm ci
added 1291 packages in 42s
# [latchkey-bash-wrapper] heal successful, continuing job

Pull requests de reparo#

Algumas causas raiz merecem uma correção duradoura no seu repositório, não apenas um resgate na execução: um passo de setup ausente do workflow, um pin engines ausente em package.json, um timeout de job baixo demais. Quando um reparo bem-sucedido remonta a uma causa estrutural como essas, o autorreparo produz uma proposta estruturada e abre um PR de reparo com uma edição tipada e determinística.

01Causa raiz encontradaO diagnóstico aponta para algo no repo
02Proposta estruturadaResumo do erro, causa raiz e uma mudança tipada
03PR abertoUm pull request comum em uma branch latchkey
04Você revisa e faz mergeOu o fecha; nada faz merge sozinho
  • Cada PR é intitulado "Latchkey heal: <error summary>"; o corpo explica o Error, a Root cause e o Fix, e liga de volta à execução do workflow, então a revisão leva minutos.
  • PRs de reparo nunca sofrem auto-merge, e pull requests de forks nunca são tocados.
  • A criação de PR usa as permissões do GitHub App; se você nunca fizer merge de um PR de reparo, nada no seu repositório muda.

O que ele fará e nunca fará#

O autorreparo faz

  • Repetir passos que falharam com backoff, no mesmo runner
  • Elevar limites de memória e liberar espaço em disco para a execução
  • Instalar pacotes de sistema ausentes da allowlist
  • Propor correções duradouras como pull requests revisáveis

O autorreparo nunca

  • Modifica seu código ou repositório durante uma execução
  • Faz merge de qualquer coisa: mudanças no repo só chegam como PRs que você revisa
  • Esconde falhas reais: passos não reparáveis falham com os logs originais
  • Toca pull requests de forks

Passe a bola para seu agente de código#

O autorreparo conserta o ambiente, nunca seu código-fonte. Quando o problema real é um bug no seu próprio código, o build falha de forma verdadeira, e a falha chega como um pacote completo e estruturado servido pelo servidor MCP do Latchkey, pronto para o seu próprio agente de código consertar a partir dele. O pacote entrega ao seu agente o que ele, de outra forma, reconstruiria à mão:

  • A causa raiz, em linguagem simples.
  • O código de saída do passo que falhou e o arquivo-fonte exato onde o erro surgiu.
  • Os logs completos e não truncados do passo que falhou, incluindo saída que o GitHub esconde no seu visualizador de logs, com segredos removidos antes de saírem do Latchkey.
  • O que o autorreparo já investigou e por que recuou, mais a definição do workflow.

No Claude Code, o comando embutido /mcp__latchkey__fix faz toda a ida e volta em um passo: ele pega a falha não corrigida mais recente e mãos à obra. Qualquer agente com capacidade MCP (Cursor, Codex e outros) pode ler os mesmos pacotes através das ferramentas do servidor. Setup, chaves de API e o comando de conexão pronto estão em Conecte seu agente de IA.

Observabilidade: todo reparo fica registrado#

  • Recent Heals (na página de Runners) lista toda intervenção com sua categoria, veredito e uma descrição em linguagem simples da ação tomada; reparos diagnosticados por IA incluem as iterações de raciocínio do agente.
  • Execuções reparadas são sinalizadas na tabela de execuções do Desempenho de pipeline e têm link direto para seu relatório de reparo.
  • KPIs e tendências de reparo na página de Runners mostram com que frequência o reparo salva uma execução e quais categorias dominam, o que é em si um sinal sobre sua infraestrutura.
SinalO que ele te diz
Selo de resultadoHealed (a correção teve sucesso), No Action (o sistema intencionalmente não agiu, como numa falha no seu próprio código), Failed (uma correção foi tentada mas não recuperou o passo), ou Pending (resultado ainda não registrado).
Pílula de tipo de correçãoComo o reparo foi decidido: Auto-fix (uma regra determinística de código de saída), Pattern match (uma assinatura de falha conhecida com uma correção conhecida), ou Agent fix (o agente investigou).
Transcrição do agenteO registro passo a passo de um reparo por agente: o plano, a hipótese e o raciocínio por turno, cada ação e seu resultado, e as durações.

Controles#

  • Modo em nível de workspace em Settings, Self-Healing (owners e admins); as mudanças entram em vigor em cerca de um minuto.
  • Alternador por configuração na página de Runners, para excluir um tipo de runner específico.
  • Não há alternador por repositório hoje; o modo do workspace se aplica a todos os repositórios monitorados.

Perguntas comuns#

O autorreparo deixa meus builds mais lentos?

Não. Ele só ativa quando um passo falha; passos que passam rodam com zero latência adicional. Uma falha reparada custa o diagnóstico mais a repetição, o que é quase sempre muito mais barato do que um humano notar um build vermelho e clicar em reexecutar.

Ele pode ver meus segredos?

O diagnóstico roda localmente no seu runner contra a saída do passo que seu job já imprime. Nada de novo é exposto: segredos mascarados pelo GitHub Actions permanecem mascarados, e o runner é destruído após o job.

Ele pode repetir para sempre e inflar minha conta?

Não. As repetições são limitadas por passo, o estágio de IA tem um orçamento de tempo rígido, e o próprio runner tem um teto de vida de 4 horas. Também não há taxa separada para autorreparo: tempo de execução extra durante um reparo é cobrado pela tarifa padrão por minuto do runner.

O que acontece quando ele não consegue corrigir uma falha?

O passo falha exatamente como falharia em qualquer outro runner, com os logs originais intactos, mais um diagnóstico que você pode ler em Recent Heals. Não reparável é um veredito de primeira classe, não um erro.

Para ver quais falhas do mundo real o reparo cobre, navegue pela biblioteca de padrões de autorreparo no Learn - cada entrada mostra a correção manual ao lado do que o runner faz automaticamente. Para qualquer coisa que esteja falhando seus builds atualmente, comece pela biblioteca completa de erros de CI/CD.