4 · Fazendo a pergunta certa¶
Uma verificação responde exatamente à pergunta que lhe é feita. Este capítulo trata de fazer a pergunta que você quer fazer: uma obrigação declarada como um par, os pins que delimitam o seu alcance, como encontrar as candidatas numa política que você não escreveu, e por que uma execução resolve uma proposição e nada mais.
Uma obrigação é um par¶
A verificação não verifica uma política. Ela verifica uma proposição sobre uma política:
Esta ação pode disparar enquanto este contexto é falso?
Você nomeia os dois. Num serviço de transferências, a obrigação poderia ser a ação
execute_transfer_funds e o contexto is_authenticated, e a pergunta é se alguma conversa, em alguma
situação, faz uma transferência acontecer para um usuário que não fez login. Um job guardrail leva o
par como os seus dois operandos obrigatórios:
result = client.verify_guardrail("transfers.co", "execute_transfer_funds", "is_authenticated")
print(result.status, result.decided_by)
A resposta quantifica sobre todas as situações de uma só vez. Uma política com 48 contextos tem 2⁴⁸
combinações deles, e um UNSAT resolve todas elas, o que nenhuma quantidade de conversas de teste
consegue fazer.
Perguntando sobre um único rail¶
Um contexto pode ser qualificado pelo ponto em que a política o consulta: risk_warning_given@output.
A fase é input, output ou dialog. O contexto sem qualificação pergunta se a obrigação é cumprida
em algum lugar, o que é a pergunta mais fraca; uma verificação colocada na ponta errada do pipeline
não é o controle com que se parece. Quando a política nunca consulta a variável no rail que você nomeia,
a pergunta é recusada em vez de respondida, e a recusa nomeia os rails em que a variável é consultada.
Os pins dizem quando a obrigação se aplica¶
A maioria das regras é condicional. Uma resposta de investimento de alto risco deve trazer um aviso de risco se aplica a um tipo de produto; uma recomendação de investimento exige a permissão de aconselhamento se aplica quando a recomendação é pessoal. Feita sem a sua condição, a pergunta cobre situações que a regra nunca quis governar, e a sua resposta é sobre a coisa errada:
- pins de menos, e uma política que está correta pode voltar
STALLouSATsobre situações que a regra não cobre. Agir sobre essa resposta corrige uma política que estava certa, que é o único caso em que um reparo piora o produto; - pins demais, e a pergunta fica mais estreita que a regra: uma resposta limpa diz então menos do que parece dizer.
Um pin fixa uma variável em 0 ou 1 para a pergunta. Nomeie as condições que a regra nomeia, nem mais nem menos:
result = client.verify_guardrail(
"gemini.co",
"respond with permitted investment answer",
"has_advising_permission",
pins={"personal_recommendation": 1}, # the rule applies to a personal recommendation
profile="patch", # and asks for a repair if it does not hold
)
print(result.status)
print(result.corrective_action["guardrail_patch"])
Os pins vêm da regra que você está aplicando, não da política, e são a parte da pergunta que um revisor precisa ler. O capítulo 12 mostra como fazer o motor calcular os pins mais fracos sob os quais uma obrigação vale, o que transforma escrever os pins em conferi-los.
Encontrando as perguntas¶
A pergunta que o motor não pode responder por você é o que conta como um resultado indesejado: isso é
um julgamento sobre o seu negócio e as suas regras. A pergunta que ele pode responder é quais deles a
política já codifica como uma proteção. O modo enumerate_properties lê a política, volta de cada
ação até cada contexto que pode influenciá-la, e propõe cada par como candidato. Ele não roda nenhuma
resolução, então custa menos que uma verificação:
proposed = client.enumerate_properties("transfers.co")
for row in proposed.records:
print(row["action"], row["context"], row["guarded"], row["derived_pins"])
Cada linha candidata traz o que a política já diz sobre o par:
guarded: trueederived_pins: [{}]: a política exige o contexto antes da ação sob nenhuma condição adicional. A forma mais forte.derived_pinslistando condições, como[{"product_is_nmmi": 1}]: a política exige o contexto sob essas condições. Duas entradas são duas condições separadas, e cada uma é uma linha própria se você a mantiver.derived_pins: [], uma lista vazia: a variável está num caminho até a ação, mas nunca como algo que a ação exige. Isso é uma proibição, não uma obrigação, e perguntar se a ação pode disparar sem ela é fazer a pergunta ao contrário.guarded: false: a ação depende do contexto e nenhum ramo da política o menciona. É assim que uma omissão aparece por dentro, e é a linha para ler primeiro.
reads_as descreve cada linha em palavras, e guard_paths nomeia os fluxos e as linhas que a protegem.
Uma candidata não tem id, expect nem gate: uma enumeração é uma proposta. Promover uma linha para a
tabela que você versiona é uma decisão de uma pessoa, e o passo que importa é definir expect como o
que a obrigação deveria devolver, não como o que ela devolve hoje. Uma linha escrita para bater com o
comportamento de hoje não pode falhar, e uma tabela de linhas que não podem falhar não prova nada
(capítulo 11).
O que a enumeração não consegue encontrar¶
Uma obrigação que a regra exige e que a política nunca menciona não tem variável, não chega a nenhuma
ação e está ausente da lista. Esse é o desvio por omissão, e nenhuma leitura da política consegue
encontrá-lo. A enumeração diz isso na sua própria saída (enumeration.covers): uma varredura limpa
sobre as suas linhas prova que a política aplica o que afirma, não que afirma o suficiente.
Uma execução prova uma proposição¶
Provar que uma resposta de alto risco não pode ser dada sem um aviso de risco não diz nada sobre se ela pode ser dada sem um aviso do fundo de compensação, nem sobre nenhuma outra ação do arquivo. Uma política com doze resultados indesejados são doze perguntas. Rode-as como uma tabela versionada, para que uma mudança na política refaça todas elas (capítulo 11), e mantenha a tabela ao lado da política, onde quem aprova as regras pode lê-la.
Os limites¶
- Uma resposta é sobre a pergunta feita: a ação, o contexto e os pins. Ela não é sobre a política como um todo.
- A lista de perguntas é sua. O motor propõe as obrigações que uma política codifica; ele não pode propor uma que a política omite.
- Os pins declaram o alcance de uma obrigação, e um pin errado dá uma resposta correta à pergunta errada. Nada dentro do motor pode lhe dizer quais pins a sua regra quis dizer.