Vaara

Vaara é a camada de evidência de execução à prova de violação para sistemas de IA. Ela cobre a conformidade com o EU AI Act e qualquer outro caso em que você precise provar o que um agente realmente fez. Código aberto, sem SaaS, sem telemetria.

Documentação

Vaara

PyPI License CI OpenSSF Scorecard Vaara Conformance: 50 suites, 0 failing DOI 10.5281/zenodo.22027975 OpenSSF Best Practices Hugging Face Space

Downloads

Autonomia Responsável.

Um recibo verificável para cada ação autônoma, conferível por qualquer pessoa.

Seu agente de IA transferiu os fundos, escreveu o arquivo, chamou a ferramenta. Depois, alguém que não confia em você pede que você prove exatamente o que ele fez e por quê: um regulador, um auditor, um cliente após um incidente. Seus próprios logs não resolverão isso, porque você poderia tê-los editado.

Vaara for macOS launch demo

Início rápido

pip install vaara                            # Python: CLI, MCP proxy, server
brew tap vaaraio/tap && brew install vaara   # macOS: CLI + menu-bar app (built from source)
npm install @vaara/client                    # TypeScript client for the HTTP API
import vaara

@vaara.govern
def transfer_funds(to: str, amount: float) -> str:
    ...

Isso é tudo. Cada chamada a uma função governada recebe uma pontuação de risco e é decidida contra sua política antes de o corpo ser executado. Uma chamada permitida é executada, e a decisão, a chamada e o resultado são registrados em um registro encadeado por hash e à prova de adulteração que qualquer pessoa pode verificar offline. Assine-o na exportação (vaara trail export) para prova de terceiros. Os registros persistem em ~/.vaara/trail/audit.db por padrão, para que as evidências sobrevivam a reinicializações. Python 3.10+, zero dependências em tempo de execução.

Tanto deny quanto escalate geram vaara.Blocked, pois uma escalada significa que um humano ainda não respondeu. Execute o exemplo acima em uma instalação nova e ele gerará: sem histórico de resultados, o intervalo de confiança do avaliador é amplo, e um tx.transfer escala no limite superior do intervalo, mesmo que sua estimativa pontual esteja abaixo do limite de permissão. Essa é a direção pretendida para falhar, e ela se estabiliza. Alimentar resultados reais de volta por meio de report_outcome estreita o intervalo, e a mesma chamada começa a permitir após algumas dezenas de resultados limpos. Para observar decisões sem agir sobre elas enquanto isso acontece, comece com @vaara.govern(shadow=True).

Verifique um recibo sem nada instalado

vaara.io/verify.html é a Vaara Resin. Um único arquivo HTML, sem etapa de build e sem dependências. Cole um recibo e ele recalcula a codificação de pré-autenticação DSSE, obtém seu digest e verifica a assinatura Ed25519 com WebCrypto. O recibo nunca sai da aba, nada é enviado e a página funciona com a rede desligada, então a verificação não é um serviço e a Vaara não é parte dela. Salve o arquivo e ele continua funcionando.

Ele também declara o que uma verificação aprovada não estabelece: que a chave pertence à parte que você espera, que a declaração assinada é verdadeira, que decided_at significa algo sem uma autoridade de tempo externa, ou que um recibo é um histórico completo.

O explorador na mesma página lê o log público de transparência diretamente do seu navegador. Procure um cabeçalho de trilha por digest, ou cole uma chave pública para ver tudo publicado sob ela. Sem conta e sem login, porque a chave é a identidade. Publicar nesse log é opcional e desativado por padrão (vaara trail publish-head), então uma ausência ali significa que nada foi publicado, e não que nada aconteceu.

Veja quem mais verificou

vaara.io/conformance.html é a página de resultados. Ela carrega cada suíte e seu veredito, e cada parte além do mantenedor que executou os verificadores e relatou o que encontrou publicamente. As linhas são encadeadas, cada uma contendo o digest da linha anterior, então remover ou reordenar uma quebra todos os digests seguintes, e a quebra é visível para qualquer pessoa. O mantenedor também não pode remover uma linha. Uma execução que discorda da nossa também é uma linha, com o motivo declarado, e não há lista negra.

O executor agregado avalia todas as suítes de uma vez, e avalia os vetores de outra implementação da mesma forma:

python scripts/conformance_runner.py                                 # grade the reference corpus
python scripts/conformance_runner.py --vectors-dir ./your_vectors    # grade your own

Ele imprime um link pré-preenchido no final de cada execução, então pedir uma linha leva um clique. O conjunto de regras nomeado e versionado, o que uma aprovação estabelece e não estabelece, e a lista completa de suítes estão em docs/conformance-profile.md.

Prefere o pipeline explícito?

O decorador aciona o mesmo mecanismo que você pode chamar diretamente quando quiser o objeto de decisão em mãos.

from vaara.pipeline import InterceptionPipeline

pipeline = InterceptionPipeline()
result = pipeline.intercept(
    agent_id="agent-007",
    tool_name="fs.write_file",
    parameters={"path": "/etc/service.yaml", "content": "..."},
    agent_confidence=0.8,
)
if result.allowed:
    pipeline.report_outcome(result.action_id, outcome_severity=0.0)
else:
    print(result.reason)

Cada chamada recebe uma pontuação de risco e uma decisão de permitir / bloquear / escalar contra sua política; então a chamada, a decisão e o resultado real são gravados na trilha de auditoria. report_outcome fecha o ciclo: o avaliador reatribui pesos com base em quais sinais realmente previram o resultado. As versões são enviadas com proveniência SLSA Build Level 3, verificável com slsa-verifier verify-artifact. Classificador de ML opcional: pip install 'vaara[ml]'.

Verifique sem confiar no produtor

Escrever uma trilha é a metade fácil. A metade que importa é permitir que alguém que não confia em você a verifique, sem chave, sem acesso e sem nenhum dos seus códigos. Cada registro da Vaara é endereçado por conteúdo e falha fechada em autenticidade, e vem com vetores públicos de conformidade além de um verificador independente que não importa código da Vaara, para que uma parte independente reproduza cada veredito offline.

vaara verify-bundle evidence-bundle.json

ok somente quando uma assinatura é realmente estabelecida, não meramente presente em um log. A mesma propriedade impulsiona o trabalho de padrões por trás do Rascunho de Internet do Recibo Vaara: evidência que se sustenta para alguém que não executa nenhum dos seus softwares. O conjunto completo de verificadores, o modelo de confiança para cada verbo e de onde vem a confiança em cada caso estão em docs/verifying-evidence.md.

Para verificar essa afirmação você mesmo, sem instalar a Vaara, execute o verificador independente contra os vetores publicados. Suas únicas dependências são cryptography e rfc8785:

git clone https://github.com/vaaraio/vaara
cd vaara
pip install cryptography rfc8785        # the checker's only dependencies
python tests/vectors/external_evidence_v0/_check_independent.py

Ele rederiva cada veredito a partir dos bytes do recibo e da chave pública sozinhos. A saída mostra a propriedade para a qual a trilha foi construída: um recibo descartado de dentro de um limite declarado é uma lacuna comprovável a partir do conjunto mantido, sem acesso ao emissor e sem testemunha externa.

Para o ciclo completo em um único arquivo executável, produza um registro assinado, verifique-o você mesmo e depois veja um único byte forjado ser detectado, veja examples/prove-it-yourself/. O argumento de logs versus evidências por trás disso está em docs/logs-vs-evidence.md.

Como são as evidências

vaara compliance report --format json contra uma trilha real produz um registro de evidência em nível de artigo que um auditor lê diretamente. Artigos sem eventos registrados retornam evidence_insufficient, não um carimbo de borracha.

{
  "system_name": "Acme HR Assistant",
  "overall_status": "evidence_insufficient",
  "trail_integrity": {"size": 105, "chain_intact": true},
  "articles": [
    {"article": "Article 12(1)", "title": "Record-Keeping (Logging)",
     "status": "evidence_sufficient", "strength": "strong", "evidence_count": 105},
    {"article": "Article 15(1)", "title": "Accuracy, Robustness and Cybersecurity",
     "status": "evidence_insufficient", "strength": "absent", "evidence_count": 0}
  ]
}

Cada veredito carrega o instantâneo de limite versus observado, a justificativa e os registros subjacentes, para que um revisor rastreie status até um evento concreto. Os mesmos dados são renderizados como um PDF de Organismo Notificado, um painel HTML estático ou um envelope de transferência assinado por Sigstore. Veja docs/COMPLIANCE.md.

O que você obtém
  • Controle cada chamada de ferramenta que você roteia por ele contra sua própria política: permitir, bloquear ou escalar. A cobertura é o que você envolver; cada adaptador documenta a superfície que vê, e o plugin do Claude Code declara suas quatro explicitamente.
  • Uma trilha à prova de adulteração que uma parte externa verifica sem confiar na sua pilha, com o cabeçalho da cadeia ancorável a um carimbo de tempo externo RFC 3161 / eIDAS, para que sua existência seja comprovável contra um relógio que você não controla.
  • Evidência em nível de artigo da Lei de IA da UE, honesta sobre as lacunas em vez de encobri-las.
  • Governança da própria chamada do modelo, não apenas das ferramentas ao redor: um recibo de inferência com raiz em hardware que um segundo modelo local diferente verifica de forma cruzada. Este é o harness de inferência soberano, novo na v1.0.
  • Aplicação, não apenas um registro (v1.1.0): um corretor de credenciais emite uma credencial assinada e de curta duração vinculada ao digest de atestado e com escopo para uma única ferramenta, seu compromisso de argumento e locatário, com escopos de capacidade tipados que limitam o que uma chamada pode fazer. Um gateway na frente de uma ferramenta protegida recusa qualquer chamada sem uma concessão válida vinculada ao atestado, então uma bypass deixa de ser silenciosa. Desativado por padrão.
  • Completude com evidência de lacunas (v1.4.0): cada recibo de autorização pode carregar uma sequência assinada por limite e uma contagem contínua, para que um recibo descartado dentro de um limite declarado seja uma lacuna comprovável a partir apenas dos recibos mantidos, sem acesso ao emissor e sem testemunha externa (vaara verify-contiguity). Desativado por padrão.
  • Reemissão independente (v1.14.0): um segundo gerador em cada conjunto de vetores públicos reproduz o portador assinado byte a byte exato a partir apenas da canonicalização declarada, sem importação da Vaara. Um verificador que nunca executou o software Vaara reproduz os mesmos bytes.
Onde ele se conecta

Adaptadores nativos roteiam os principais frameworks de agentes Python pelo mesmo pipeline, cada um via o próprio hook do framework, emitindo eventos de auditoria idênticos:

FrameworkPonto de entrada
LangChainVaaraCallbackHandler, vaara_wrap_tool
CrewAIVaaraCrewGovernance
OpenAI Agents SDKVaaraToolGuardrail, vaara_wrap_function
Servidor MCPvaara.integrations.mcp_server

Para colocar a Vaara na frente de um servidor MCP, execute-a como um proxy. Cada tools/call passa pelo pipeline antes de chegar ao upstream; chamadas permitidas são encaminhadas de forma transparente, chamadas bloqueadas retornam um erro MCP.

vaara-mcp-proxy \
  --upstream npx --upstream-arg -y --upstream-arg @sap/mdk-mcp-server \
  --db ./mcp_audit.db --shadow

Comece com --shadow: cada chamada é classificada, pontuada e registrada, nada é bloqueado. Após alguns dias, vaara trail shadow-report --db ./mcp_audit.db mostra o que a aplicação teria feito; então remova a flag e aplique, começando de um perímetro pronto para servidores MCP comuns em examples/policies/mcp-starters/. Aponte seu cliente MCP (Claude Code, Cursor, qualquer host) para o proxy em vez do upstream. Há também uma API HTTP (pip install 'vaara[server]', vaara serve) e um cliente TypeScript de primeira parte no npm (@vaara/client) para agentes não-Python. Detalhes do framework, os adaptadores de guardrail de nuvem e OSS (Bedrock, Azure, GCP, NeMo, Guardrails AI, LLM Guard, Rebuff) e o proxy multi-locatário estão em docs/adapters.md.

No CI

Uma política é código, então ela pertence ao pull request que a altera. A ação valida a política, executa seus casos e falha o build em uma política que não analisa, um caso com falha ou uma trilha cuja cadeia ou assinatura não se sustenta.

- uses: vaaraio/vaara@v1
  with:
    policy: policies/production.yaml
    cases: policies/production.cases.yaml

Aponte trail para um zip assinado para verificar um produzido por um job. Sem uma pubkey, ele verifica que a trilha está internamente intacta; passe uma chave obtida separadamente para vincular também o signatário, e a execução diz qual dos dois fez. Entradas, saídas e fixação estão em docs/github-action.md.

Isso verifica artefatos. Controlar o agente é trabalho do runtime, no momento da chamada da ferramenta.

Como ele pontua Cada pontuação de risco combina cinco sinais de especialistas e continua se adaptando à medida que os resultados retornam, e carrega um intervalo de confiança com uma garantia de cobertura que se mantém independentemente da distribuição de entrada. Em um corpus adversarial reservado, o classificador atinge **85,6%** de recall (Wilson 95% [83,4, 87,6]) com uma taxa de falsos positivos de **5,1%**, e **0,0%** de FPR em chamadas benignas sob pressão de injeção ao vivo. O avaliador de regras de caminho quente adiciona uma média de 140 µs por chamada em CPU commodity; o classificador de ML é opcional (`vaara[ml]`) e fora desse caminho. `make bench` reproduz os números do classificador abaixo contra os pacotes incluídos no repositório; ele precisa de `pip install 'vaara[ml]'` e baixa o modelo de embeddings na primeira execução.
  • Corpus adversarial com 25.556 entradas (250 curadas manualmente + 25.306 geradas por LLM). A divisão v0.40 atribui 24.619 delas sem vazamento por célula (categoria, lote de geração): 15.114 de treino, 2.921 de validação, 2.980 de teste, 3.604 de retenção.
  • Classificador v11 (236 características manuais + embeddings MiniLM de 384 dimensões) no limiar 0,8800 no TESTE reservado n=1.827: recall 85,6% [83,4, 87,6] com FPR 5,1% [3,8, 6,9]. O recall subiu 0,9 ponto em relação ao v9 e a taxa de falsos positivos subiu 1,0. Essa troca é deliberada, e o restante desta seção explica o porquê.
  • Recall reservado entre modelos de 86,3% sobre n=5.600, contra ataques escritos por Qwen2.5-72B, um modelo ausente do TREINO. O v9 lê 67,4% no mesmo conjunto. O número publicado anteriormente aqui era 66,8% [64,9, 68,7], medido no v8 contra a superfície v0.37; o v9 reproduzindo esse número dentro de um ponto em uma família de atacantes diferente e com dados recém-gerados é a razão pela qual esse número sobreviveu a duas versões inalterado. Este ainda é o pior caso honesto, e o número dentro da distribuição acima é o denominador mais fácil.
  • Em quatro categorias de ataque que o corpus mal cobria até o v0.40, medido em 5.600 entradas geradas após o ponto de operação do v11 ser fixado: recall de 63,1% a 87,0% e falsos positivos de 6,6% a 2,5% em relação ao v9. Somente a exfiltração de credenciais passa de 45,9% para 80,3% com FPR de 10,0% a 3,9%. Registro completo em bench/V11-CANDIDATE.md, incluindo o candidato anterior que foi rejeitado e o motivo.
  • FPR sob pressão BIPIA em chamadas de ferramentas benignas de 0,0% [0,0, 1,6] em quatro backends de agente (Claude Haiku 4.5, Llama-3.1-8B, Mistral-7B, Qwen-2.5-7B). Redução de 1,2% no v9 e 35,2% no v8.
  • Robustez PAIR multi-atacante: 0/25 sucessos por atacante em Qwen2.5-32B, Qwen2.5-72B, Llama-3.3-70B com sementes idênticas, limite superior de Wilson 13,3%.
  • Cobertura conformal livre de distribuição na pontuação; limite de arrependimento MWU O(sqrt(T log N)).
  • Cadeia de custódia: corpus, divisão, commit de treinamento e SHAs do pacote bloqueados e impressos por cada script.

Método e detalhamento por célula: docs/architecture.md e bench/.

Padrões e atestação
  • vaara.receipt/v1 é a especificação pai canônica para o formato de recibo assinado: encadeado por hash, canonicalizado com JCS (RFC 8785), verificável offline a partir de uma chave pública. A vinculação de liquidação x402 e um perfil de carimbo de tempo qualificado eIDAS são perfis downstream que se fixam a ela em vez de formatos concorrentes. Os recibos podem carregar um carimbo de tempo RFC 3161 auto-hospedado que a Vaara emite offline.
  • SEP-2828 registros de execução assinados, transportados como o Internet-Draft da IETF draft-sirkkavaara-vaara-receipt. Uma segunda implementação independente reproduziu os vetores de conformidade SEP-2828 a partir de um checkout limpo, sem código compartilhado. Corpora publicados com verificadores independentes cobrem o caminho de vinculação de fallback (tests/vectors/fallback_projection_v0/) e decisões de governança CrewAI (tests/vectors/governance_decision_v0/).
  • OVERT 1.0 (overt.is): a Vaara é o Árbitro e emite Envelopes Base do Perfil de Protocolo 1.0 (CBOR canônico, Ed25519) junto com cada registro quando a atestação está ativada.
  • Pós-quântico: uma assinatura ML-DSA-65 / FIPS 204 paralela opcional sobre o mesmo pré-imagem, de modo que uma assinatura pós-quântica removida seja um rebaixamento detectável, em vez de uma perda silenciosa.
  • Evidência agnóstica de raiz: o mesmo registro do Artigo 12 é comprovável com ou sem um TEE de hardware e re-expressável em declarações EAR do IETF RATS (vetor AR4SI), seja enraizado em um host TPM 2.0, uma VM confidencial AMD SEV-SNP ou nenhum TEE.
  • Harness de inferência soberana (v1.0): um modelo local atrás de um proxy de assinatura que emite um recibo de inferência enraizado em hardware que um segundo modelo local verifica. Desenvolvido em particular, publicado aqui sob AGPL-3.0.

Detalhes e os verificadores offline para cada um: docs/standards.md.

Estabilidade da superfície

A superfície pública é fixa: o envelope assinado (vaara.receipt/v1), as restrições de capacidade, a concessão e o gateway de credenciais, e o ponto de entrada @vaara.govern. Nenhum novo primitivo está planejado. Novo comportamento é entregue como perfis que se fixam a vaara.receipt/v1, não como novos tipos centrais, e nenhuma nova vinculação de formato será adicionada (a última foi v1.13.0). A partir daqui, o trabalho é endurecimento e subtração dentro dessa superfície, para que qualquer pessoa que construa sobre ela tenha um alvo estável.

Documentação
CaminhoConteúdo
docs/verifying-evidence.mdCada verificador e seu modelo de confiança
docs/logs-vs-evidence.mdLogs vs evidência: provando o que um agente fez e o que a Lei de IA realmente exige
docs/prove-what-an-ai-agent-did.mdAs quatro propriedades que um registro comprovável de ações de um agente precisa
docs/eu-ai-act-article-12.mdManutenção de registros do Artigo 12: o que exige, o que não exige, o que exigir das ferramentas
docs/tamper-evident-audit-trail.mdComo a trilha funciona, seus limites honestos e o que custa
docs/vaara-vs-observability-vs-grc.mdVaara vs Datadog/Splunk vs Vanta/Drata: três perguntas diferentes
docs/dogfood/Nosso marketing roda sob este portão; a trilha assinada e a chave para verificá-la
docs/architecture.mdPontuação, cobertura conformal, âncora de tempo, propriedades formais
SPEC.mdA especificação canônica do formato de recibo vaara.receipt/v1
docs/standards.mdSEP-2828, SEP-2787, OVERT, o harness de inferência soberana
docs/adapters.mdAdaptadores de framework e guardrails de nuvem/OSS, proxy multi-tenant
docs/COMPLIANCE.mdMapeamento de artigos da Lei de IA da UE e DORA, números de avaliação
docs/multi-replica-deployment.mdEscalando além de um processo de proxy: cadeias por réplica, rotação, índice de arquivo
docs/kubernetes-rancher.mdExecutando o proxy no Kubernetes com Rancher: chart, armazenamento, aplicação, isolamento de rede
docs/supported-platforms.mdVersões de Python, contêiner e Kubernetes que a Vaara suporta e quais foram verificadas
CHANGELOG.mdEvolução versão por versão
docs/PRIOR_ART.mdQuando cada conceito foi lançado pela primeira vez, além de trabalhos adjacentes

A Vaara ajuda implantadores a montar evidências para seu próprio trabalho de conformidade. Ela não certifica conformidade nem constitui aconselhamento jurídico. Os implantadores são responsáveis por suas obrigações sob a Lei de IA da UE e outras leis aplicáveis.

Licença comercial e pilotos pagos disponíveis: veja vaara.io ou entre em contato com hello@vaara.io. Os termos de licenciamento estão em LICENSING.md, e a licença comercial está descrita em COMMERCIAL.md.

Agradecimentos

Citação

Se você construir sobre a Vaara ou seu formato de recibo, cite o repositório (veja CITATION.cff) e a especificação que ele implementa:

Henri Sirkkavaara. The Vaara Receipt: A Recomputable Receipt Format for Decisions About Agent Actions. IETF Internet-Draft draft-sirkkavaara-vaara-receipt.

Cada versão marcada é arquivada pelo Zenodo e recebe um DOI. Cite 10.5281/zenodo.22027975 para o software como um todo, que sempre resolve para a versão mais recente, ou o DOI da versão impresso em uma versão específica para os bytes exatos que você executou.

Licença

Copyright © 2026 Henri Sirkkavaara. Licenciado sob AGPL-3.0-or-later. Veja LICENSE.