Metadata-Version: 2.4
Name: fazflow-policy-gate
Version: 0.1.2
Summary: Governança de agentes de IA: decide cada ação antes que ela aconteça. Binding sobre o artefato WASM, sem lógica de decisão.
License: Apache-2.0
Project-URL: Homepage, https://fazflow.com
Project-URL: Repository, https://github.com/fazflow/FazFlow-IA
Project-URL: Issues, https://github.com/fazflow/FazFlow-IA/issues
Keywords: ai-agents,authorization,policy,cedar,governance,audit
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Security
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Natural Language :: Portuguese (Brazilian)
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: wasmtime>=25

# fazflow-policy-gate

Decide cada ação de um agente de IA **antes** que ela aconteça, e registra a
decisão numa cadeia verificável.

A decisão é local: o motor roda dentro do seu processo, e os argumentos da
requisição nunca saem da sua infraestrutura.

## Instalar

```bash
pip install fazflow-policy-gate
```

O artefato WebAssembly viaja dentro do pacote. Não há passo de download.

## Usar

```python
from fazflow_policy_gate import PolicyGate

gate = PolicyGate.load()
gate.load_bundle({"versao": "v1", "politicas": fonte_cedar})

d = gate.evaluate({
    "user": 'User::"u_8891"',
    "agent": 'Agent::"copiloto"',
    "action": "Tool::query",
    "resource": 'Dataset::"notas"',
    "context": contexto,   # os 14 campos
    "entities": entidades, # User, Agent, Workload e o recurso
})

if d["verdict"] == "Deny":
    raise RuntimeError(d["reason_code"])
```

## Duas camadas

A política é avaliada em duas camadas — a do usuário e a do agente — e **as
duas precisam permitir**. Uma política só com `principal is Agent` responde
`Deny` com `DeniedNoUserPermit`, e é o erro mais comum do primeiro dia.

## Obrigações

Quando o veredito é `Transform`, `d["obligations"]` traz o que precisa ser
feito — `mascarar:cpf,email`, `truncar:100`. **Aplicá-las é responsabilidade de
quem chamou.** O SDK não toca no dado: ele não viu o conteúdo e não está no
caminho da resposta.

Ignorar uma obrigação é o modo de falha mais silencioso do sistema: o log
registra que a máscara foi exigida, a auditoria vê que foi exigida, e o dado
saiu inteiro.

## Concorrência

Cada instância WASM é single-threaded. Sob concorrência use `PolicyGatePool`,
que mantém uma instância por thread lógica. Não chame métodos da instância crua
enquanto outra thread avalia — os buffers são compartilhados.

## O hash

`gate.version()["artefato_hash"]` é o `sha256` do artefato que foi de fato
instanciado, e é o mesmo valor que entra em cada decisão como `engine_hash`.
Compará-lo com o que o painel mostra prova que o binário que decidiu é o que
você conferiu.

## Licença

Apache-2.0
