Skip to content

fix(conexoes): a proteção de envio abre depois de mexer nos canais — e o painel deixa de morrer mudo - #746

Open
webtecnica wants to merge 2 commits into
melgarafael:mainfrom
webtecnica:fix/669-protecao-de-envio-abre-e-avisa
Open

fix(conexoes): a proteção de envio abre depois de mexer nos canais — e o painel deixa de morrer mudo#746
webtecnica wants to merge 2 commits into
melgarafael:mainfrom
webtecnica:fix/669-protecao-de-envio-abre-e-avisa

Conversation

@webtecnica

@webtecnica webtecnica commented Sep 12, 2026

Copy link
Copy Markdown

O que este PR faz

Depois de criar, excluir ou reconectar um canal na mesma visita, o painel "Proteção de envio" volta a abrir; e quando a conexão some da lista, ele abre com um aviso honesto em vez de morrer mudo.

Antes: o funil único de invalidação (invalidate) invalidava só ["channel-sessions"], então o cache de pacing-knobs ficava velho e o painel abria sem os dados da conexão; e o <AntiBanSheet> era montado sempre, com if (!item || !form) return null — "painel fechado" e "conexão sumiu da lista" davam no mesmo silêncio: nada abria, nada explicava.

Closes #669

Como resolve

  • components/connections/ConnectionsClient.tsx — o callback invalidate (por onde passam criar, excluir, reconectar e o health check) invalida ["channel-sessions"] e ["pacing-knobs"]; e o <AntiBanSheet> só é montado quando antiBanId está setado, para "painel fechado" e "conexão sumiu da lista" deixarem de ser a mesma coisa.
  • components/connections/AntiBanSheet.tsx — com item nulo a MESMA folha abre com título, mensagem honesta ("não foi possível carregar a proteção desta conexão; ela pode ter sido removida, ou esta lista está desatualizada") e as saídas Tentar de novo (invalida pacing-knobs; quando o item aparece, o useEffect existente hidrata o formulário e o painel normal assume) e Fechar. O !form segue mudo de propósito: é o frame transitório de hidratação.

O que medi (comandos e saídas)

Testes focadospnpm exec vitest run tests/unit/protecao-de-envio-abre-e-avisa.test.tsx6 passed (6), rc=0, 4,88s. Com os vizinhos (conexoes-excluir-canal, protecao-de-envio-aceita-data-em-branco, anti-ban-nao-congela-o-padrao, fuso-horario): 5 files passed, 47 passed (47), rc=0.

Os testes são de comportamento (React Testing Library + QueryClientProvider), não guarda de fonte: a prova 1 usa spy em queryClient.invalidateQueries exigindo as DUAS chaves; a prova 2 renderiza o AntiBanSheet com item=null e exige a mensagem e o botão "Tentar de novo"; há controle do fluxo normal (item presente) e um caso ponta a ponta pelo cartão da conexão no ConnectionsClient.

Sabotagem (depois do commit; previsão escrita antes de rodar: 4 vermelhos de 6, e eram os previstos): git checkout HEAD~1 -- components/connections/ConnectionsClient.tsx components/connections/AntiBanSheet.tsxTests 4 failed | 2 passed (6). Restaurado com git checkout HEAD -- <os dois> → 6/6 verdes de novo e git status limpo.

Gateseslint nos 3 arquivos tocados rc=0, com 1 warning pré-existente (react-hooks/set-state-in-effect no useEffect antigo do AntiBanSheet, confirmado idêntico no HEAD) — nenhum warning novo, nada silenciado e nada refatorado fora do escopo; e a fila local completa (um pesado por vez — flock + systemd-run --scope -p MemoryMax=5G):

gate resultado
pnpm typecheck rc=0 (12s)
pnpm lint rc=0 (3.159s)
pnpm lint:channels rc=0 (2s)
pnpm lint:role-rank rc=0 (1s)
pnpm release:conferir rc=0 (1s)
pnpm test:unit rc=0 (444s) — 792 arquivos · 8.369 passed (+ 1 expected fail)
pnpm test:shell rc=0 (58s)
pnpm build rc=0 (128s)

Nota honesta da primeira passada: a rodada inicial do test:unit pegou a catraca de i18n — a frase nova do painel estava sem a entrada em lib/i18n/dicionario.ts (1 failed | 8.368 passed). A tradução entrou no mesmo branch (commit d0def504) e a re-rodada fechou limpa.

O que NÃO medi

  • e2e de navegador / prova em tela — a prova é unitária (jsdom + Testing Library) no call-site; o painel no browser real não foi filmado.
  • tests/invariants/** — precisa de Postgres/Docker, fora do include do vitest focado.

…e o painel deixa de morrer mudo

Eram duas raízes para o mesmo sintoma da melgarafael#669.

(1) O `invalidate` do ConnectionsClient — por onde passam criar, excluir,
reconectar e o health check — invalidava só `["channel-sessions"]`. A ficha de
Proteção de envio (`["pacing-knobs"]`) é indexada por essa lista, então ficava
velha: o painel abria sem os dados da conexão recém-criada, ou apontando para a
excluída. Agora as duas listas são invalidadas juntas.

(2) O AntiBanSheet devolvia `null` quando `!item || !form`. A primeira perna era
um `return` mudo: com o painel aberto e a conexão fora da lista (excluída em
outra aba/máquina, cache velho), o botão "Proteção de envio" não fazia nada e
não dizia nada — exatamente o invariante que o Sistema Vivo proíbe. A folha só é
montada quando alguém a abre; com item nulo ela agora renderiza a MESMA folha com
estado visível: título, mensagem honesta ("não foi possível carregar a proteção
desta conexão; ela pode ter sido removida, ou esta lista está desatualizada") e
duas saídas — "Tentar de novo", que invalida `pacing-knobs` (quando o item
aparece, o efeito de hidratação preenche o formulário e o painel normal assume),
e "Fechar". A segunda perna (`!form`) segue muda de propósito: é o frame
transitório entre o item chegar e a hidratação rodar.

Testes em tests/unit/protecao-de-envio-abre-e-avisa.test.tsx: comportamento nas
duas provas — spy no queryClient exigindo as duas chaves; item nulo exigindo
mensagem + "Tentar de novo" — com controle do fluxo normal e um caso ponta a
ponta pelo cartão da conexão.
@vercel

vercel Bot commented Sep 12, 2026

Copy link
Copy Markdown

@webtecnica 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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Security Evidence

Commit: 95d5a47e353c91f8cf06e14c9a56c16d7bf24a22

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 4 changed file(s). No missing scanner-evidence signal was detected.

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / PR Risk Taxonomy

Commit: 95d5a47e353c91f8cf06e14c9a56c16d7bf24a22

PR taxonomy review recommended (neutral)

Detected 1 PR taxonomy bucket(s): CI/CD Recommendation.

Scanned 4 changed file(s).

Roadmap taxonomy buckets:

CI/CD Recommendation

CI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work.

Signals:

  • User-facing UI changes may ship without browser coverage
  • 1 CI or workflow path(s) changed

Paths:

  • tests/unit/protecao-de-envio-abre-e-avisa.test.tsx
  • components/connections/AntiBanSheet.tsx
  • components/connections/ConnectionsClient.tsx

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Reference Set Readiness

Commit: 95d5a47e353c91f8cf06e14c9a56c16d7bf24a22

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 4 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: 95d5a47e353c91f8cf06e14c9a56c16d7bf24a22

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 4 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

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.

@github-actions

Copy link
Copy Markdown

Recebido, @webtecnica — obrigado por isto.

Duas coisas que vão parecer erro seu e não são:

  • O check Vercel vermelho ("Authorization required to deploy") é esperado em PR de fork. A
    main faz deploy de produção e a Vercel se recusa a construir código de fora, o que está
    certo. Ele não entra no gate de merge.
  • No primeiro PR de quem nunca contribuiu aqui, os workflows ficam parados esperando
    liberação
    — política do GitHub, não sua. Enquanto isso o PR parece não ter check nenhum
    (nem o gh pr checks mostra os que estão nesse estado). Quem tria libera; você não precisa
    fazer nada.

Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só
lendo o diff — e responde aqui em até um dia útil, com a medição junto, nunca com um "acho
que".

Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem
depois é pessoa.

O melgarafael#669 acrescentou um t() em components/connections/AntiBanSheet.tsx sem a
entrada correspondente em lib/i18n/dicionario.ts. O gate
tests/unit/i18n-espanhol-cobre-a-tela.test.ts reprovava com 1 chamada caindo no
português para quem escolheu es — e, como o CI de PR de fork fica bloqueado em
action_required, quem pegou foi a medição local do test:unit (rc=1 após 400s).

Medido: pnpm exec vitest run tests/unit/i18n-espanhol-cobre-a-tela.test.ts -> 5 passed.
@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Security Evidence

Commit: d0def5045dcebe9929ff2aeb1e3eef6e58676a67

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 5 changed file(s). No missing scanner-evidence signal was detected.

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / PR Risk Taxonomy

Commit: d0def5045dcebe9929ff2aeb1e3eef6e58676a67

PR taxonomy review recommended (neutral)

Detected 1 PR taxonomy bucket(s): CI/CD Recommendation.

Scanned 5 changed file(s).

Roadmap taxonomy buckets:

CI/CD Recommendation

CI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work.

Signals:

  • User-facing UI changes may ship without browser coverage
  • 1 CI or workflow path(s) changed

Paths:

  • tests/unit/protecao-de-envio-abre-e-avisa.test.tsx
  • components/connections/AntiBanSheet.tsx
  • components/connections/ConnectionsClient.tsx
  • lib/i18n/dicionario.ts

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Reference Set Readiness

Commit: d0def5045dcebe9929ff2aeb1e3eef6e58676a67

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 5 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: d0def5045dcebe9929ff2aeb1e3eef6e58676a67

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 5 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

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.

@webtecnica

Copy link
Copy Markdown
Author

O ajuste que a medição local pegou (e o CI não pegaria, por estar em action_required): o t() novo do AntiBanSheet — a frase do painel indisponível — entrou sem a entrada em lib/i18n/dicionario.ts, então quem escolheu espanhol lia português. O gate tests/unit/i18n-espanhol-cobre-a-tela.test.ts reprovava com 1 chamada.

Corrigido em d0def504, na seção Conexões / Integrações do dicionário.

O que medi (depois do ajuste):

  • pnpm exec vitest run tests/unit/i18n-espanhol-cobre-a-tela.test.ts → 5 passed
  • pnpm exec vitest run tests/unit/protecao-de-envio-abre-e-avisa.test.tsx → 6 passed
  • pnpm typecheck → rc=0

O test:unit completo re-roda ao fim da fila local; devolvo o número aqui quando fechar.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Proteção de envio não abre depois de mudar canal na mesma visita (cache de pacing-knobs), e falha sem dizer nada

1 participant