Ir para o conteúdo

41 · Regras sem Colang: a planilha de regras

Uma planilha de regras (rule sheet) declara as regras sobre as suas ferramentas como um YAML que uma pessoa consegue ler em voz alta: um reembolso acima de 200 precisa da aprovação de um supervisor; fechar uma conta espera o cliente confirmar; ninguém apaga um cliente. Ela compila para o mesmo rulebook em que uma política Colang se transforma, então toda verificação que lê um rulebook lê uma planilha exatamente como lê Colang. Este capítulo é a planilha, construção por construção, e o que acontece quando uma planilha diz algo que o compilador não consegue declarar exatamente.

Uma planilha

# The shop's rules, as a sheet a person can read aloud.
rules:
  - action: refund_card
    requires: [supervisor_approved]
    when: { amount_over: 200 }
  - action: charge_card
    requires_confirmation: true
  - action: send_receipt
    after: [charge_card]
    at_most: 1

Uma regra por ação. Cada regra nomeia a sua action, uma ferramenta do seu catálogo, e diz uma ou mais destas coisas:

Chave O que diz O Colang a que equivale
requires: [a, b] a ação só roda onde todo contexto nomeado vale um fluxo que nega por padrão para a ação, protegido por $a and $b
when: {amount_over: 200} quando os requisitos se aplicam, como condições sobre os próprios argumentos da chamada: <argumento>_over, _under, _at_least, _at_most ou _is a proteção só vale onde a condição vale; a condição vira um contexto que a verificação de ferramentas calcula a partir dos argumentos da chamada verificada, então o host não pode defini-lo
never: true a ação nunca roda um fluxo que a recusa incondicionalmente
requires_confirmation: true uma pessoa confirma cada chamada fora do rulebook: uma confirmação que o catálogo declara, e que a verificação de ferramentas aplica
confirmation: "…" o mesmo, com as palavras que são perguntadas à pessoa como acima, com o texto
after: [ferramenta] a ação só roda depois de cada ferramenta nomeada, na mesma sessão a regra de ordem do catálogo, aplicada pela verificação de ferramentas
not_after: [ferramenta] a ação nunca roda depois de uma ferramenta nomeada como acima
at_most: 3 a ação roda no máximo esse número de vezes numa sessão como acima

As confirmações e as regras de ordem de uma planilha não estão no rulebook, porque o rulebook decide se uma ação pode acontecer, e elas decidem quando e como. Elas voltam como uma camada sobre o seu catálogo, e a verificação de ferramentas as aplica como qualquer declaração (capítulo 32).

Compilando e salvando

$ stalwart rules compile rules.yaml            # compilada e verificada; nada é guardado
$ stalwart rules compile rules.yaml --save     # registrada no seu catálogo mais recente

O serviço compila a planilha na política Colang a que ela equivale, e o front end Colang por onde passa toda política emite o rulebook a partir dela. Uma planilha e o Colang a que ela equivale são, portanto, um mesmo portão, e todo veredito sobre um é um veredito sobre o outro. --out-dir escreve o que o compilador produziu: rule_sheet.co, o Colang; rulebook.ir.json, o rulebook; e catalogue_overlay.json, as confirmações e a ordem que a planilha define.

--save guarda a planilha e registra uma nova versão do catálogo: as ferramentas do seu catálogo mais recente, com as confirmações e a ordem da planilha por cima, e o rulebook da planilha como as suas regras. Toda verificação de ferramentas a aplica a partir de então. Um rulebook e uma planilha de regras são um único registro num catálogo: um agente que declara um rulebook: Colang o registra de novo na sua próxima inicialização, no lugar de uma planilha salva depois (capítulo 45).

A página Rules do console é um formulário sobre a mesma planilha: ela compila e verifica na própria página, e salva como o --save faz (capítulo 5).

Os avisos

A planilha é conferida contra o seu catálogo mais recente, e cada problema é um aviso, não uma falha:

  • rule_action_unknown: a planilha tem uma regra para uma ação que o catálogo não tem;
  • write_ungoverned: uma escrita que o catálogo tem e que a planilha nunca nomeia, para que uma escrita nova nunca fique sem regra por omissão.

O que todo modo lê

O rulebook em que uma planilha compila é o que a verificação de ferramentas aplica em tempo de execução, o que o stalwart verify e o caçador de bugs varrem, e o que um job guardrail verifica quando você envia o rulebook compilado como rulebook_ir. Cada um responde sobre ele exatamente como sobre um rulebook vindo do Colang.

Recusada, nunca aproximada: rule_sheet_unsupported

Uma planilha que o compilador não consegue declarar exatamente é recusada, nomeando a sua linha e o motivo, e nada é escrito. Os motivos são concretos:

  • uma chave que não é uma das nove acima;
  • uma segunda regra para a mesma ação: como duas regras se combinariam nunca é adivinhado;
  • never com qualquer coisa ao lado: uma ação que nunca roda não tem outra condição;
  • when numa regra que não exige nada: as condições dizem quando os requisitos se aplicam;
  • uma condição sem uma comparação que o compilador consiga declarar, ou um número comparado com algo que não é um número;
  • YAML fora do subconjunto da planilha: tabulações, uma lista em bloco, um valor na linha abaixo da sua chave, um segundo documento.
$ stalwart rules compile unsupported.yaml
unsupported.yaml:4: rule_sheet_unsupported: line 4: `refund_card` has a rule already: one rule per action, so how two would combine is never guessed. The sheet was not compiled; nothing was changed.
$ echo $?
1

Uma planilha é recusada em vez de aproximada porque uma aproximação seria uma regra que você não escreveu, aplicada como se tivesse escrito. O stalwart rules compile sai com 1 numa recusa, 0 numa planilha que compilou, 2 quando o arquivo não pôde ser lido e 3 quando o serviço não pôde ser alcançado. O motivo da recusa é impresso em inglês, como o serviço o escreve.

De uma regra redigida a uma planilha

Uma regra que a Escrita de Guardrails redigiu e verificou é Colang. Quando a sua regra tem uma das formas acima, ela pode ser reescrita como uma planilha que um revisor lê com mais facilidade, e as duas compilam num mesmo portão: compile as duas e compare os rulebooks, ou verifique a mesma obrigação sobre cada uma.

Os limites

  • Uma planilha declara o que as suas construções expressam e nada mais. Uma regra que precisa de uma construção que a planilha não tem é escrita em Colang.
  • Os contextos que uma planilha exige (requires) são definidos pelos seus sistemas em tempo de execução; a planilha prova que a ação espera por eles, não que eles são definidos com verdade.
  • Os avisos são conselhos. Uma planilha com avisos compila mesmo assim; lê-los é como uma escrita nova não fica sem regra.