fix: trava de rate limit vencida, saude nao sondada e carimbo de renovacao - #3
Merged
Merged
Conversation
…vacao Apontamentos da terceira rodada de revisao do PR anterior. Cada um vira regressao em tests/test_health_semantics.py. - rateLimitedUntil e um prazo, nao uma bandeira: a mera presenca do campo marcava a conexao como limitada, e como nada apaga a marca quando o prazo vence, ela ficava amarela para sempre depois do primeiro 429. Agora vale a comparacao com o instante atual (rate_limit_active). - Uma conexao local recem-criada nunca foi sondada por ninguem, e com CRON_ENABLED=0 pode nunca ser. Dizer "ativa" era alegar uma saude que nenhuma sonda confirmou; passa a ser not_checked ate a primeira resposta. - O painel decidia "instancia inalcancavel" pelo tamanho do catalogo. Uma instalacao nova, de pe e sem modelo baixado, responde 200 com lista vazia: a tela contradizia o "ativa" que o proprio ciclo acabara de gravar. Quem responde agora e testStatus, e a lista vazia tem frase propria nos tres idiomas. - lastRefreshAt era lido pelo painel e nenhum provider o escrevia, entao "ultima renovacao" mostrava o horario da ultima verificacao. O carimbo passa a ser aplicado no ciclo, so quando houve renovacao de verdade, o que faz qualquer provider futuro nascer correto. - Documentacao: o exemplo headless desligava o painel sem desligar o HEALTHCHECK da imagem, que so o painel atende. O container ficava eternamente unhealthy e travava qualquer depends_on: service_healthy. 218 testes verdes.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
No painel de uma stack real aparecia "chave aceita pelo provedor (HTTP 400)" -- uma frase que o proprio numero parece desmentir. A classificacao esta certa e e deliberada: a sonda envia corpo vazio de proposito, e o provedor so chega a reclamar do corpo depois de ter aceitado a chave; por isso 400 e 404 contam como autenticacao aceita, e so 401/403 (mais o 400 idiomatico do Google AI Studio) marcam recusa. O que faltava era a frase dizer isso. Agora um 2xx le "autenticacao aceita pelo provedor" e um 4xx le "autenticacao aceita; a sondagem em si foi recusada (HTTP 400)". De quebra, "Provedor inacessivel, chave nao verificada" virou "Chave nao verificada": um 4xx nao prova que o provedor esteja inacessivel -- ele respondeu. Verificado contra a stack do artigo 0002, com seis provedores reais.
O risco de bloqueio nao vem de varias sessoes na mesma conta -- os provedores convivem com isso -- e sim de varias CONTAS saindo pelo mesmo endereco, que e o estado natural de um gateway com todas elas cadastradas. Para o provedor, identidades distintas na mesma origem tem o formato de uma revenda de acesso. O modelo ja sabia calcular esse vinculo (egress_status/egress_binding) e nada no painel o mostrava: o operador so descobriria depois do provedor. Agora cada conexao de nuvem exibe a propria saida, em modo somente leitura -- quem roteia a requisicao e o gateway, sempre. Uma decisao de produto vai junto: compartilhar o endereco so vira aviso a partir da SEGUNDA conta nessa situacao. Sozinha, ela e a unica dona daquele IP e nao ha o que sinalizar; alertar ali seria alarme falso em toda instalacao de conta unica. Verificado contra o gateway real do artigo 0003: sete conexoes, das quais cinco aparecem como "divide o endereco do gateway com 5 contas".
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Terceira rodada de revisao automatica do PR anterior. Todos os apontamentos viraram regressao em
tests/test_health_semantics.py.O que estava quebrado
Trava de rate limit vencida (P1).
rateLimitedUntilguarda o instante em que a janela do provedor reabre — e um prazo, nao uma bandeira. A mera presenca do campo marcava a conexao como limitada, e nada apagava a marca quando o prazo vencia: depois do primeiro 429 a conexao ficava amarela para sempre.Sondagem descartada (P2, so OminiRTkSync).
update_connection_healthso escrevia em coluna relacional. Em base com colunadataunica — o formato do 9Router, que instalacoes migradas do OmniRoute mantem — nao haviatest_statusnemprovider_specific_datapara receber nada, e a funcao saia por "nao ha campo a gravar". O resultado da sondagem era perdido inteiro.Saude alegada sem prova (P2). Conexao local recem-criada dizia "ativa" sem nunca ter sido sondada; com
CRON_ENABLED=0ela pode nunca ser. E uma conexao OAuth que o proprio gateway ja carimbou como recusada aparecia saudavel so porque o token ainda nao tinha vencido.Painel contradizendo o banco (P2). A tela decidia "instancia inalcancavel" pelo tamanho do catalogo. Uma instalacao nova, de pe e sem nenhum modelo baixado, responde 200 com lista vazia — e a tela a anunciava como fora do ar, contradizendo o
activeque o proprio ciclo acabara de gravar.lastRefreshAt(P2). Lido pelo painel, escrito por ninguem. "Ultima renovacao" mostrava, na verdade, o horario da ultima verificacao, entao um token parado ha dias parecia recem renovado a cada ciclo.Documentacao. O exemplo headless desligava o painel sem desligar o
HEALTHCHECKda imagem, que so o painel atende: o container ficava eternamente unhealthy e travava qualquerdepends_on: service_healthy.Prova
Suite completa verde nos dois repos.
218 testes verdes.
https://claude.ai/code/session_01Dw2Zc66wvY8QBZJmPBeMsT