Condition Authoring Cookbook
A Simple Vista
Què: Definir condicions que s’avaluen de manera determinista i validen de manera neta Per què: Les condicions connecten portes a evidències; la precisió és important Qui: Desenvolupadors i operadors que redacten escenaris de Decision Gate Requisits previs: evidence_flow_and_execution_model.md
Què és una Condició?
Una condició és una comprovació d’evidència:
{
"condition_id": "tests_ok",
"query": {
"provider_id": "json",
"check_id": "path",
"params": { "file": "report.json", "jsonpath": "$.summary.failed" }
},
"comparator": "equals",
"expected": 0,
"policy_tags": []
}
Consisteix en:
- Consulta: quina evidència recuperar.
- Comparador: com comparar.
- Valor esperat: el valor amb el qual comparar (si és necessari).
Tri-State Outcomes
Els comparadors retornen TriState:
- certament
- fals
- desconegut
Regles clau (exactes):
- Si
EvidenceResult.valueés missing, el resultat ésunknown(excepteexists/not_exists). - Si
expectedés inexistent, el resultat ésunknown(excepteexists/not_exists). equals/not_equalsretorna false/true en cas de discrepància de tipus.- Ordering, lexicographic, contains, in_set, deep_* retorna
unknownen cas de desajustament de tipus.
Referència del Comparator
Regles Generals
exists/not_existscomprova la presència d’EvidenceResult.value, nonullde JSON.- JSON
nullés un valor present (per tant,existsretorna true).
Taula de Comparació
| Comparator | Tipus d’Evidència | Requerit Esperat | Comportament de Desajustament de Tipus |
|---|---|---|---|
equals | qualsevol valor JSON, bytes | sí | retorna false |
not_equals | qualsevol valor JSON, bytes | sí | retorna true |
greater_than / >= / < / <= | número o cadena de data/hora RFC3339 | sí | unknown |
lex_* | cadena | sí | unknown |
contains | cadena o array | sí | unknown |
in_set | JSON escalar | sí (array) | unknown |
deep_equals / deep_not_equals | objecte o array | sí | unknown |
exists / not_exists | qualsevol | no | n/a |
Detalls
Igualtat (equals, not_equals)
- Els números es comparen mitjançant igualtat conscient dels decimals (
10==10.0). - Per a tipus no numèrics, s’utilitza la igualtat JSON.
Ordenació (greater_than, etc.)
- Accepta números o cadenes de data/hora RFC3339 (incloent només la data
YYYY-MM-DD). - Altres tipus ->
unknown.
Lexicogràfic (lex_*)
- Cadenes només; compara punts de codi Unicode.
- Requereix configuració explícita + opt-in de l’esquema (vegeu “Validació Estricte”).
Conté
- Cadena: coincidència de subcadena.
- Array: l’array d’evidències ha de contenir tots els elements de l’array esperat.
En conjunt (in_set)
- S’espera que sigui un array.
- L’evidència ha de ser escalar (no array/objecte).
Iguals Profunds
- Objectes/arrays només; tipus no coincidents ->
unknown. - Requereix configuració explícita + opt-in de l’esquema.
Bytes
- Només
equals/not_equalsestan definits. - S’espera que sigui un array JSON d’enters
0..255.
Validació Estricta (Activat per Defecte)
La Decision Gate valida les condicions en el moment de scenario_define:
- Per a les condicions basades en proveïdors, el contracte del proveïdor defineix els comparadors i tipus de resultat permesos.
- Per a la prevalidació, l’esquema de forma de dades defineix els comparadors i tipus permesos.
Els comparadors especials requereixen ambdós:
- Configura les banderes (
validation.enable_lexicographic/validation.enable_deep_equals), i - Opt-in explícit del esquema a través de
x-decision-gate.allowed_comparators(precheck) o contracteallowed_comparators.
Si la validació falla, scenario_define o precheck es rebutgen.
Proveïdor de Patrons
proveïdor de temps
- Comprovacions:
ara,després,abans. after/beforeaccepttimestampcom unix millis o cadena RFC3339.afterés estrictament major que;beforeés estrictament menor que.
proveïdor env
- Comprovar:
get. - La clau que falta retorna
value = Nonesense error. - Les claus bloquejades o invàlides retornen un error del proveïdor (
provider_errora la frontera de l’eina).
proveïdor json
- Comprovar:
path. - JSONPath no-match retorna
error.code = "jsonpath_not_found"ivalue = None.
Proveïdor http
- Comprovacions:
status,body_hash. statusretorna un estat HTTP enter.body_hashretorna un objecte HashDigest{ algorithm, value }.body_hashnomés permetexists/not_exists(per contracte).
Evitant desconegut
Per minimitzar els resultats unknown:
- Proporcioneu
expectedper a tots els comparadors excepteexists/not_exists. - Coincidència de tipus exactament per a comparadors de no igualtat.
- Utilitzeu contractes de proveïdor per confirmar els comparadors permesos.
Divulgació de proves
Els valors d’evidència no es retornen per defecte per scenario_next. Utilitzeu feedback: "evidence" si està permès, o inspeccioneu l’evidència a través de:
- Utilitzeu
evidence_query(subjecte a la política de divulgació), o - Exporta un runpack amb runpack_export.
La política de divulgació està configurada a decision-gate.toml:
[evidence]
allow_raw_values = false
require_provider_opt_in = true
[[providers]]
name = "json"
type = "builtin"
allow_raw = true
allow_raw és un config flag per proveïdor (no forma part del contracte del proveïdor). Els noms dels proveïdors són únics; els identificadors integrats (time, env, json, http) estan reservats.
Checklist
- Els IDs de condició són únics dins del escenari.
- El nom de la comprovació del proveïdor coincideix amb el contracte del proveïdor.
- El comparador està permès per a l’esquema de resultats.
- El tipus de valor esperat coincideix amb el tipus d’evidència.
-
policy_tagspresent (required by schema, may be empty).