Skip to content

fix(agentes): a tela de teste espera o runner, e o run sai de running - #738

Open
HigorLira wants to merge 1 commit into
melgarafael:mainfrom
HigorLira:fix/teste-do-agente
Open

fix(agentes): a tela de teste espera o runner, e o run sai de running#738
HigorLira wants to merge 1 commit into
melgarafael:mainfrom
HigorLira:fix/teste-do-agente

Conversation

@HigorLira

Copy link
Copy Markdown

O que este PR faz

Faz a tela Testar agente parar de mostrar "Erro inesperado." em testes que funcionam, e faz o run aparecer como concluído no histórico em vez de ficar eternamente em running.

São três defeitos do mesmo fluxo, encontrados ao investigar um único sintoma numa instalação self-host.

1. O cliente desiste antes do servidor responder

TestPanel.tsx chama apiClient.post sem timeoutMs e herda o DEFAULT_TIMEOUT_MS = 10_000. Mas a rota executa o mesmo runner de um turno real — cinco chamadas ao provedor por teste:

stage_classifier    1,2 s
jailbreak_detect    1,2 s
agent_preview      13,4 s     ← ~29k tokens de entrada
promise_semantic    1,1 s
checkpoint          3,9 s
                   ───────
total              ~21 s

Aos 10 segundos o navegador aborta. AbortError/TimeoutError não é ApiError, então o catch cai no ramo genérico e a pessoa lê "Erro inesperado." — sem código, sem request id, sem pista. No servidor, enquanto isso, tudo conclui e loga verde.

Medições em três runs consecutivos do mesmo agente: 9,2 s · 10,2 s · 11,9 s. Dois dos três estouravam o teto — a tela funcionava por sorte, a cada clique.

O Caddyfile já reserva 320 s para esse runner em /api/internal/agents/run*, com o comentário de que ele "pode levar até ~5min". Faltava a mesma folga no cliente.

2. O run nunca sai de running

O update grava status: "ok" e status: "error". A constraint aceita outra coisa:

CHECK (status = ANY (ARRAY['pending','running','completed','failed','aborted','handoff']))

Todo update falha por violação de CHECK. E como o retorno do .update() não é lido, o erro não chega a log nenhum. Reproduzido diretamente no banco:

ERROR: new row for relation "ai_agent_runs"
violates check constraint "ai_agent_runs_status_check"

Efeito numa instalação real: 19 runs em running, inclusive os que a tela reportou como concluídos. O histórico nunca reflete a realidade.

Vale notar que o status do resultPayload ("ok"/"blocked") é o contrato da resposta HTTP e está correto — é o que a tela exibe. Só o valor gravado no banco estava fora da constraint, e este PR toca apenas esse.

3. O event_log da publicação nunca grava

O insert em _actions.ts omite entity_kind, que é NOT NULL sem default:

[saveAgentDraftAction/publish] event_log error
null value in column "entity_kind" of relation "event_log" violates not-null constraint

A publicação funciona (o insert é void + .then()), mas o evento de auditoria se perde em silêncio. Usei "ai_agent", seguindo o padrão dos outros inserts do repo (contact, conversation, ai_agent_run, channel_session…).

Testes

app/api/v1/ai/agents/[id]/versions/[vid]/test/route.test.ts:

  • Corrigida a asserção existente, que fixava status: "error" — ela afirmava o valor que o código gravava, não o que a tabela aceita, e por isso passava enquanto todo update falhava calado em produção.
  • Novo caso para o caminho de sucesso. Ele assevera contra a lista da constraint, não contra a string: fixar apenas "completed" deixaria o próximo valor inventado passar do mesmo jeito.

Verifiquei que pegam o defeito — reintroduzindo só as duas strings no código, os dois testes falham; revertendo, voltam ao verde.

O timeout do item 1 não tem teste: seria preciso exercitar o AbortController do cliente contra um handler lento, e não encontrei precedente disso na suíte. Se vocês tiverem um padrão para isso, escrevo com prazer.

Checklist (Definition of Done)

  • pnpm typecheck zerado
  • pnpm lint zerado (0 errors; os 349 warnings são pré-existentes, nenhum nos arquivos tocados)
  • pnpm lint:channels ok — nenhuma dívida nova
  • Testes relevantes existem e passam (pnpm test:unit)
  • Audit log emitido — é justamente o item 3
  • Sem console.log esquecido
  • Fragmento em .changes/ — não escrevi; sigo a orientação do template de que isso fica com vocês
  • Mudança de schema — não se aplica, nenhuma migration

Sobre a suíte completa: tests/unit/leads-import-route.test.ts falha 11 testes na main sem este PR — confirmei com git stash. Não mexi nesse caminho.

Três defeitos do mesmo fluxo, medidos numa instalação self-host.

1. Timeout do cliente (o que a pessoa vê)
   O `TestPanel` chama `apiClient.post` sem `timeoutMs` e herda o
   DEFAULT_TIMEOUT_MS de 10s. Mas a rota roda o MESMO runner do agente:
   cinco chamadas ao provedor (stage_classifier, jailbreak_detect,
   promise_semantic, o turno e o checkpoint). Medido: ~9s no caso rápido,
   21s com modelo lento e 123s sob rate limit do provedor. A tela aborta,
   e como AbortError não é ApiError o toast cai no ramo genérico: a
   pessoa lê "Erro inesperado." sem nenhuma pista, enquanto o servidor
   conclui o trabalho e loga tudo verde. O Caddyfile já reserva 320s para
   esse runner em /api/internal/agents/run*; faltava a folga no cliente.

2. O run nunca sai de `running`
   O update grava status 'ok'/'error', e `ai_agent_runs_status_check`
   aceita ('pending','running','completed','failed','aborted','handoff').
   Todo update falhava por violação de CHECK — e o retorno não era lido,
   então o erro não chegava a log nenhum. Numa instalação real: 19 runs
   em 'running', inclusive os que a tela reportou como concluídos.

3. event_log da publicação nunca grava
   O insert em `_actions.ts` omite `entity_kind`, que é NOT NULL sem
   default. A publicação funciona, mas o evento se perde com
   "null value in column entity_kind violates not-null constraint".

O status do `resultPayload` ('ok'/'blocked') é o contrato da RESPOSTA e
fica como está — só o valor gravado no banco estava fora da constraint.
@vercel

vercel Bot commented Sep 12, 2026

Copy link
Copy Markdown

@HigorLira 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: d3338e60227899daf7cafe62c395ede5e3ebe778

Security scanner evidence required (action_required)

Detected 1 security-sensitive predictive risk signal(s) without scanner evidence.

Mode: enforce

Findings:

  • Security-sensitive changes may ship without scanner evidence: The PR touches billing, secrets, auth, webhooks, agent, or CI-sensitive surfaces without adding obvious security scanner, code scanning, or security-focused validation evidence. (4 security-sensitive paths changed; 0 security scanner or security-focused validation artifacts changed)

Touched security-sensitive paths:

  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.test.ts
  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.ts

Expected evidence:

  • Security scanner, code scanning, secret scanning, dependency/security review, or focused security regression output.
  • SARIF/code-scanning upload or equivalent pass/fail gate for the changed surface.

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: d3338e60227899daf7cafe62c395ede5e3ebe778

PR taxonomy review recommended (neutral)

Detected 3 PR taxonomy bucket(s): Security Evidence, CI/CD Recommendation, Cost/Token Risk.

Scanned 4 changed file(s).

Roadmap taxonomy buckets:

Security Evidence

Security-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence.

Signals:

  • Security-sensitive changes may ship without scanner evidence
  • 0 security-sensitive path(s) changed

Paths:

  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.test.ts
  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.ts
  • app/app/ai/agents/[id]/_actions.ts

CI/CD Recommendation

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

Signals:

  • API contract changes may ship without integration coverage
  • API implementation changes may ship without contract artifact updates
  • 1 CI or workflow path(s) changed

Paths:

  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.test.ts
  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.ts
  • app/app/ai/agents/[id]/_actions.ts
  • app/app/ai/agents/[id]/_components/TestPanel.tsx

Cost/Token Risk

AI routing, usage, and token-budget changes should include budget or usage-limit evidence.

Signals:

  • 4 cost/token path(s) changed

Paths:

  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.test.ts
  • app/api/v1/ai/agents/[id]/versions/[vid]/test/route.ts
  • app/app/ai/agents/[id]/_actions.ts
  • app/app/ai/agents/[id]/_components/TestPanel.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: d3338e60227899daf7cafe62c395ede5e3ebe778

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.

@github-actions

Copy link
Copy Markdown

Recebido, @HigorLira — 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.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: d3338e60227899daf7cafe62c395ede5e3ebe778

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.

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.

1 participant