Menu da documentação
Painel e análises
Runners gerenciados
Equipe e notificações
Faturamento e planos
Arquivos de workflow
Solução de problemas
Correções sintoma por sintoma: jobs travados em fila, um painel vazio, insights ausentes, login bloqueado e mais.
Resumo
- Um job travado em fila = label, monitoramento, configuração, cobrança, build de imagem ou concorrência; verifique nessa ordem.
- Um painel vazio quase sempre é questão de filtros ou tempo de backfill, não de dados perdidos.
- Todo estado bloqueado tem um indicador explícito: um banner, o sino de notificações ou a tela de ativação.

Cada seção abaixo é um sintoma, com suas causas na ordem em que mais vale a pena verificá-las. A maioria dos problemas se anuncia em algum lugar: um banner no painel, uma notificação no sino ou um status em um modal. Esta tabela indica onde olhar primeiro.
| Sintoma | Primeira verificação | Onde |
|---|---|---|
| Job direcionado a um runner permanece em fila | A string exata do label | A tabela "Your runners" na página Latchkey Runners |
| O painel não mostra dados | Um repositório está selecionado | Os Filters no Command & Control |
| Sem insights de IA | O banner de processamento e a branch de análise | A página de Insights e o modal de Monitoramento |
| Lançamentos de runner bloqueados | Estado de trial, assinatura e camada gratuita | A página Billing e a notificação "Managed runner blocked" ou "Free tier running out" |
| Acesso subitamente bloqueado | Status da assinatura (trial encerrado, Past Due, Canceled) | A tela de ativação ou a página Billing |
Um job direcionado a um runner Latchkey permanece em fila#
Este é o sintoma universal para qualquer coisa que impeça o provisionamento de um runner. O GitHub mantém um job em "fila" até que um runner com um label correspondente o pegue, e quando o Latchkey bloqueia ou não consegue rotear um lançamento não há erro do lado do GitHub; o job simplesmente aguarda. Isso significa que o diagnóstico sempre acontece do lado do Latchkey. Para saber como o provisionamento decide entre uma captação a quente e um início a frio quando nada está errado, veja Como funciona o provisionamento. Faça a triagem nesta ordem:
- 01Label correto?Preset exato ou label personalizado, sem erros de digitação
- 02Repo monitorado?Verifique o modal de Monitoramento
- 03Config habilitada?Uma configuração desabilitada para de aceitar jobs
- 04Cobrança OK?Estado de trial, assinatura e camada gratuita
- 05Imagem pronta?Builds de runner personalizado levam tempo
- 06No limite?Todo workspace começa com 40 jobs simultâneos, o número do plano Launch
Descarte um erro de digitação no label
O label deve ser exatamente latchkey-small, latchkey-medium, latchkey-large, latchkey-xlarge ou um dos seus labels personalizados. Como confirmar: a tabela "Your runners" na página Latchkey Runners mostra as strings exatas; compare com seu arquivo de workflow caractere por caractere (um espaço perdido ou um hífen errado já basta para não corresponder). Ambas as formas de label roteiam de forma idêntica, então runs-on: latchkey-small e runs-on: [self-hosted, latchkey-small] se comportam da mesma maneira; a forma de array não é o problema.
Confirme que o repositório está monitorado
Runners gerenciados só atendem repositórios monitorados, então um job de um repo não monitorado aguarda para sempre. Como confirmar: abra o modal de Monitoramento na barra lateral do painel (donos e admins) e verifique o toggle do repositório. Se você estiver no limite de repositórios do seu plano, novos toggles são bloqueados e o modal aponta para o upgrade; veja Gerenciando repositórios. Para um job do Latchkey CI, veja o que cada failure_reason significa.
Verifique se a configuração do runner está habilitada
Uma configuração desabilitada para de aceitar novos jobs, e jobs direcionados ao seu label ficam em fila. Como confirmar: a linha da configuração na página de Runners mostra seu estado de habilitado/desabilitado, tanto para os presets quanto para runners personalizados.
Verifique o estado de trial, assinatura e camada gratuita
Um trial expirado, uma assinatura vencida (past due ou cancelada) ou uma camada gratuita esgotada em um trial sem cartão bloqueiam todos os novos lançamentos de runner; uma camada gratuita esgotada também interrompe os jobs em execução e retém os novos até um plano começar. Como confirmar: procure no sino de notificações por uma notificação "Managed runner blocked" (um trial expirado ou uma assinatura vencida) ou pela notificação "Free tier running out" do mês (uma camada gratuita esgotada), depois abra a página Billing: o aviso de trial e o medidor de camada gratuita, ou a tela de ativação para onde vai uma assinatura past due ou cancelada, indicam em qual caso você está. Assinar, ou corrigir o método de pagamento no portal do Stripe, restaura os lançamentos no próximo despacho, geralmente em até um minuto; veja Uso de runners e minutos gratuitos. Para um job do Latchkey CI, veja o que cada failure_reason significa.
Verifique se uma imagem personalizada ainda está sendo construída
Jobs direcionados a uma nova configuração personalizada aguardam até que sua imagem termine de ser construída. Como confirmar: a linha da configuração na página de Runners mostra o status do build da imagem, e você é notificado quando o runner está pronto ("AI scan runner is ready") ou se o build falhou. Veja Runners personalizados.
Verifique o teto de concorrência
Se o limite de jobs simultâneos do seu workspace já está em uso (todo workspace começa com 40, o número do plano Launch; runners quentes ociosos e runners estacionados não ocupam vaga), jobs adicionais aguardam por uma vaga. Como confirmar: isso aparece quando muitos workflows disparam ao mesmo tempo em seus repositórios, e os jobs em fila iniciam por conta própria à medida que os jobs em execução terminam. Limites mais altos estão disponíveis; veja Limites e concorrência.
O painel não mostra dados#
Um painel vazio quase sempre significa filtros ou tempo, não dados perdidos. Verifique nesta ordem:
- Nenhum repositório selecionado. O Command & Control exibe os repositórios selecionados em seus Filters. Como confirmar: sem nenhum repositório selecionado, o seletor de workflows fica desativado e mostra "Select a repository first". Reset filters (Reset no Easy) seleciona de novo todos os repositórios e workflows e volta a janela Date range para os últimos 30 dias.
- Backfill ainda em execução. Um repositório recém-habilitado importa o histórico recente primeiro, e a maioria das equipes vê dados em poucos minutos. Como confirmar: o banner de progresso do backfill aparece no painel até que a importação seja concluída; aguarde ele desaparecer antes de avaliar as páginas.
- Nenhuma execução na janela. O backfill cobre execuções concluídas dos últimos 30 dias, e a janela Date range deve se sobrepor à atividade real. Como confirmar: as execuções de workflow recentes do repositório no GitHub mostram se a última execução é anterior à janela de backfill e, se for, as páginas permanecem vazias até que novas execuções ocorram. A janela padrão, os últimos 30 dias, coincide com a janela de backfill.
- App instalado na org errada. Se o GitHub App não estiver instalado na organização que possui os repositórios, nenhum evento chega. Como confirmar: no GitHub, abra as Settings da organização, depois GitHub Apps, e verifique se o Latchkey está listado lá. Corrija instalando na organização correta; veja Instale o GitHub App.
Nenhum insight de IA está aparecendo#
A geração de insights é automática e orientada a eventos; não há botão para apertar. O agente é executado após o backfill inicial de um repositório recém-monitorado, quando um arquivo de workflow muda na branch de análise, em falhas consecutivas repetidas, em um pico de custo e em degradação de desempenho. Então "sem insights" geralmente significa que o gatilho ainda não disparou, ou que o agente está olhando para uma branch diferente da sua:
- Análise ainda em execução ou ainda não disparada. Insights são gerados automaticamente após o backfill ser concluído. Como confirmar: a página de Insights mostra um banner de processamento enquanto o agente é executado; dê a um novo repositório alguns minutos.
- Branch de análise errada. A análise segue a branch de análise escolhida no modal de Monitoramento (a branch padrão do repositório por padrão); workflows que existem apenas em outras branches não são analisados. Como confirmar: abra o modal de Monitoramento e verifique o seletor de branch ao lado do repositório. Veja Gerenciando repositórios.
- Legitimamente pouco a dizer. Workflows pequenos ou raramente executados podem produzir poucas recomendações; isso é um achado, não uma falha. Editar um arquivo de workflow reaciona a análise, então volte a verificar após a sua próxima mudança de workflow.
Aplicar recomendações falhou ou descartou mudanças#
As recomendações são geradas com base no arquivo de workflow como ele existia no momento da análise. Se o arquivo mudou desde então (suas edições, ou um PR do Latchkey anteriormente mesclado), algumas recomendações deixam de se aplicar de forma limpa:
- O Latchkey abre o PR com o que ainda se encaixa e lista as recomendações que precisam de colocação manual. O PR chega com o título "Latchkey insight: <what it does>" (por exemplo "Latchkey insight: pin GitHub Actions to commit SHAs") em uma branch
latchkey/, e um banner de sucesso leva você diretamente a ele.insight-<detector>-<hex> - Se todas as recomendações selecionadas foram descartadas, não tente novamente o conjunto desatualizado. Editar o workflow dispara uma nova análise; aguarde ela terminar (o banner de processamento na página de Insights desaparece), então aplique a partir do conjunto novo. Veja Insights de otimização.
Um pagamento falhou e o acesso está bloqueado#
Um status Past Due significa que um pagamento falhou: o acesso ao painel e à API é bloqueado e os lançamentos de runner param até que o método de pagamento seja corrigido no portal do Stripe, onde métodos de pagamento, faturas (com PDFs) e detalhes da assinatura são gerenciados. Se a assinatura foi Canceled em vez disso, o acesso é bloqueado mas a cobrança permanece acessível para que você possa reassinar. Seus dados são retidos em ambos os casos. Os status e seus efeitos estão listados em Gerenciando sua assinatura.
Não consigo usar o painel no meu celular#
Isso é intencional por enquanto: o painel precisa de uma tela de tablet, laptop ou desktop, e uma tela mais estreita que 768 px mostra um aviso após o login com o título "A larger screen is needed". Notificações por email, Slack e push, além do resumo semanal, mantêm você informado longe da sua mesa.
Instalei o app na minha conta pessoal#
Essa instalação está conectada, e a conta executa o Latchkey CI nos repositórios que você registra pelo painel. Um job do GitHub Actions de um repositório registrado direcionado a um label latchkey-* não roda em um runner do Latchkey, e o Latchkey diz por quê: "Latchkey on GH needs a GitHub organization. This personal account runs Latchkey CI: commit a workflow file under .latchkey/workflows/ and push." Arquivos de workflow descreve o arquivo. Para usar o Latchkey on GH (os runners gerenciados do Latchkey no GitHub Actions) com um repositório em uma conta pessoal, mova-o para uma organização como mostra Instale o GitHub App.
Meu trial encerrou e está tudo bloqueado#
Seus dados estão intactos; o bloqueio é no acesso, não no armazenamento. O painel é substituído por uma tela "Your free trial has ended", o acesso à API é bloqueado com a mesma mensagem, e os lançamentos de runner gerenciado são bloqueados (jobs direcionados a labels latchkey-* permanecem em fila no GitHub em vez de dar erro). Assine a partir da tela de ativação (ou da página Billing, se você conseguir alcançá-la) e o acesso, incluindo os lançamentos de runner, é restaurado imediatamente. Há um trial gratuito por pessoa, e assinar ou mudar de plano não o reinicia. Veja Planos e o trial gratuito.
O que significa o failure_reason de um job#
Quando o próprio Latchkey encerra um job do Latchkey CI, em vez de o seu comando decidir o resultado, o failure_reason do job é um dos valores abaixo. Cada valor é a palavra exata que o Latchkey registra, por isso não é traduzido.
Falhas do próprio Latchkey#
| Valor | O que significa | Pode tentar novamente |
|---|---|---|
provisioning_deadline_exceeded | O Latchkey não deu um runner a este job a tempo, então ele nunca começou. | sim |
provisioning_claim_abandoned | O Latchkey começou a preparar um runner para este job e não terminou. | sim |
runner_lost_before_start | O runner atribuído a este job desapareceu antes de o job começar. | sim |
runner_lost_heartbeat_dead | O runner parou de responder antes de o job terminar. | sim |
runner_lost_timeout_exceeded | O Latchkey perdeu o contato com o runner e parou de esperar. NÃO é o mesmo que o timeout_exceeded do agente, que é o próprio comando do cliente rodando por tempo demais. | sim |
runner_reaped_max_age_exceeded | O Latchkey tirou o runner de serviço enquanto o job estava nele. | sim |
runner_reaped_timeout_exceeded | O Latchkey tirou o runner de serviço depois que ele passou do seu limite. | sim |
runner_reaped_heartbeat_dead | O Latchkey tirou o runner de serviço depois que ele parou de responder. | sim |
pending_deadline_exceeded | O job esperou mais do que o Latchkey permite sem começar. | sim |
no_capacity | O Latchkey não tinha um runner desse tamanho para este job e parou de tentar. | sim, e um tamanho menor tem mais chance de ser alocado |
requeue_cap_exceeded | O Latchkey não conseguiu alocar este job em um runner dentro do seu limite de tentativas. | sim |
not_queued_at_final_attempt | O Latchkey fez a sua última tentativa de alocação e o job não estava mais esperando. | sim |
claim_contended_at_final_attempt | Dois componentes do Latchkey tentaram assumir este job ao mesmo tempo e nenhum dos dois o concluiu. | sim |
unbound_pipeline | O Latchkey não conseguiu vincular este job a um pipeline. Todo job carrega uma identidade de pipeline, então isto é um defeito do nosso lado, e não um problema com o seu comando. | não, uma nova tentativa chega ao mesmo ponto; reporte |
blocked: token_life_below_launch_floor | O Latchkey não conseguiu emitir uma credencial que durasse mais que o job e não conseguiu encontrar a posição do job na fila do Latchkey para tentar de novo mais tarde, então encerrou o job. | sim |
blocked: concurrency_limit | Este workspace estava no seu limite de concorrência, e o Latchkey não conseguiu encontrar a posição do job na fila do Latchkey para mantê-lo lá, então encerrou o job. | sim, assim que um job em execução terminar |
forge_provider_unsupported | O Latchkey ainda não suporta este host de código. | não; é uma lacuna do nosso lado |
refused: runner_cannot_read_secrets | O runner que recebeu este job roda um agente do Latchkey antigo demais para lidar com os segredos deste job com segurança, então o Latchkey encerrou o job antes que qualquer etapa rodasse e não cobrou por ele. | sim |
refused: runner_cannot_prepare_services | O Latchkey verificou cada runner que recebeu este job antes de o job começar e passou o job para outro runner cada vez que um runner não conseguia rodar os serviços do job. Ele encerrou o job quando não restava nenhuma tentativa, antes que qualquer etapa rodasse, e não cobrou por ele. | sim |
context_fetch_failed | O Latchkey não conseguiu preparar o contexto que guardava para este job, então o seu comando nunca rodou. Essa falha é atestada pelo próprio Latchkey; quando o job reporta a mesma palavra, ela vale como as palavras do próprio job, descritas abaixo das tabelas. | sim, uma nova execução envia o contexto de novo |
Cancelamentos feitos por você#
| Valor | O que significa | Pode tentar novamente |
|---|---|---|
cancel_requested_before_running | Você cancelou este job antes de ele começar. | sim, enviando de novo |
cancelled_before_provisioning | Você cancelou este job enquanto o Latchkey ainda preparava um runner. | sim, enviando de novo |
Conexão e registro#
| Valor | O que significa | O que resolve |
|---|---|---|
not_enrolled | Este repositório não está registrado no Latchkey CI. | registre-o pelo painel |
no_connection | O Latchkey não tem conexão com o host de código deste repositório. | reconecte em Settings, Code hosts |
connection_deleted | A conexão sob a qual este repositório rodava foi excluída. | reconecte em Settings, Code hosts |
connection_suspended | O app do Latchkey está suspenso nesta conta, então o Latchkey não consegue ler o repositório. | remova a suspensão nas configurações do seu host de código |
connection_credential_unusable | A credencial que o Latchkey guarda para esta conexão não funciona mais. | desinstale o app do Latchkey da conta no seu host de código e depois reconecte em Settings, Code hosts |
repo_grant_revoked | O app do Latchkey não tem mais acesso a este repositório. | conceda o acesso de novo nas configurações do seu host de código |
tenant_mismatch | Este repositório está conectado a outro workspace do Latchkey. | verifique o workspace; reporte se você acredita que ele está certo |
forge_provider_mismatch | Este repositório pertence a um host de código diferente do da conexão que o Latchkey mantém para ele. | reconecte o repositório ao host certo |
repository_not_identified | O Latchkey não conseguiu identificar a qual repositório este job pertence. | registre o repositório de novo |
repository_not_found | O Latchkey não encontrou este repositório no host de código. | verifique se ele ainda existe e se o acesso ainda está concedido |
repository_identity_unusable | O Latchkey guarda uma identidade para este repositório que não consegue mais usar. | registre o repositório de novo |
Cobrança e elegibilidade#
| Valor | O que significa | O que resolve |
|---|---|---|
refused: no_subscription | Este workspace não tem plano, então o Latchkey não iniciou o job. | escolha um plano; se você já tem um, fale com o suporte |
blocked: no_subscription | Mesma causa de refused: no_subscription, registrada no lançamento em vez de na oferta. | escolha um plano; se você já tem um, fale com o suporte |
refused: trial_expired | O trial terminou, então o Latchkey não iniciou o job. | escolha um plano; se o seu trial ainda está ativo, fale com o suporte |
blocked: trial_expired | Mesma causa de refused: trial_expired, registrada no lançamento. | escolha um plano; se o seu trial ainda está ativo, fale com o suporte |
refused: subscription_inactive | A assinatura não está ativa, então o Latchkey não iniciou o job. | reative a cobrança; se ela já está ativa, fale com o suporte |
blocked: subscription_inactive | Mesma causa de refused: subscription_inactive, registrada no lançamento. | reative a cobrança; se ela já está ativa, fale com o suporte |
refused: eligibility_lapsed_at_offer | O workspace deixou de estar apto a rodar jobs entre o envio deste job e o seu início. | verifique a cobrança; se ela parece correta, fale com o suporte |
blocked: spend_cap_reached | O Latchkey recusou ou parou o job porque o workspace atingiu o limite de gastos definido por um owner ou admin. | aumente o limite ou aguarde a redefinição |
stopped: spend_cap_reached | O Latchkey recusou ou parou o job porque o workspace atingiu o limite de gastos definido por um owner ou admin. | aumente o limite ou aguarde a redefinição |
stopped: free_allowance_reached | O Latchkey parou o job porque o workspace usou todos os minutos incluídos e não tem plano. | escolha um plano ou aguarde a redefinição |
budget_reached | O Latchkey parou o job quando ele atingiu o orçamento com que foi iniciado (budget_usd no job, ou --budget no latchkey run). Você não é cobrado além desse orçamento. | inicie-o de novo com um orçamento maior se o trabalho precisar de mais |
A sua própria entrada#
| Valor | O que significa | Pode tentar novamente |
|---|---|---|
command_spawn_failed | O Latchkey não conseguiu iniciar o seu comando porque um dos valores de ambiente que você definiu contém um byte NUL. O comando nunca rodou. | não, não até que o valor seja alterado. Correção: remova o byte NUL do valor de ambiente indicado. |
blocked: secret_scope_refused | Um segredo que uma das etapas deste job referencia não existe mais neste repositório nem no seu workspace: ele foi excluído depois que a execução entrou na fila, então o Latchkey encerrou o job antes que ele rodasse e não cobrou por ele. | não, não até que o segredo seja definido de novo. Correção: defina-o para este repositório ou para o seu workspace, ou remova a referência do arquivo de workflow. |
Dois tipos de failure_reason são abertos, então nenhuma tabela consegue listá-los. O primeiro é um motivo que o próprio job reportou: o Latchkey o mostra como as palavras do próprio job, e o check Latchkey fica vermelho. Um deles, context_fetch_failed, significa que o job não conseguiu buscar o contexto que o Latchkey guardava para ele. Quando o Latchkey confirma a falha como sua (o contexto que ele guardava está ausente), o check fica neutro e a linha e a CLI dizem isso; quando não consegue, o check continua vermelho, com as palavras do próprio job. Outro deles, service <label> could not start, é uma falha do Latchkey quando o próprio runner falhou ao iniciar o serviço (a escrita do nome de host, o mecanismo de containers sem responder ou recusando o início, ou o cliente desse mecanismo não preparado) e do seu job quando o rótulo já é um nome de host no runner, ou quando a imagem não pôde ser baixada, parou ou não ficou pronta a tempo; o log do job diz qual é o caso, com as próprias palavras do registry quando um download é recusado, e no caso do Latchkey o check fica vermelho mesmo assim até que o Latchkey consiga confirmar essa falha por conta própria. O Latchkey verifica o runner antes que um job com serviços comece e, quando essa verificação prova que o runner não consegue rodá-los (o cliente do mecanismo de containers não pode ser preparado, o mecanismo recusa criar uma rede, falta o privilégio de escrever nomes de host ou, em um runner com início a frio para o job, o mecanismo não responde), o job passa para outro runner em vez disso. Um job que esgota as tentativas dessa forma termina com refused: runner_cannot_prepare_services da primeira tabela, e o check não fica vermelho. O segundo é launch_failed: seguido do nome de um erro: o Latchkey não conseguiu iniciar um runner para o job, o que é uma falha do Latchkey como as da primeira tabela, e é seguro tentar novamente.
Ainda travado?#
O FAQ cobre as respostas rápidas. Para qualquer outra coisa, o Suporte e Send feedback no menu Account and help chegam diretamente à equipe.
Meu job está preso em queued. O que verifico primeiro?
Seis coisas, nesta ordem: o label do runner, se o repositório está monitorado, a configuração do runner, o estado da cobrança, um build de imagem ainda em andamento e o teto de concorrência. Cada um tem um sinal explícito, então percorrer a lista encontra a causa mais rápido do que adivinhar.
Meu painel está vazio. Para onde foram meus dados?
Quase sempre são os filtros ou o tempo da importação, e não dados perdidos. Reset filters seleciona de novo todos os repositórios e workflows e volta a janela Date range para os últimos 30 dias; se o workspace é novo, a importação dos últimos 30 dias pode ainda estar em andamento.
Instalei o GitHub App na minha conta pessoal. E agora?
A instalação está conectada, e essa conta executa o Latchkey CI: registre o repositório pelo painel e, depois, faça commit de um arquivo de workflow em .latchkey/workflows/ e dê push. O Latchkey on GH exige uma organização do GitHub; Instale o GitHub App mostra como mover um repositório para uma.