fix(atualizacao): a tela conta em que pé está, nas duas pontas do silêncio - #717
fix(atualizacao): a tela conta em que pé está, nas duas pontas do silêncio#717paulolimajr77 wants to merge 2 commits into
Conversation
…encio As duas pontas tinham a mesma causa: o app e o host falam por batidas de 5 em 5 minutos, e a tela afirmava estado como se a conversa fosse instantanea. PONTA 1 — o clique nao comeca a atualizacao. `POST /update` so registra o pedido; quem executa e o `agent.sh`, no proximo ciclo. Ate la `last_step` e nulo, e a tela ja mostrava o titulo "Atualizando para a versao X" com os quatro circulos vazios: afirmava trabalho que ainda nem tinha comecado, e ficava imovel por ate cinco minutos. Agora a espera e um estado proprio, com nome, com a razao da demora, com o aviso de que ficar parada e normal, e com um relogio que anda — contado do `dispatched_at` do servidor, para recarregar a pagina nao zerar a conta. PONTA 2 — e esta era pior. `run_result` com sucesso fecha o run e NAO escreve `current_version`; quem escreve e o heartbeat. Nessa janela `update_available` (`latest !== current`) seguia verdadeiro e a tela voltava do reinicio oferecendo "Atualizar agora" para a versao que ACABOU de ser instalada. Quem clicava refazia tudo, ou concluia que nao funcionou. O conserto da ponta 2 e `sucessoJaInstalado`, irmao de `rollbackFoiSuperado` e no mesmo modulo: o mesmo desempate temporal, na direcao contraria. La o host mais novo vence o run; aqui o run vence enquanto o host nao falou. Tem fim de validade por construcao — na batida seguinte devolve `false` sozinho, sem ninguem limpar estado nenhum. Empate de segundo conta como "host calado": errar para esse lado custa um rotulo otimista por minutos, e errar para o outro devolve o botao que manda instalar de novo o que ja esta la.⚠️ O caso e2e do caminho feliz AFIRMAVA o defeito da ponta 1 — esperava "Guardando uma copia de seguranca" logo apos o clique. Foi reescrito e agora percorre as duas pontas, com a janela do defeito explicita: entre o `run_result` e a recarga NAO ha heartbeat nenhum. Sabotagem conferida: `acabouDeInstalar` forcado a `false` derruba 1 de 28 no teste da rota — o previsto. NAO MEDI: a suite inteira (fica para o fim da fila) e a corrida do e2e, que precisa de Supabase local e app buildado — roda no CI, em SPECS_PARTE_1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A suite inteira apontou: `i18n-espanhol-cobre-a-tela` reprovou os dez `t()` que entraram no `UpdatePanel` com o conserto das duas pontas do silencio (cb55c83). Sem entrada no dicionario, `traduzir` degrada para o proprio texto — quem opera em espanhol via a tela em portugues, e justo nos estados novos, que sao os que explicam por que a tela parece parada. Foi o UNICO vermelho meu na suite: 5 arquivos falharam, 4 batem com a tabela de vermelhos de Windows da NOSSA-REGRA.md (`lgpd-pdf-meet`, `lgpd-pdf-replies`, `suporte-cobertura-de-efeitos`, `rascunho-superado-nao-e-regravado`).⚠️ Os rotulos de fuso NAO sao alcancados por essa cerca: as telas chamam `t(f.rotulo)`, com variavel, e a varredura so enxerga literal. Nao e regressao deste trabalho — o onboarding ja fazia `t(f.cidade)` antes —, mas e um buraco conhecido da cerca, nao uma ausencia de problema. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
@paulolimajr77 is attempting to deploy a commit to the rafael-maudibrasil's projects Team on Vercel. A member of the Team first needs to authorize it. |
ECC Tools / Security EvidenceCommit: Security scanner evidence required (action_required) Detected 1 security-sensitive predictive risk signal(s) without scanner evidence. Mode: enforce Findings:
Touched security-sensitive paths:
Expected evidence:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Risk TaxonomyCommit: PR taxonomy review recommended (neutral) Detected 2 PR taxonomy bucket(s): Security Evidence, CI/CD Recommendation. Scanned 9 changed file(s). Roadmap taxonomy buckets: Security EvidenceSecurity-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence. Signals:
Paths:
CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Reference Set ReadinessCommit: Reference set readiness gaps detected (neutral) Reference evidence present for 0/7 areas (0%) across 9 changed file(s). This check is based on files changed in this PR. Repository-level readiness is still reported by
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
|
Recebido, @paulolimajr77 — obrigado por isto. Duas coisas que vão parecer erro seu e não são:
Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem |
ECC Tools / Hosted Promotion ReadinessCommit: Hosted promotion readiness passed (success) No hosted promotion evidence gaps detected across 9 changed file(s); 0 corpus scenarios had matching evidence. This check compares PR file changes against the evaluator/RAG promotion corpus in No evaluator corpus scenarios matched this PR. Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
|
Recebido — obrigado. Duas coisas que vão parecer erro seu e não são:
Um aviso útil: a Vou revisar de verdade — rodando os gates e reproduzindo o comportamento, não só lendo o diff — e volto com o resultado. Se eu achar algo, venho com a medição junto, nunca com um "acho que". |
As duas pontas têm a mesma causa: o app e o host conversam por batidas de 5 em 5 minutos, e a tela afirma estado como se a conversa fosse instantânea.
Ponta 1 — o clique não começa a atualização
POST /api/v1/system/updatesó registra o pedido; quem executa é oagent.sh, no ciclo seguinte. Até lálast_stepé nulo — e a tela já mostrava o título "Atualizando para a versão X" com os quatro círculos vazios. Ela afirma trabalho que ainda nem começou, e fica imóvel por até cinco minutos. Quem clicou não tem como distinguir isso de travamento.Agora a espera é estado próprio, com nome ("Pedido enviado — esperando o servidor pegar"), com a razão da demora, com o aviso de que ficar parada é normal, e com um relógio que anda — contado do
dispatched_atdo servidor, para recarregar a página não zerar a conta. A lista de passos só aparece quando existe um passo.Ponta 2 — e esta era pior
run_resultcomsuccessfecha o run e não escrevecurrent_version; quem escreve é o heartbeat. Nessa janelaupdate_available(latest !== current) segue verdadeiro e a tela volta do reinício oferecendo "Atualizar agora" para a versão que acabou de ser instalada. Quem clicou refaz tudo, ou conclui que não funcionou.O conserto é
sucessoJaInstalado, irmão derollbackFoiSuperadoe no mesmo módulo: o mesmo desempate temporal, na direção contrária. Lá o host mais novo vence o run; aqui o run vence enquanto o host não falou. Tem fim de validade por construção — na batida seguinte devolvefalsesozinho, sem ninguém limpar estado nenhum.Empate de segundo conta como "host calado": as duas escritas vêm de relógios diferentes, e errar para esse lado custa um rótulo otimista por minutos, enquanto errar para o outro devolve o botão que manda instalar de novo o que já está lá.
O que medi
run_resulte a recarga não há heartbeat nenhum.lib/system/update-run.test.ts— 7 casos novos nosucessoJaInstalado, incluindo o fim de validade e o empateapp/api/v1/system/version/route.test.ts— 3 casos: a janela, o fechamento pela batida do host, e odispatched_atque a tela usa de relógioSabotagem conferida:
acabouDeInstalarforçado afalsederruba 1 de 28 no teste da rota — o previsto.Gates na prévia do merge:
typecheck0, testes da área 58/58.Provado em tela, numa VPS real, atualizando de verdade: o "Pedido enviado" com o contador subindo, e o "Pronto — você está na versão X" sem botão ao terminar.
O que NÃO medi
pnpm test:unitinteiro nesta branch (rodei na branch de origem: 5 vermelhos, os 4 conhecidos de Windows + o do espanhol, que este PR já traz corrigido)pnpm test:e2e— a spec alterada roda no CI, emSPECS_PARTE_1🤖 Generated with Claude Code