Open-source AI sales OS — self-hosted CRM with native AI agents + WhatsApp (WAHA). Open alternative to Kommo, Octadesk & Intercom for any business that sells by chat. MCP-ready, multi-tenant, LGPD.
This report summarizes scanner evidence for melgarafael/DeskcommCRM, a TypeScript project with 4,538 GitHub stars. SynthScan examined 1,373,141 lines of code across 6657 source files, recording 3685 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 5.0 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2175 finding(s).
Are imports declared and package/API names verified? 51 finding(s).
Are wrappers, guards, and repeated structures necessary? 2083 finding(s).
Which changes need focused human review? 3685 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 3685 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker-compose.traefik.yml | 6 | # ----------- | COMMENT |
| MEDIUM | docker-compose.traefik.yml | 25 | # ---------------------------- | COMMENT |
| MEDIUM | docker-compose.traefik.yml | 35 | # --------------------------------------- | COMMENT |
| MEDIUM | docker-compose.npm.yml | 8 | # ----------- | COMMENT |
| MEDIUM | docker-compose.npm.yml | 23 | # -------------------------------- | COMMENT |
| MEDIUM | docker-compose.prod.yml | 262 | # ── Chamada de voz WhatsApp (spec 18) — DESLIGADA POR PADRÃO ────────────── | COMMENT |
| MEDIUM | app/design/lib/tokens.ts | 38 | // ─── Palettes ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/design/lib/tokens.ts | 183 | // ─── Density ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/design/lib/tokens.ts | 191 | // ─── Typography pairings ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/design/lib/tokens.ts | 228 | // ─── Foundation tokens ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/app/metrics/_components/MetricsClient.tsx | 52 | // ─── CARREGANDO: a SILHUETA da tela, não a palavra "Carregando…" ────────── | COMMENT |
| MEDIUM | app/app/metrics/_components/MetricsClient.tsx | 82 | // ─── ERRO: diz o que houve e oferece saída ──────────────────────────────── | COMMENT |
| MEDIUM | app/app/settings/tenant/pipelines/_client.tsx | 431 | {/* ─── A COMANDA DO GANHO (#1477) ─────────────────────────────── | CODE |
| MEDIUM | app/app/settings/tenant/pipelines/_client.tsx | 540 | {/* ── QUANDO ESTE CAMPO OBRIGA (issue #1536) ──────────────────── | CODE |
| MEDIUM | app/app/lgpd/requests/RequestsTable.tsx | 35 | // ── Label helpers ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/app/lgpd/requests/RequestsTable.tsx | 79 | // ── Date helpers ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/app/lgpd/requests/RequestsTable.tsx | 107 | // ── Select options ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/app/lgpd/requests/RequestsTable.tsx | 111 | // ── Component ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/app/ai/cases/_components/CaseChatPanel.tsx | 96 | // ─── A conversa é de outra pessoa ─────────────────────────────────────── | COMMENT |
| MEDIUM | app/app/webhooks/_components/ActivityTab.tsx | 193 | * ─── DECISÃO DA ISSUE #1090: ele APARECE, para quem dá suporte ────────────── | COMMENT |
| MEDIUM | app/auth/callback/route.test.ts | 313 | // ─── #1646: a volta para tela AUTENTICADA sai pela PONTE, nunca por 302 ───── | COMMENT |
| MEDIUM | app/auth/callback/route.test.ts | 313 | // ─── #1646: a volta para tela AUTENTICADA sai pela PONTE, nunca por 302 ───── | COMMENT |
| MEDIUM | app/auth/callback/route.ts | 55 | * ─── Por que o SUCESSO não sai daqui por 302 (issue #1646) ────────────────── | COMMENT |
| MEDIUM | app/admin/(protected)/sistema/page.tsx | 51 | * ── O defeito que ela fecha (issue #1034) ─────────────────────────────────── | COMMENT |
| MEDIUM | app/actions/settings/conectarLoginCodex.ts | 27 | * ─── O portão é o da EMPRESA, não o da instalação (#1672, item 6) ────────── | COMMENT |
| MEDIUM | app/actions/auth/signInWithGoogle.test.ts | 4 | * ─── O defeito, medido na issue #1652 ─────────────────────────────────────── | COMMENT |
| MEDIUM | app/actions/auth/enrollMfa.ts | 36 | // ── O campo que grava no celular é `issuer`, não `friendlyName` ─────────── | COMMENT |
| MEDIUM | app/actions/auth/signInWithGoogle.ts | 38 | * ─── Por que há uma leitura de settings ANTES do redirect (issue #1652) ───── | COMMENT |
| MEDIUM | app/actions/auth/signUp.ts | 121 | // ── A AUTORIDADE da política de cadastro ────────────────────────────────── | COMMENT |
| MEDIUM | app/actions/auth/signUp.ts | 137 | // ── O GoTrue com o cadastro público FECHADO (#1653) ────────────────────────── | COMMENT |
| MEDIUM | app/actions/auth/signUp.ts | 137 | // ── O GoTrue com o cadastro público FECHADO (#1653) ────────────────────────── | COMMENT |
| MEDIUM | app/actions/auth/signUp.ts | 217 | // ── O BECO SEM SAÍDA DE QUEM JÁ TEM CONTA ──────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/route.test.ts | 38 | // ─── Banco falso de estado (#1613) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/route.test.ts | 38 | // ─── Banco falso de estado (#1613) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/route.ts | 91 | * ─── Item C: autoria "em nome de" (#1613) ───────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/route.ts | 309 | // ─── Item A: idempotência (#1613) ──────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/route.ts | 309 | // ─── Item A: idempotência (#1613) ──────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 557 | // ─── A janela de 24h, ANTES de qualquer linha nascer (#1614) ────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 557 | // ─── A janela de 24h, ANTES de qualquer linha nascer (#1614) ────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 636 | // ─── Assinatura do emissor (#2066) ───────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 636 | // ─── Assinatura do emissor (#2066) ───────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 774 | // ─── A CITAÇÃO, e a checagem que ela obriga ──────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 806 | // ─── "Em nome de" (#1613): o CTX é a única porta ─────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 806 | // ─── "Em nome de" (#1613): o CTX é a única porta ─────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/_handler.ts | 1049 | // ─── Pré-voo ANTES de escolher transporte ────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/messages/[id]/media/route.ts | 111 | // ── Fallback: o worker ainda não persistiu ────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 393 | // ─── A ASSINATURA NÃO FICA ÓRFÃ NO ZERNIO (issue #2419) ─────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 393 | // ─── A ASSINATURA NÃO FICA ÓRFÃ NO ZERNIO (issue #2419) ─────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 422 | // ─── O OVERRIDE NÃO FICA ÓRFÃO NA META (issue #1334) ───────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 422 | // ─── O OVERRIDE NÃO FICA ÓRFÃO NA META (issue #1334) ───────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 517 | // ─── O AVISO NÃO FICA ÓRFÃO (issue #1023) ───────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 517 | // ─── O AVISO NÃO FICA ÓRFÃO (issue #1023) ───────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 546 | // ─── O AVISO DE PAUSA TAMBÉM NÃO FICA ÓRFÃO (issue #2389, critério 3) ───── | COMMENT |
| MEDIUM | app/api/v1/channel-sessions/[id]/route.ts | 546 | // ─── O AVISO DE PAUSA TAMBÉM NÃO FICA ÓRFÃO (issue #2389, critério 3) ───── | COMMENT |
| MEDIUM | app/api/v1/products/route.test.ts | 140 | // ─── GET: busca no servidor e paginação opcional ─────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/lgpd/anonymize/route.ts | 102 | // ─── RETOMADA, NÃO PORTA FECHADA ─────────────────────────────────────── | COMMENT |
| MEDIUM | app/api/v1/lgpd/anonymize/route.ts | 135 | // ── Passos 2 e 3 — a MESMA função que o cron de retenção usa ────────── | COMMENT |
| MEDIUM | app/api/v1/leads/route.test.ts | 217 | // ─── #2547: NO "SÓ OS SEUS", O QUE O ATENDENTE CRIA É DELE ─────────────────── | COMMENT |
| MEDIUM | app/api/v1/leads/route.test.ts | 217 | // ─── #2547: NO "SÓ OS SEUS", O QUE O ATENDENTE CRIA É DELE ─────────────────── | COMMENT |
| MEDIUM | app/api/v1/leads/route.ts | 52 | // ─── NO "SÓ OS SEUS", O QUE O ATENDENTE CRIA É DELE (issue #2547) ────────── | COMMENT |
| 1395 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | vitest.cercas.ts | 1 | import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"; | COMMENT |
| LOW | vitest.cercas.ts | 21 | // 5–6 min da suíte longa (#1604, #1587, #1598) em vez de no primeiro minuto. | COMMENT |
| LOW | docker-compose.supabase-ca.yml | 1 | # docker-compose.supabase-ca.yml — overlay da CA do Supabase no RUNTIME (#829) | COMMENT |
| LOW | docker-compose.traefik.yml | 1 | # DeskcommCRM — override para VPS que JÁ TEM um proxy reverso Traefik. | COMMENT |
| LOW | docker-compose.traefik.yml | 21 | # O comportamento padrão (sem este arquivo) fica EXATAMENTE como antes: quem | COMMENT |
| LOW | docker-compose.traefik.yml | 41 | # instalação. O install.sh a descobre e grava no .env — são dois cenários com | COMMENT |
| LOW | docker-compose.traefik.yml | 61 | labels: | COMMENT |
| LOW | docker-compose.traefik.yml | 81 | traefik.http.routers.deskcomm.middlewares: "deskcomm-compress" | COMMENT |
| LOW | docker-compose.traefik.yml | 121 | # ATENÇÃO a um detalhe do Compose: nomear o serviço explicitamente | COMMENT |
| LOW | docker-compose.npm.yml | 1 | # docker-compose.npm.yml — override para VPS que já tem Nginx Proxy Manager (ou | COMMENT |
| LOW | docker-compose.npm.yml | 21 | # | COMMENT |
| LOW | vitest.db.config.ts | 21 | fileParallelism: false, | COMMENT |
| LOW | docker-compose.build.yml | 1 | # Override OPCIONAL para buildar a imagem localmente em vez de puxar do registry. | COMMENT |
| LOW | docker-compose.yml | 1 | # Stack local de dependências externas para o DeskcommCRM. | COMMENT |
| LOW | docker-compose.prod.yml | 1 | # DeskcommCRM — stack de produção self-host (VPS HostGator). | COMMENT |
| LOW | docker-compose.prod.yml | 21 | # o que morre pode ser o CRM. | COMMENT |
| LOW | docker-compose.prod.yml | 41 | # `missing` ou sem a chave. Aqui isso seria o pior desfecho possível: o app é | COMMENT |
| LOW | docker-compose.prod.yml | 81 | logging: *default-logging | COMMENT |
| LOW | docker-compose.prod.yml | 101 | # ("Skipped - No image to be pulled") e imune a `up -d` sem `--build`. Ele era | COMMENT |
| LOW | docker-compose.prod.yml | 141 | # | COMMENT |
| LOW | docker-compose.prod.yml | 161 | restart: unless-stopped | COMMENT |
| LOW | docker-compose.prod.yml | 261 | COMMENT | |
| LOW | docker-compose.prod.yml | 281 | # em serviço de profile inativo não sobe — o CRM inteiro deixaria de | COMMENT |
| LOW | docker-compose.prod.yml | 321 | WACALLS_CORS_ORIGINS: ${WACALLS_CORS_ORIGINS:-} | COMMENT |
| LOW | docker-compose.prod.yml | 341 | - "${WACALLS_WEBRTC_UDP_PORT:-7881}:${WACALLS_WEBRTC_UDP_PORT:-7881}/udp" | COMMENT |
| LOW | docker-compose.prod.yml | 361 | # Para ligar: copiar asterisk/pjsip.conf.example e asterisk/ari.conf.example | COMMENT |
| LOW | playwright.config.ts | 141 | * "quebrou" em vez de "deu azar na ordem" — e suíte que falha por azar ninguém | COMMENT |
| LOW | playwright.config.ts | 161 | trace: "retain-on-failure", | COMMENT |
| LOW | playwright.config.ts | 181 | // instante em que ele morre: `ECONNRESET`/`socket hang up` num GET depois | COMMENT |
| LOW | playwright.config.ts | 201 | reuseExistingServer: false, | COMMENT |
| LOW | vitest.config.ts | 41 | // Bancada opcional: usa node:test, PostgreSQL próprio e Playwright com | COMMENT |
| LOW | tsconfig.typecheck.json | 1 | { | COMMENT |
| LOW | infra/executor-proprio/instalar.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | infra/executor-proprio/so-o-que-e-nosso.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docker/scheduler/entrypoint.sh | 1 | #!/bin/sh | COMMENT |
| LOW | docker/scheduler/entrypoint.sh | 21 | # Constante, não configuração: `app` é o nome do serviço na rede interna do | COMMENT |
| LOW | docker/scheduler/entrypoint.sh | 61 | # A CAMPANHA. Minuto a minuto, e a rodada manda no máximo uma mensagem por | COMMENT |
| LOW | docker/scheduler/entrypoint.sh | 81 | */5 * * * *|60|api/v1/cron/agenda-google-push | COMMENT |
| LOW | docker/scheduler/entrypoint.sh | 101 | # A DATA DO FUNIL (#989). Mesma cadência e mesmo motivo do aniversário: de hora | COMMENT |
| LOW | docker/scheduler/entrypoint.sh | 161 | # foi ali que a issue #1109 ficou seis versões invisível: o `sync-model-catalog` | COMMENT |
| LOW | app/layout.tsx | 201 | // `<PublicEnvScript/>`: numa imagem pré-buildada, um render ESTÁTICO | COMMENT |
| LOW | app/layout.tsx | 241 | // `null` sem motivo é o caso de fábrica (nenhuma cor configurada): não há o | COMMENT |
| LOW | app/public-env-script.tsx | 61 | NEXT_PUBLIC_SUPABASE_ANON_KEY: env.NEXT_PUBLIC_SUPABASE_ANON_KEY, | COMMENT |
| LOW | app/app/layout.tsx | 41 | // Sem organização ativa existem DOIS estados, e eles pedem telas opostas: | COMMENT |
| LOW | app/app/layout.tsx | 181 | // `<body>`, seria repetir no documento um bloco que já vale pela raiz. Além | COMMENT |
| LOW | app/app/layout.tsx | 221 | COMMENT | |
| LOW | app/app/settings/tenant/agenda/_client.tsx | 741 | // podia mais ser removido. Controle que a tela oferece e o | COMMENT |
| LOW | app/app/settings/tenant/agenda/page.tsx | 41 | if (!activeOrg) redirect("/app"); | COMMENT |
| LOW | app/app/settings/tenant/agenda/page.tsx | 81 | // A regra "Clientes pela agenda" mora em `organizations.settings.crm`. LER | COMMENT |
| LOW | app/app/settings/security/page.tsx | 41 | .maybeSingle(); | COMMENT |
| LOW | …p/app/settings/atualizacao/_components/UpdatePanel.tsx | 361 | } | COMMENT |
| LOW | app/app/settings/tags/page.tsx | 41 | export default async function TagsPage() { | COMMENT |
| LOW | …pp/settings/api-tokens/_components/ApiTokensClient.tsx | 41 | * inalcançável — a API sempre aceitou os escopos; só o catálogo daqui os | COMMENT |
| LOW | app/app/pipelines/[id]/_client.tsx | 101 | // O QUADRO CABE NA TELA. A página rolava com a janela: o quadro media o | COMMENT |
| LOW | app/app/pipelines/[id]/_client.tsx | 121 | // `tests/unit/altura-fixa-le-a-reserva-do-rodape.test.ts` cobra: altura | COMMENT |
| LOW | app/app/ai/routers/[id]/_client.tsx | 141 | members.map((m) => ({ ...m, key: m.id })), | COMMENT |
| LOW | app/app/ai/agents/[id]/_actions.ts | 181 | // Em QUAL rascunho esta escrita cai — pela MESMA régua que a tela usa para | COMMENT |
| LOW | app/app/ai/agents/[id]/_actions.ts | 201 | // `fn_ai_agent_version_content_immutable` não pega este caso, porque ele | COMMENT |
| LOW | app/app/ai/agents/[id]/page.tsx | 81 | // ─── A EXCEÇÃO AO EDITOR LEGADO, E A CONDIÇÃO QUE A ENCERRA (issue #456) ─── | COMMENT |
| LOW | app/app/ai/agents/[id]/page.tsx | 181 | // VIGENTE > publicada > última versão que existiu. Antes, o rascunho vencia | COMMENT |
| 1396 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/app/settings/tenant/_danger-zone.tsx | 39 | export function ZonaDePerigoDaOrganizacao({ displayName }: Props) { | CODE |
| LOW | app/app/settings/conversoes/_formGoogle.tsx | 48 | export function FormularioDeConversoesGoogle({ | CODE |
| LOW | app/app/settings/marca/_form.tsx | 140 | export function FormularioDaMarcaDaOrganizacao({ gravada, instalacao, ambiente, vocabulario }: Props) { | CODE |
| LOW | app/app/settings/notifications/_client.test.tsx | 90 | function renderizarComoPrimeiraPassadaDoCliente(): string { | CODE |
| LOW | app/app/_components/EstiloDaMarcaDaOrganizacao.tsx | 36 | export function EstiloDaMarcaDaOrganizacao({ css }: { css: string | null }) { | CODE |
| LOW | …/followups/_components/DuplicateFollowupFlowButton.tsx | 15 | export function DuplicateFollowupFlowButton({ flowId, variant = "outline", size = "sm" }: Props) { | CODE |
| LOW | app/app/ai/atendimento/[id]/page.tsx | 17 | export default async function AtendimentoFlowBuilderPage({ | CODE |
| LOW | …ntegracao-dados/[id]/_components/ExploradorDeDados.tsx | 200 | function redimensionarColunaTeclado(evento: ReactKeyboardEvent<HTMLElement>, coluna: string) { | CODE |
| LOW | …ntegracao-dados/[id]/_components/ExploradorDeDados.tsx | 210 | function redimensionarLinhaTeclado( | CODE |
| LOW | …ntegracao-dados/[id]/_components/ExploradorDeDados.tsx | 227 | function iniciarRedimensionamentoColuna( | CODE |
| LOW | …ntegracao-dados/[id]/_components/ExploradorDeDados.tsx | 255 | function iniciarRedimensionamentoLinha( | CODE |
| LOW | app/app/campaigns/settings/page.tsx | 8 | export default function ConfiguracaoDeCampanhasPage() { | CODE |
| LOW | app/app/webhooks/_components/CadastrarCampo.tsx | 69 | export function useCampoDoFunilDaCaptacao(webhookSourceId: string | null): CampoDoFunilDaCaptacao { | CODE |
| LOW | app/admin/(protected)/destinos-internos/_form.tsx | 26 | export function FormularioDeDestinosInternos({ listaInicial, vemDoPiso }: Props) { | CODE |
| LOW | app/admin/(protected)/sistema/_form.tsx | 56 | export function FormularioDeComportamento({ | CODE |
| LOW | app/admin/(protected)/sistema/page.tsx | 216 | async function contarSuspensasPorCobranca(db: SupabaseClient): Promise<number | null> { | CODE |
| LOW | app/actions/settings/listarFerramentasMcpExternas.ts | 62 | export async function listarFerramentasMcpExternas(): Promise<ResultadoDaListagem> { | CODE |
| LOW | app/actions/settings/salvarRegrasDeConversaoMeta.ts | 52 | export async function salvarRegrasDeConversaoMeta( | CODE |
| LOW | app/actions/settings/acoesDeConversaoGoogle.ts | 47 | export async function listarAcoesDeConversaoGoogle(): Promise< | CODE |
| LOW | app/actions/settings/acoesDeConversaoGoogle.ts | 65 | export async function criarAcaoDeConversaoGoogle( | CODE |
| LOW | app/actions/settings/updateMetaApp.ts | 268 | export async function rotacionarVerifyTokenDaMeta(): Promise<UpdateMetaAppResult> { | CODE |
| LOW | app/actions/settings/atualizarInterfaceDaEmpresa.ts | 30 | export async function atualizarInterfaceDaEmpresa(input: InterfaceSettings): Promise<InterfaceDaEmpresaResult> { | CODE |
| LOW | app/actions/settings/definirServidorMcpExterno.ts | 80 | export async function definirServidorMcpExterno( | CODE |
| LOW | app/actions/settings/updateGoogleAdsConnection.ts | 66 | export async function updateGoogleAdsConnection( | CODE |
| LOW | app/actions/settings/updateAdInsightsConnection.ts | 90 | export async function updateAdInsightsConnection( | CODE |
| LOW | app/actions/settings/definirIdentidadeDaConversao.ts | 63 | export async function definirIdentidadeDaConversao( | CODE |
| LOW | …tions/settings/apagarDadosOperacionaisDaOrganizacao.ts | 54 | export async function apagarDadosOperacionaisDaOrganizacao(input: { | CODE |
| LOW | app/actions/settings/conectarLoginCodex.ts | 196 | export async function desconectarLoginCodexAgora(): Promise<DesconectarLoginCodexResult> { | CODE |
| LOW | app/actions/settings/salvarRegrasDeConversaoGoogle.ts | 63 | export async function salvarRegrasDeConversaoGoogle( | CODE |
| LOW | app/actions/settings/updateAdPlatformConnection.ts | 84 | export async function updateAdPlatformConnection( | CODE |
| LOW | app/actions/registration/decide.ts | 36 | export async function decideRegistrationRequest( | CODE |
| LOW | app/actions/admin/salvarConfiguracaoDaInstalacao.ts | 56 | export async function salvarConfiguracaoDaInstalacao( | CODE |
| LOW | app/actions/admin/salvarConfiguracaoDaInstalacao.ts | 122 | export async function voltarConfiguracaoAoPadrao(chave: string): Promise<ResultadoDaGravacao> { | CODE |
| LOW | app/api/v1/admin/cobranca/conexao/route.ts | 329 | async function contarAssinaturasComProvedor( | CODE |
| LOW | app/api/v1/voice/sessions/pair/route.ts | 83 | async function descartarSessaoNaoPareada(wacalls: WacallsClient, sessionId: string): Promise<void> { | CODE |
| LOW | app/api/v1/conversations/_handler.ts | 641 | export async function markConversationReadHandler( | CODE |
| LOW | app/api/v1/conversations/counts/route.ts | 51 | export function filtrosAuxiliaresDaContagem( | CODE |
| LOW | app/api/v1/ai/credentials/[id]/route.ts | 353 | async function desligarOJevSeFicouSemChave(p: { | CODE |
| LOW | app/api/v1/agenda/agendamentos/_handler.ts | 165 | async function colegasPodemMexerNaAgenda(supabase: SB, ctx: HandlerCtx): Promise<boolean> { | CODE |
| LOW | app/api/v1/agenda/agendamentos/_handler.ts | 213 | export function recusaMudancaNaAgendaAlheia( | CODE |
| LOW | app/api/v1/agenda/agendamentos/_handler.ts | 295 | async function executarCriacaoDeAgendamento( | CODE |
| LOW | app/api/v1/agenda/agendamentos/_handler.ts | 480 | export async function alterarAgendamentoHandler( | CODE |
| LOW | app/api/v1/agenda/agendamentos/_handler.ts | 636 | export async function cancelarAgendamentoHandler( | CODE |
| LOW | app/api/v1/marca/logo/route.test.ts | 131 | function usuarioAdminDeOrganizacao(): AuthUser { | CODE |
| LOW | app/api/v1/webhooks/in/[token]/route.ts | 70 | function findRawPhoneIfUnnormalized(payload: Record<string, unknown>, fieldMap: FieldMap): string | null { | CODE |
| LOW | app/api/v1/cron/proposta-travada/route.ts | 42 | export async function recuperarPropostasTravadas( | CODE |
| LOW | app/api/v1/cron/case-stale-watcher/route.ts | 306 | async function cobrarPassagensEsquecidas( | CODE |
| LOW | app/api/v1/cron/proposal-expiry/route.ts | 26 | export function encontrarPropostasVencidas( | CODE |
| LOW | app/api/v1/cron/followup-flow-worker/route.ts | 197 | async function varrerConfirmacoesDePresenca( | CODE |
| LOW | app/api/v1/cron/proposal-promised-not-created/route.ts | 27 | export function encontrarPromessasSemProposta( | CODE |
| LOW | app/api/v1/channels/official/route.ts | 109 | async function tokenDeVerificacaoParaATela(): Promise<{ | CODE |
| LOW | experiments/extensoes/catalog/test_catalog.py | 39 | def test_publica_artefato_e_exporta_snapshot_de_admissao(self) -> None: | CODE |
| LOW | experiments/extensoes/catalog/test_catalog.py | 55 | def test_identidade_publicada_e_imutavel(self) -> None: | CODE |
| LOW | experiments/extensoes/catalog/test_catalog.py | 70 | def test_servidor_expoe_so_artefato_por_digest_e_preserva_bytes(self) -> None: | CODE |
| LOW | experiments/extensoes/catalog/test_catalog.py | 111 | def test_servidor_recusa_bind_fora_do_loopback_exato(self) -> None: | CODE |
| LOW | experiments/extensoes/catalog/test_catalog.py | 125 | def test_publicacao_recusa_json_duplicado_e_chaves_de_prototipo(self) -> None: | CODE |
| LOW | experiments/extensoes/catalog/test_catalog.py | 136 | def test_publicacao_recusa_texto_vazio_nul_e_surrogate_isolado(self) -> None: | CODE |
| LOW | tests/qa-helpers.ts | 528 | function compartilhadosNaoDeclarados(): string[] { | CODE |
| LOW | tests/capture-wave-6-cenarios.ts | 98 | function vocabularioTemEdicaoHumana(): { tem: boolean; tipos: string[] } { | CODE |
| LOW | tests/unit/controle-decorativo.test.ts | 91 | function controlesQueDependemDeCallback(): Controle[] { | CODE |
| 564 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.en.md | 345 | ├── workers/ # event_log consumers (AI, RAG, LGPD, media, routines) | CODE |
| MEDIUM | README.md | 378 | ├── workers/ # consumers de event_log (IA, RAG, LGPD, mídia, rotinas) | CODE |
| MEDIUM | tasks/rag-completo.md | 1 | # Plano — RAG completo (feat/rag-completo) | COMMENT |
| MEDIUM | app/app/ai/agents/_components/AgentStatusBadge.test.ts | 19 | // motor nenhum — prompt, tools, funis e guardrails moram em | COMMENT |
| MEDIUM | app/app/ai/agents/[id]/_actions.ts | 142 | // em lib/ai/guardrails-schema.ts — mais estrita em name/description). É a régua | COMMENT |
| MEDIUM | app/api/v1/voice/opt-in/route.ts | 205 | // "salvo" sem nada ter sido gravado. Mesmo cuidado da rota de guardrails. | COMMENT |
| MEDIUM | tests/unit/cliente-que-falha-nao-volta-ao-pool.test.ts | 167 | // lib/agent-engine/guardrails/before-send.ts — lock por número + envio | COMMENT |
| MEDIUM | tests/unit/chamada-de-voz-desligada-por-padrao.test.ts | 35 | // precedência que `lib/agent-engine/guardrails/camadas-da-org.ts` usa —, | COMMENT |
| MEDIUM | tests/invariants/vocabulario-banco-x-typescript.test.ts | 486 | // lib/agent-engine/guardrails/before-send.ts → TipoDeEnvio. Migration 0535 | COMMENT |
| MEDIUM | docs/SETUP.md | 122 | 5. [OpenAI ou OpenRouter](#5-openai-ou-openrouter--embeddings-do-rag) — embeddings do RAG. | CODE |
| MEDIUM | docs/SETUP.md | 343 | ## 5. OpenAI ou OpenRouter — embeddings do RAG | COMMENT |
| MEDIUM | docs/research/architecture-diagrams.md | 663 | ## 11. Data Flow — RAG ingestion pipeline | COMMENT |
| MEDIUM | docs/design/teto-de-orcamento.md | 117 | 'jailbreak_detect', // lib/agent-engine/guardrails/jailbreak/classifier.ts:114 | CODE |
| MEDIUM | docs/design/teto-de-orcamento.md | 118 | 'promise_semantic', // lib/agent-engine/guardrails/promise/semantic.ts:113 | CODE |
| MEDIUM | docs/business-rules/00-business-rules-catalog.md | 401 | ### IA-03 — Top-K do RAG default 5, configurável por tenant | COMMENT |
| MEDIUM | docs/specs/05-spec-ai-rag-handoff.md | 12 | # Spec 05 — IA Conversacional + RAG + Sentiment + Handoff | COMMENT |
| MEDIUM | docs/specs/05-spec-ai-rag-handoff.md | 850 | // 1. Validar guardrails programaticamente (defesa em profundidade) | COMMENT |
| MEDIUM | docs/specs/06-spec-nuvemshop-lgpd.md | 1562 | ### 8.4 `product` → `nuvemshop_products` + chunks RAG | COMMENT |
| MEDIUM | docs/testing/user-journey-map.md | 1651 | ## RAG do tenant — implementado e provado (2026-07-30) | COMMENT |
| MEDIUM | docs/stories/epics/EPIC-06-ai-rag.md | 28 | # EPIC-06 — AI Agent + RAG + Sentiment + Handoff | COMMENT |
| MEDIUM | docs/stories/epics/EPIC-06-ai-rag.md | 438 | ### S-06.04 — Worker `rag-indexer` (consumer event-driven) | COMMENT |
| MEDIUM | docs/stories/epics/EPIC-13-ai-agents-module.md | 395 | ### S-13.03 — MCP server scaffold + auth bearer + 5 read tools | COMMENT |
| MEDIUM | docs/prd/05-prd-ai-rag-handoff.md | 12 | # Sub-PRD 05 — IA Conversacional + RAG por tenant + Sentiment Detection + Handoff | COMMENT |
| MEDIUM | docs/prd/05-prd-ai-rag-handoff.md | 66 | ### 3.3 RAG por tenant — fontes de ingestão | COMMENT |
| MEDIUM | docs/prd/05-prd-ai-rag-handoff.md | 79 | ### 3.4 RAG por tenant — pipeline técnico | COMMENT |
| MEDIUM | docs/prd/00-prd-master.md | 204 | ### 6.3 Chatbot RAG por tenant | COMMENT |
| MEDIUM | …rpowers/plans/2026-07-23-harness-fase0-convergencia.md | 24 | ### Task 1: Handoff doc + campos de RAG no `PublishedAgentConfig` | COMMENT |
| MEDIUM | docs/superpowers/plans/2026-10-03-contato-pessoal.md | 113 | ### Etapa 9 — RAG e contexto do agente | COMMENT |
| MEDIUM | docs/handoffs/HANDOFF-inbox-multimodal.md | 78 | - **Onda 3 prova (2026-07-22): universal layer entrega, parte nativa no turno pende de upgrade.** Prova real com chaves | CODE |
| MEDIUM | components/ai/AgentEditor.tsx | 135 | // Valida guardrails antes de enviar | COMMENT |
| MEDIUM | .github/workflows/release.yml | 148 | # (RAG) já trazia uma seção de versão escrita à mão no CHANGELOG. | COMMENT |
| MEDIUM | lib/agent-engine/guardrails/vazamento-interno.ts | 296 | // NOSSO é a barra do caminho (`lib/guardrails/before-send.ts`) ou o erro ao lado — | COMMENT |
| MEDIUM | lib/agent-engine/agent/followup-turn.ts | 86 | // direto pela cadeia de guardrails, sem LLM (custo $0, blueprint). Ausente/'agent' | COMMENT |
| MEDIUM | lib/agent-engine/agent/followup-turn.ts | 603 | // cadeia de guardrails, sem chamar o modelo. É um CAMINHO ADICIONAL: o run do | COMMENT |
| MEDIUM | lib/agent-engine/agent/inbound-turn.ts | 2033 | // (`pacingGate` em guardrails/before-send.ts) já vetava o envio fora da | COMMENT |
| MEDIUM | lib/agent-engine/agent/inbound-turn.ts | 3105 | // isso, "usar template" seria a forma de escapar dos guardrails de conteúdo. | COMMENT |
| MEDIUM | lib/agent-engine/agent/inbound-turn.ts | 3368 | // Cadeia de guardrails (F2-13): stop/opt-out → anti-ban → spinning rodam | COMMENT |
| MEDIUM | lib/agent-engine/agent/inbound-turn.ts | 4076 | // que o dono escreveu continuam intocados (outros guardrails, outro fim). | COMMENT |
| MEDIUM | lib/agent-engine/agent/inbound-turn.ts | 4742 | // a manda — pela MESMA cadeia de guardrails, dentro do teto de envios. Roda | COMMENT |
| MEDIUM | lib/agent-engine/agent/formato-whatsapp.test.ts | 87 | // A posição importa: os gates (corpo vazio, guardrails, bolhas) têm de medir o que sai. | COMMENT |
| MEDIUM | lib/ai/agents/duplicate.ts | 183 | // é emendado com o que duplicar copia de verdade (config, guardrails, acervo). | COMMENT |
| MEDIUM | hostgator-setup-kit/install.sh | 1840 | printf '# OpenAI: transcrição dos áudios do WhatsApp (Whisper) + embeddings do RAG.\n' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | experiments/extensoes/catalog/catalog.py | 249 | publisher text not null, | CODE |
| HIGH⚡ | experiments/extensoes/catalog/catalog.py | 250 | name text not null, | CODE |
| HIGH⚡ | experiments/extensoes/catalog/catalog.py | 251 | version text not null, | CODE |
| HIGH⚡ | experiments/extensoes/catalog/catalog.py | 252 | byte_length integer not null, | CODE |
| HIGH⚡ | experiments/extensoes/catalog/catalog.py | 253 | entry_json text not null, | CODE |
| HIGH⚡ | experiments/extensoes/catalog/catalog.py | 254 | artifact blob not null, | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 75 | r = self.m.push("--force", "contrib", "conserto:feat/pr") | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 84 | r = self.m.push("contrib", "+conserto:feat/pr") | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 92 | r = self.m.push("-f", "contrib", "certo:feat/pr") | CODE |
| HIGH | triagem/instrumentos/tests/test_pre_push.py | 111 | r = self.m.push("contrib", "certo:feat/pr") | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 123 | r = self.m.push("contrib", "certo:feat/pr") | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 131 | r = self.m.push("--force", "contrib", "certo:feat/pr", env=env) | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 139 | r = self.m.push("-u", "fork", "certo:feat/pr") | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 147 | r = self.m.push("--force", "origin", "fix/nossa") | CODE |
| HIGH⚡ | triagem/instrumentos/tests/test_pre_push.py | 152 | r = self.m.push("origin", "main") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …unit/teto-do-atender-bate-com-a-recusa-da-spec.test.ts | 116 | '"atender" (a #1684 fez isso), ou uma do harness voltou a ser marcável: ajuste o ' + | CODE |
| MEDIUM | tests/shell/update-guard.test.sh | 242 | # o harness no meio do caso — a suíte saía 1 sem imprimir QUAL prova falhou, | COMMENT |
| MEDIUM | tests/shell/dono-do-projeto.test.sh | 115 | # 80/443. Medido com o harness de VPS falsa: numa VPS com Traefik de painel | COMMENT |
| MEDIUM | tests/shell/regras-isolamento-sem-modulo.test.sh | 263 | # o vermelho de baixo é da regra faltante, não do resto do harness. | COMMENT |
| MEDIUM | scripts/test-update-com-dados.sh | 87 | # contêiner para o único requisito do harness continuar sendo Docker. | COMMENT |
| MEDIUM | scripts/test-update-com-dados.sh | 133 | # harness mediria um mundo que o gate obrigatório não conhece. | COMMENT |
| MEDIUM | scripts/test-db.sh | 122 | # A imagem `pgvector/pgvector` — em qualquer das tags que este harness usa, | COMMENT |
| MEDIUM | scripts/test-db.sh | 134 | # inclusive a do próprio harness). | COMMENT |
| MEDIUM | scripts/test-db.sh | 489 | # tests/invariants/harness-isola-por-arquivo.test.ts aponta a regressão certa, | COMMENT |
| MEDIUM | scripts/backup-db.sh | 3 | # (CRM + harness do agente). Roda no host ou num cron da VPS: | COMMENT |
| MEDIUM | .github/workflows/publish-image.yml | 746 | for _ in $(seq 1 30); do # até 90s: tsx + pool + a query do harness | CODE |
| MEDIUM | hostgator-setup-kit/test-validators.sh | 3528 | # O harness acima sempre invoca `bash "$VPS_RAIZ/$script"` — ABSOLUTO. O README | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/api/v1/admin/platform-admins/route.ts | 32 | // Step 1: fetch all platform_admins rows. | COMMENT |
| LOW⚡ | app/api/v1/admin/platform-admins/route.ts | 65 | // Step 2: collect all user IDs that need resolution (user, granted_by, revoked_by) | COMMENT |
| LOW⚡ | app/api/v1/admin/platform-admins/route.ts | 74 | // Step 3: resolve emails via the Auth Admin API. | COMMENT |
| LOW | app/api/v1/admin/platform-admins/route.ts | 133 | // Step 4: build enriched rows | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 79 | // Step 1: query user_organizations + organizations | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 134 | // Step 2: get unique user IDs | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 137 | // Step 3: fetch auth users via the Auth Admin API. | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 242 | // Step 4: build joined rows | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 283 | // Step 5: apply q filter (email or full_name ilike) | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 293 | // Step 6: sort by last_sign_in_at desc nulls last, then user_id+org_id | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 309 | // Step 7: apply cursor | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 324 | // Step 8: paginate | COMMENT |
| LOW⚡ | lib/ai/rag/chunker.ts | 31 | // Step 1: paragraph split | COMMENT |
| LOW⚡ | lib/ai/rag/chunker.ts | 37 | // Step 2: sub-split oversized paragraphs | COMMENT |
| LOW | lib/ai/rag/chunker.ts | 67 | // Step 3: apply overlap | COMMENT |
| LOW | lib/ai/rag/chunker.ts | 82 | // Step 4: deduplicate and filter empties | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/api/v1/admin/platform-admins/route.ts | 32 | // Step 1: fetch all platform_admins rows. | COMMENT |
| LOW⚡ | app/api/v1/admin/platform-admins/route.ts | 65 | // Step 2: collect all user IDs that need resolution (user, granted_by, revoked_by) | COMMENT |
| LOW⚡ | app/api/v1/admin/platform-admins/route.ts | 74 | // Step 3: resolve emails via the Auth Admin API. | COMMENT |
| LOW | app/api/v1/admin/platform-admins/route.ts | 133 | // Step 4: build enriched rows | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 79 | // Step 1: query user_organizations + organizations | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 134 | // Step 2: get unique user IDs | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 137 | // Step 3: fetch auth users via the Auth Admin API. | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 242 | // Step 4: build joined rows | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 283 | // Step 5: apply q filter (email or full_name ilike) | COMMENT |
| LOW⚡ | app/api/v1/admin/users/route.ts | 293 | // Step 6: sort by last_sign_in_at desc nulls last, then user_id+org_id | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 309 | // Step 7: apply cursor | COMMENT |
| LOW | app/api/v1/admin/users/route.ts | 324 | // Step 8: paginate | COMMENT |
| LOW⚡ | lib/ai/rag/chunker.ts | 31 | // Step 1: paragraph split | COMMENT |
| LOW⚡ | lib/ai/rag/chunker.ts | 37 | // Step 2: sub-split oversized paragraphs | COMMENT |
| LOW | lib/ai/rag/chunker.ts | 67 | // Step 3: apply overlap | COMMENT |
| LOW | lib/ai/rag/chunker.ts | 82 | // Step 4: deduplicate and filter empties | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/app/team/_components/TeamMembersClient.test.tsx | 55 | email: "admin@example.com", | CODE |
| LOW | app/app/ai/providers/_components/CartaoDoJev.test.tsx | 152 | expect(screen.getByLabelText("Chave")).toHaveAttribute("placeholder", "apikey_…"); | CODE |
| LOW | …i/credentials/_components/AddCredentialDialog.test.tsx | 58 | expect(screen.getByLabelText("Chave")).toHaveAttribute("placeholder", "sk-ant-…"); | CODE |
| LOW | app/api/v1/admin/platform-admins/route.test.ts | 105 | [ADMIN_ID]: { email: "admin@example.com" }, | CODE |
| LOW | app/api/v1/admin/platform-admins/route.test.ts | 122 | user_email: "admin@example.com", | CODE |
| LOW | app/api/v1/admin/platform-admins/route.test.ts | 150 | auth: { [ADMIN_ID]: { email: "admin@example.com" } }, | CODE |
| LOW | app/api/v1/admin/platform-admins/route.test.ts | 162 | expect(body.data[0]?.user_email).toBe("admin@example.com"); | CODE |
| LOW | …i/v1/ai/agents/[id]/versions/[vid]/patch.route.test.ts | 95 | email: "admin@example.com", | CODE |
| LOW | …sts/unit/app-da-meta-tela-nao-devolve-segredo.test.tsx | 195 | expect(screen.getByLabelText("Chave secreta do aplicativo").getAttribute("placeholder")).toMatch( | CODE |
| LOW | tests/unit/fonte-de-conhecimento-cadastro.test.tsx | 335 | expect(screen.getByTestId("conhecimento-chave-input")).toHaveAttribute("placeholder", "sk-or-…"); | CODE |
| LOW | tests/unit/fonte-de-conhecimento-cadastro.test.tsx | 364 | expect(screen.getByTestId("conhecimento-chave-input")).toHaveAttribute("placeholder", "AIza…"); | CODE |
| LOW | tests/unit/team-role-change.test.ts | 83 | email: "admin@example.com", | CODE |
| LOW | tests/unit/i18n-espanhol-cobre-a-tela.test.ts | 144 | "placeholder", | CODE |
| LOW | tests/unit/aba-e-cookie-escrita-recusada.test.ts | 52 | email: "user@example.com", | CODE |
| LOW | tests/unit/canal-parceiro-tela.test.tsx | 98 | expect(campo).toHaveAttribute("placeholder", expect.stringMatching(/gravada/i)), | CODE |
| LOW | tests/unit/api-orcamento-de-ia.test.ts | 46 | email: "admin@example.com", | CODE |
| LOW | tests/unit/rbac-matrix.test.ts | 82 | email: "user@example.com", | CODE |
| LOW | tests/unit/case-detail.test.tsx | 139 | expect(campos[0]).toHaveAttribute("placeholder", "Escreva sua resposta para a IA..."); | CODE |
| LOW | tests/unit/case-detail.test.tsx | 140 | expect(campos[1]).toHaveAttribute("placeholder", "Pergunte à IA sobre este caso…"); | CODE |
| LOW | tests/e2e/inbox-busca-e-filtros-dizem-a-verdade.spec.ts | 91 | "placeholder", | CODE |
| LOW | tests/e2e/credenciais-de-ia.spec.ts | 31 | await expect(page.locator("#cred-key")).toHaveAttribute("placeholder", "sk-ant-…"); | CODE |
| LOW | tests/e2e/conversa-do-caso.spec.ts | 374 | "placeholder", | CODE |
| LOW | tests/e2e/acervo-de-conhecimento.spec.ts | 177 | await expect(page.getByTestId("conhecimento-chave-input")).toHaveAttribute("placeholder", "sk-or-…"); | CODE |
| LOW | tests/e2e/jev-decisoes-rapidas.spec.ts | 169 | await expect(page.locator("#cred-key")).toHaveAttribute("placeholder", "apikey_…"); | CODE |
| LOW | docs/stories/epics/EPIC-10-audit-settings.md | 892 | Given admin altera display_name de "Acme" pra "Acme Corp" | CODE |
| LOW | docs/stories/epics/EPIC-10-audit-settings.md | 895 | And organizations.display_name = "Acme Corp" | CODE |
| LOW | …rpowers/plans/2026-09-29-pr1-suspensao-que-suspende.md | 1998 | email: "user@example.com", | CODE |
| LOW | lib/auth/require-role.test.ts | 33 | email: "user@example.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | experiments/extensoes/probe-supervisor.py | 44 | except ProcessLookupError: | CODE |
| HIGH | experiments/extensoes/catalog/catalog.py | 464 | except KeyboardInterrupt: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/unit/ai-cases-routes.test.ts | 589 | pool.__client.query.mock.calls.some(([sql]) => sql.includes("insert into agent_inbox_items")), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | triagem/instrumentos/sonda.py | 384 | CODE | |
| LOW | triagem/instrumentos/sonda.py | 504 | CODE | |
| LOW | triagem/instrumentos/promessas.py | 262 | CODE | |
| LOW | triagem/instrumentos/promessas.py | 367 | CODE | |
| LOW | triagem/instrumentos/apendice.py | 114 | CODE | |
| LOW | triagem/instrumentos/tests/test_sonda.py | 181 | CODE | |
| LOW | triagem/instrumentos/lib/medicao.py | 140 | CODE | |
| LOW | triagem/instrumentos/lib/medicao.py | 173 | CODE | |
| LOW | triagem/instrumentos/lib/medicao.py | 267 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | experiments/extensoes/catalog/catalog.py | 4 | CODE | |
| LOW | experiments/extensoes/catalog/test_catalog.py | 1 | CODE | |
| LOW | triagem/instrumentos/sonda.py | 28 | CODE | |
| LOW | triagem/instrumentos/promessas.py | 32 | CODE | |
| LOW | triagem/instrumentos/apendice.py | 29 | CODE | |
| LOW | triagem/instrumentos/renumerar.py | 25 | CODE | |
| LOW | triagem/instrumentos/lib/medicao.py | 11 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | experiments/extensoes/catalog/catalog.py | 413 | except Exception: | STRING |
| LOW | experiments/extensoes/runtime/wasm_probe.py | 113 | except Exception as error: | CODE |