Commit 3da5587
committed
fix(agente): o relógio injetável era declarado 330 linhas DEPOIS das guardas que dependem dele
O `invariants` do PR #319 falhou com 8 casos, e o diff dele nesses arquivos eram
DUAS LINHAS DE COMENTÁRIO. A causa é anterior, e vinha reprovando a `main`
inteira nove horas por dia sem ninguém ligar os pontos.
─── O defeito ─────────────────────────────────────────────────────────────────
`InboundTurnDeps.clock` existe e o contrato dele é explícito
(`inbound-turn.ts:620`):
Relógio injetável (F2-13) — a janela horária do gate anti-ban é avaliada
nele. Default `() => new Date()`; os testes fixam um instante dentro da
janela para determinismo.
Só que ele era declarado na linha **1411**, e as duas guardas que mais dependem
dele estão nas linhas **1077** (janela anti-ban) e **1169** (horário de
funcionamento) — antes de existir. As duas chamavam `new Date()` cru. O relógio
injetado não alcançava justamente aquilo que ele existe para fixar.
Em produção dá no mesmo: lá o `new Date()` É a hora certa. No CI, a hora de
PAREDE decidia — e como a janela padrão é 7h–22h no fuso do tenant
(`America/Sao_Paulo`), a suíte de invariantes reprovava das 22h às 7h. Nove
horas por dia em que qualquer PR falha por motivo nenhum.
A correlação está nos dados do próprio CI: TODAS as execuções verdes das últimas
24h rodaram entre 12:36 e 23:28 UTC (23:28 UTC = 20:28 em São Paulo, dentro da
janela). A do #319 rodou às 01:13 UTC = 22:13 — fora.
─── A prova, sem tocar em relógio nenhum ──────────────────────────────────────
Reproduzido na máquina local às 22h, que é a hora em que a `main` reprova:
código da main, 22:19 BRT ......... 8 falhas — as MESMAS 8 do CI
com o clock movido para o topo .... 1 falha
+ o teste que nunca injetou clock . 9/9 verdes, ainda 22:21
A segunda linha é o ponto. Consertar as duas guardas deixou UM caso de pé:
`agent-no-credential.test.ts` nunca fixou o relógio — os arquivos irmãos
(`limite-de-envios-por-turno`, `agent-send-template-turn`) já faziam, e ele ficou
de fora. A guarda de horário vem ANTES da checagem de credencial no fluxo, então
fora da janela o turno é adiado e nunca chega ao `credencial LLM` que a asserção
procura: o teste media o motivo errado. Parar em "de 8 para 1, melhorou" deixaria
o CI flaky pela terceira causa.
Suíte de invariantes completa, às 22:30 (fora da janela): **113 arquivos, 847
testes, exit 0**.
A mudança em `tests/invariants/**` é ADITIVA — nenhuma linha removida contém
asserção, e a contagem de casos não muda (1 antes, 1 depois). O que entra é o
`clock` fixo que os irmãos já tinham. `DESKCOMM_GOV_INVARIANTS_EDIT=1`.
─── A classe inteira, não só a instância ──────────────────────────────────────
Varridos os 11 arquivos que aceitam clock injetável em `lib/` e `workers/`. Os
outros quatro `new Date()` crus deles NÃO são o mesmo defeito, e cada um foi
conferido:
followup/turn-bridge.ts:62 .............. default de parâmetro, legítimo
agent/followup-turn.ts:274 .............. default, e o arquivo não tem
guarda de janela nenhuma (zero
ocorrências de janelaDeEnvioAberta)
agent/followup-flow-classify.ts:206 ..... default, aplicado no próprio uso
followup/gatilho-caso.ts:397 ............ `completed_at` — carimbo do
instante da gravação, não decisão
de janela; a hora real é a certa
`inbound-turn.ts` era o único com o padrão "guarda de janela decidindo por
relógio que não é o injetado".
─── Dois cuidados de método que mudaram o resultado ───────────────────────────
1. A primeira execução saiu `exit=0` com falhas na tela: era o exit do `tail` do
pipe, não do script. Refeito com `set -o pipefail`.
2. A primeira suíte completa deu "53 arquivos falhando" e a razão era
`No such container` — outra sessão rodava `test:db` ao mesmo tempo, e
`scripts/test-db.sh` usa PORTA FIXA (`TEST_DB_PORT:-54329`). O Postgres sumiu
debaixo dos testes. Medição descartada e refeita em `TEST_DB_PORT=54399`.
(Que a porta seja fixa é defeito próprio do script, e o modo de falha se
disfarça de teste quebrado — fica anotado, não é deste PR.)1 parent d154ee1 commit 3da5587
2 files changed
Lines changed: 22 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1029 | 1029 | | |
1030 | 1030 | | |
1031 | 1031 | | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
1032 | 1042 | | |
1033 | 1043 | | |
1034 | 1044 | | |
| |||
1074 | 1084 | | |
1075 | 1085 | | |
1076 | 1086 | | |
1077 | | - | |
| 1087 | + | |
1078 | 1088 | | |
1079 | 1089 | | |
1080 | 1090 | | |
| |||
1166 | 1176 | | |
1167 | 1177 | | |
1168 | 1178 | | |
1169 | | - | |
| 1179 | + | |
1170 | 1180 | | |
1171 | 1181 | | |
1172 | 1182 | | |
| |||
1408 | 1418 | | |
1409 | 1419 | | |
1410 | 1420 | | |
1411 | | - | |
1412 | 1421 | | |
1413 | 1422 | | |
1414 | 1423 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
122 | 122 | | |
123 | 123 | | |
124 | 124 | | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
125 | 135 | | |
126 | 136 | | |
127 | 137 | | |
| |||
0 commit comments