Files
DeskcommCRM/evidence/passo4-inbox-demandas.png
Rafael MelgaçoandClaude Opus 5 e095e3ec9f test(inbox): o ciclo do próximo passo, provado no banco — e o instrumento que mentia
Fecha a lacuna declarada no commit anterior. O Docker travado não tinha outro
caminho além de matar e subir de novo (confirmado pelo Rafael por experiência);
depois disso a sonda rodou, e o caminho até o verde foi todo em falso positivo.

## A prova (21/21, exit 0)

    CICLO: statusPatch            200
           noBancoDepois          "Enviar o orçamento revisado
                                   Enviar a segunda via do boleto"   ← gravou
           aindaSemPasso          0
           naTelaDepois.sem_passo 0     ← a tela releu e o vazamento sumiu
           audit                  1     ← demanda.proximo_passo_definido

A confirmação vem do BANCO, não de uma mensagem de sucesso na tela — é assim que
o bug conhecido de `organizations` engana (PostgREST devolve 200 tendo casado
zero linhas).

## Os três falsos positivos do caminho

1. **O Supabase caiu no meio da sessão.** Medido, não suposto: `curl` no kong
   devolveu 000 enquanto o app respondia 200, e depois o daemon do Docker parou
   de responder. Controle que fechou o diagnóstico: a sonda de layout, verde
   minutos antes, passou a falhar NO MESMO PONTO — era ambiente, não edição.

2. **Uma asserção minha reprovou produto correto.** `noBancoDepois === PASSO`
   comparava uma string com o resultado de uma consulta que devolve TODAS as
   demandas da marca com próximo passo — a semeada já com passo, e a
   recém-marcada. Trocada por `includes`. O produto estava certo; a régua é que
   estava errada.

3. **O login da sonda era INTERMITENTE, e o rastro dizia onde olhar.** Duas
   rodadas falharam com buckets `auth:login_fail:id:` de HASHES DIFERENTES
   (f5e9836… e 30ebfc5…). Mesmo usuário daria o mesmo hash, então o que variava
   era o texto que chegava: `pressSequentially` perdia caracteres enquanto a
   página montava e o servidor via um e-mail truncado. Não era rate limit — o
   audit mostrou `auth.login_failed`, nunca `auth.login_rate_limited`.

   Consertado com um `entrar()` que CONFERE o que digitou antes de submeter, com
   até 3 tentativas e erro explícito se o campo não aceitar. Instrumento que erra
   às vezes é pior que um que erra sempre: leva a diagnosticar o produto.

typecheck 0 · lint 0 errors · 1859 unitários em 171 arquivos

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FkS3mzwtXughmjVC5FCoNo
2026-08-07 14:04:38 -03:00

168 KiB
1440x900px