Flujo de Evidencia + Modelo de Ejecución
A primera vista
Qué: Cómo Decision Gate evalúa la evidencia y produce decisiones Por qué: Entender exactamente qué se obtiene, valida y compara Quién: Desarrolladores, equipos de seguridad y arquitectos que integran Decision Gate Requisitos previos: getting_started.md
Una frase que debes recordar
Decision Gate evalúa la evidencia; no ejecuta tareas.
Flujo de Datos Principal
Trigger (scenario_next / scenario_trigger / precheck)
|
+-> Collect or accept evidence
| - Live run: call providers
| - Precheck: accept asserted payload
|
+-> Trust enforcement
| - Trust lane minimum (min_lane)
| - Signature policy (if required)
| - Anchor validation (if configured)
|
+-> Comparator evaluation -> TriState
+-> RET evaluation -> Gate outcomes
|
+-> Decision
- Live run: state mutation + runpack storage
- Precheck: no state mutation
Fuentes de Evidencia
1) Proveedores (Ejecutar en Vivo)
Los proveedores obtienen o calculan evidencia y devuelven un EvidenceResult.
Proveedores integrados: time, env, json, http
Proveedores externos: servidores MCP llamados a través de tools/call con evidence_query.
2) Evidencia Afirmada (Prechequeo)
Precheck no llama a los proveedores. El cliente proporciona una carga útil que es:
- Validado contra una forma de datos registrada (JSON Schema).
- Convertido en valores
EvidenceResultafirmados.
El mapeo de carga útil es exacto:
- Si el payload es un objeto: las claves son IDs de condición.
- Si el payload no es un objeto: solo se acepta cuando el escenario tiene exactamente una condición.
Cumplimiento de Confianza
Lanes de Confianza
Verificado: evidencia devuelta por los proveedores.Afirmado: evidencia suministrada a través de la carga de prechequeo.
Carril Mínimo (min_lane)
Configurado en decision-gate.toml:
[trust]
min_lane = "verified" # or "asserted"
Cuando min_lane = "verified", la evidencia afirmada es rechazada (la condición se convierte en unknown).
Dev-permissive: min_lane se convierte en asserted automáticamente, excepto para los proveedores listados en dev.permissive_exempt_providers (esos permanecen estrictos).
Anulaciones por Condición y por Puerta
Puedes aumentar el carril mínimo en la especificación del escenario:
{
"condition_id": "tests_ok",
"trust": { "min_lane": "verified" }
}
El trust a nivel de puerta también puede aumentar los requisitos. El requisito efectivo es el más estricto de la base y las sobrecargas.
Verificación de Firma
Configurado a través de trust.default_policy:
[trust]
# Audit mode accepts unsigned evidence.
default_policy = "audit"
# Require signatures from key files:
# default_policy = { require_signature = { keys = ["/etc/decision-gate/keys/provider.pub"] } }
Cuando require_signature está activo:
EvidenceResult.signature.schemedebe ser"ed25519".signature.key_iddebe coincidir con una entrada de clave configurada.- La firma se verifica sobre JSON canónico de
evidence_hash.
Si evidence_hash falta, Decision Gate lo calcula a partir del valor de evidencia. Si evidence_hash está presente, debe coincidir con el hash canónico del valor de evidencia o la respuesta del proveedor será rechazada.
Validación de Anclaje
Los anclajes se aplican a través de la configuración (no la especificación del escenario):
[anchors]
[[anchors.providers]]
provider_id = "json"
anchor_type = "file_path_rooted"
required_fields = ["root_id", "path"]
EvidenceResult.evidence_anchor.anchor_value debe ser una cadena que contenga JSON canónico que se analice como un objeto. Los campos requeridos deben existir y deben ser escalares (cadena/número). Las violaciones producen error.code = "anchor_invalid" y la condición se convierte en unknown. Para file_path_rooted, path es relativo a la raíz del proveedor configurado.
Evaluación del Comparador
Los comparadores producen resultados TriState:
- verdadero
- falso
- desconocido
Comportamientos exactos importantes (ver condition_authoring.md):
equals/not_equalsdevuelve false/true en caso de desajuste de tipo (nounknown).- Los comparadores de orden (
greater_than, etc.) devuelvenunknowna menos que ambos lados sean números o cadenas de fecha/hora RFC3339. exists/not_existsprueba presencia deEvidenceResult.value; JSONnullaún cuenta comoexists.
Flujo de Ejecución en Vivo (scenario_next)
- Existe una ejecución (
scenario_start). scenario_nextse llama conrun_id,tenant_id,namespace_id,trigger_id,agent_idytime.- Decision Gate llama a los proveedores para cada condición.
- Se aplican los requisitos de confianza.
- Los comparadores y RET producen resultados de puerta.
- Se devuelve un
DecisionRecordy se actualiza el estado de ejecución.
Salida: NextResult { decision, packets, status } (sin valores de evidencia).
Para inspeccionar evidencia y detalles de la puerta, utiliza runpack_export.
Flujo de Preverificación (precheck)
- El cliente llama a
schemas_registerpara registrar una forma de datos. - Client calls
precheckwith:- tenant_id, namespace_id
scenario_ido inlinespecdata_shape(id de esquema + versión)- carga útil
- La carga útil se valida contra el esquema.
- La carga útil se convierte en evidencia afirmada.
- Las puertas se evalúan sin mutar el estado de ejecución.
Salida: PrecheckToolResponse { decision, gate_evaluations }.
gate_evaluations incluye solo el estado de la puerta y el rastro de condiciones (sin valores de evidencia).
Audit Submissions (scenario_submit)
scenario_submit añade un registro de envío al estado de ejecución sin afectar la evaluación de la puerta. Cada envío almacena un hash de contenido y metadatos para auditoría.
Interacción con el Proveedor (MCP Externo)
Decision Gate llama a proveedores externos de MCP con tools/call y una única herramienta: evidence_query. No depende de tools/list en tiempo de ejecución; las capacidades del proveedor se cargan desde capabilities_path en la configuración.
Conceptos Erróneos Comunes (Corregidos)
- “DG ejecuta las herramientas.” -> Falso. DG evalúa la evidencia; las herramientas se ejecutan en otro lugar.
- “Precheck devuelve errores de evidencia.” -> Falso. Solo devuelve
decision+gate_evaluations. - “scenario_next response includes evidence.” -> Falso por defecto. Las solicitudes solo locales tienen como valor predeterminado la retroalimentación
trace, pero los valores de evidencia aún requierenfeedback: "evidence"(si está permitido) orunpack_export/evidence_query. - “La política de anclaje está en el escenario.” -> Falso. Está configurada bajo
[anchors].
Glosario
EvidenceQuery: { provider_id, check_id, params }. EvidenceResult: { value, lane, error, evidence_hash, evidence_ref, evidence_anchor, signature, content_type }. Trust Lane: verified o asserted. Runpack: Paquete de artefactos de auditoría escrito para ejecuciones en vivo.