Skip to content

fix(ia): o interruptor de segurança grava a camada, não o nome de tela - #730

Open
rafaelbatistazz wants to merge 1 commit into
melgarafael:mainfrom
rafaelbatistazz:fix/interruptor-de-seguranca-grava-camada
Open

fix(ia): o interruptor de segurança grava a camada, não o nome de tela#730
rafaelbatistazz wants to merge 1 commit into
melgarafael:mainfrom
rafaelbatistazz:fix/interruptor-de-seguranca-grava-camada

Conversation

@rafaelbatistazz

Copy link
Copy Markdown

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.ts tem dois identificadores: nome (de tela, jailbreak_detect) e camada (a chave de org_guardrail_layers, jailbreak). O interruptor mandava o nome; a rota valida contra CAMADAS_SEMANTICAS e recusa com invalid_body.

A posição do controle parecia certa porque a leitura já usava camada (props(c.camada) monta o estado) — 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 o as desliga 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 onToggle passa a receber só o booleano, e quem monta o item fecha sobre a camada (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

pnpm typecheck        → exit 0 (com o cast removido)
pnpm lint             → 0 errors (349 warnings, pré-existentes)
pnpm lint:channels    → exit 0
pnpm test:unit        → Test Files 789 passed (789)
                        Tests 8364 passed | 1 expected fail (8365)
pnpm release:conferir → fragmento aceito

Sabotagem: repondo o envio do nome no clique, previ 2 vermelhos (um por interruptor) e o controle positivo verde — deu exatamente 2 failed | 1 passed, com as duas mensagens nomeando layer='promessa_semantica' e layer='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 ou nome virar igual a camada, ele reprova em vez de deixar o it.each passar por vacuidade.

O que NÃO medi

  • Prova em tela (Playwright) e 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.
  • A gravação de ponta a ponta na instalação (clicar e conferir a linha em org_guardrail_layers) — provei a requisição que sai, não o efeito no banco.

🤖 Generated with Claude Code

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
@vercel

vercel Bot commented Sep 12, 2026

Copy link
Copy Markdown

@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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Security Evidence

Commit: 8c4e8c6120082f788b91d7f43af34304f8dc482a

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. (1 security-sensitive paths changed; 0 security scanner or security-focused validation artifacts changed)

Touched security-sensitive paths:

  • app/app/ai/agents/[id]/_components/PainelDeSeguranca.tsx

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: 8c4e8c6120082f788b91d7f43af34304f8dc482a

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

  • .changes/interruptor-de-seguranca-liga-de-verdade.md
  • app/app/ai/agents/[id]/_components/PainelDeSeguranca.tsx
  • tests/unit/painel-de-seguranca-liga-a-camada-certa.test.tsx

CI/CD Recommendation

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

Signals:

  • 1 CI or workflow path(s) changed

Paths:

  • tests/unit/painel-de-seguranca-liga-a-camada-certa.test.tsx

Cost/Token Risk

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

Signals:

  • 1 cost/token path(s) changed

Paths:

  • app/app/ai/agents/[id]/_components/PainelDeSeguranca.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: 8c4e8c6120082f788b91d7f43af34304f8dc482a

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 /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.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: 8c4e8c6120082f788b91d7f43af34304f8dc482a

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 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.

@github-actions

Copy link
Copy Markdown

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

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.

Os dois interruptores de "Confere antes de enviar" devolvem 422 e não ligam

1 participant