fix(ia): o interruptor de segurança grava a camada, não o nome de tela - #730
Conversation
Ligar "Detectar tentativa de manipular o assistente" ou "Conferir promessas
em texto livre" devolvia 422 e o controle voltava sozinho — em qualquer
instalação, porque o defeito é do call site, não de configuração.
Cada conferência tem dois identificadores: `nome` ("jailbreak_detect"), de
tela, e `camada` ("jailbreak"), que é a chave de `org_guardrail_layers` e o
único valor que o PUT aceita (a rota valida contra CAMADAS_SEMANTICAS). O
interruptor mandava o `nome`. A posição do controle parecia certa porque a
LEITURA já usava `camada` — só a escrita divergia.
O typecheck não pegava: o call site fazia `layer as CamadaDeSeguranca["layer"]`,
e o `as` desliga exatamente a checagem que reprovaria isto. Por isso o conserto
não é trocar o argumento e manter o cast: `onToggle` passa a receber só o
booleano, quem monta o item fecha sobre a `camada` (já tipada como o enum), e o
cast some — trocar de campo agora é erro de compilação.
Closes melgarafael#729
|
@rafaelbatistazz 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 / Security EvidenceCommit: Security scanner evidence required (action_required) Detected 1 security-sensitive predictive risk signal(s) without scanner evidence. Mode: enforce Findings:
Touched security-sensitive paths:
Expected evidence:
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 / PR Risk TaxonomyCommit: PR taxonomy review recommended (neutral) Detected 3 PR taxonomy bucket(s): Security Evidence, CI/CD Recommendation, Cost/Token Risk. Scanned 3 changed file(s). Roadmap taxonomy buckets: Security EvidenceSecurity-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence. Signals:
Paths:
CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
Cost/Token RiskAI routing, usage, and token-budget changes should include budget or usage-limit evidence. Signals:
Paths:
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 / Reference Set ReadinessCommit: Reference set readiness gaps detected (neutral) Reference evidence present for 0/7 areas (0%) across 3 changed file(s). This check is based on files changed in this PR. Repository-level readiness is still reported by
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 / Hosted Promotion ReadinessCommit: Hosted promotion readiness passed (success) No hosted promotion evidence gaps detected across 3 changed file(s); 0 corpus scenarios had matching evidence. This check compares PR file changes against the evaluator/RAG promotion corpus in 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. |
|
Recebido, @rafaelbatistazz — obrigado por isto. Duas coisas que vão parecer erro seu e não são:
Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem |
O que muda para quem usa
Em Agentes › Confere antes de enviar, os dois únicos controles que têm escolha — "Detectar tentativa de manipular o assistente" e "Conferir promessas em texto livre" — não ligavam: o pedido voltava
422, o interruptor voltava sozinho e a tela não dizia nada. Nenhuma organização conseguia ligá-las; valia sempre o padrão do ambiente.Closes #729
A causa
Cada conferência de
lib/ai/guardrails/lista-de-conferencia.tstem dois identificadores:nome(de tela,jailbreak_detect) ecamada(a chave deorg_guardrail_layers,jailbreak). O interruptor mandava onome; a rota valida contraCAMADAS_SEMANTICASe recusa cominvalid_body.A posição do controle parecia certa porque a leitura já usava
camada(props(c.camada)monta oestado) — só a escrita divergia, e é por isso que o defeito não aparecia olhando a tela parada.Por que não é só trocar o argumento
O call site tinha
layer as CamadaDeSeguranca["layer"], e oasdesliga exatamente a checagem que reprovaria a troca de campo. Trocar o argumento e manter o cast deixaria a mesma armadilha armada para o próximo refactor.Então
onTogglepassa a receber só o booleano, e quem monta o item fecha sobre acamada(que já é tipada como"promessa_semantica" | "jailbreak" | null). O cast some, e usar o campo errado agora é erro de compilação.O que eu medi
Sabotagem: repondo o envio do
nomeno clique, previ 2 vermelhos (um por interruptor) e o controle positivo verde — deu exatamente2 failed | 1 passed, com as duas mensagens nomeandolayer='promessa_semantica'elayer='jailbreak'. Restaurei depois.O teste percorre as conferências que têm
camada(não uma lista fixa), então uma terceira camada nasce coberta. O primeiro caso é controle positivo: se a lista ficar vazia ounomevirar igual acamada, ele reprova em vez de deixar oit.eachpassar por vacuidade.O que NÃO medi
pnpm test:db— não rodei. A mudança é de call site no cliente e não toca schema; a fiação ficou coberta pelo teste de componente com o hook dublado, não por navegador de verdade.org_guardrail_layers) — provei a requisição que sai, não o efeito no banco.🤖 Generated with Claude Code