Comparator Validation Architecture Reference
Overview
Decision Gate enforces comparator correctness in three layers:
- Typed import-time synthesis for OpenAPI typed providers derives
allowed_comparatorsfrom normalized result schemas using the strict type-class matrix and canonical comparator ordering. F:crates/decision-gate-typed/src/openapi/check_synthesis.rs L34-L109 F:crates/decision-gate-typed/src/openapi/comparator_derivation.rs L52-L134 - Authoring-time strict validation (default-on) in the MCP layer rejects invalid comparator/type combinations before a scenario or precheck runs. F:crates/decision-gate-mcp/src/validation.rs L36-L673 F:crates/decision-gate-mcp/src/tools/router.rs L3173-L3241 F:crates/decision-gate-mcp/src/tools/router.rs L3808-L3887
- Runtime comparator evaluation in the core returns tri-state results and
yields
Unknownwhen evidence types do not match expectations. F:crates/decision-gate-core/src/runtime/comparator.rs L39-L259
The strict validator is the gatekeeper; runtime logic is the last line of fail-closed behavior. F:crates/decision-gate-mcp/src/validation.rs L36-L170 F:crates/decision-gate-core/src/runtime/comparator.rs L39-L197
Source of Truth Map
Validation Pipeline (MCP)
Scenario definition (scenario_define)
- MCP validates provider contracts and check schemas. F:crates/decision-gate-mcp/src/tools/router.rs L3216-L3220
- Strict validation enforces comparator/type compatibility and expected-value shape. F:crates/decision-gate-mcp/src/tools/router.rs L3216-L3220
- Implementation:
ToolRouter::define_scenario. F:crates/decision-gate-mcp/src/tools/router.rs L3173-L3241
Precheck (precheck tool)
- MCP validates payload against the registered data shape schema. F:crates/decision-gate-mcp/src/tools/router.rs L3848-L3858
- Strict validation enforces condition compatibility against the data shape schema. F:crates/decision-gate-mcp/src/tools/router.rs L3868-L3870
- Implementation:
ToolRouter::precheck. F:crates/decision-gate-mcp/src/tools/router.rs L3808-L3887
Strict Validation Rules (Implementation Summary)
Type-class compatibility
- Implemented in
crates/decision-gate-mcp/src/validation.rs. F:crates/decision-gate-mcp/src/validation.rs L234-L535 schema_type_classesand helpers derive type classes. F:crates/decision-gate-mcp/src/validation.rs L400-L535comparator_allowancesdefines allowed/opt-in/forbidden combinations. F:crates/decision-gate-mcp/src/validation.rs L234-L398validate_expected_valueensures expected-value shapes match schema. F:crates/decision-gate-mcp/src/validation.rs L587-L673
Optional comparator families
- Lexicographic ordering comparators are opt-in (config flag + schema override). F:crates/decision-gate-mcp/src/validation.rs L329-L340 F:crates/decision-gate-mcp/src/validation.rs L558-L585 F:crates/decision-gate-mcp/src/validation.rs L829-L838 F:crates/decision-gate-config/src/config.rs L1472-L1487
- Deep equality comparators are opt-in (config flag + schema override). F:crates/decision-gate-mcp/src/validation.rs L350-L365 F:crates/decision-gate-mcp/src/validation.rs L558-L585 F:crates/decision-gate-mcp/src/validation.rs L829-L838 F:crates/decision-gate-config/src/config.rs L1472-L1487
Domain overrides
x-decision-gate.allowed_comparatorsrestricts allowed comparators to a subset of the type-class matrix. F:crates/decision-gate-mcp/src/validation.rs L537-L585x-decision-gate.dynamic_type = truetreats the schema as dynamic (no declared type) and allows comparator validation to proceed without a type restriction, subject to config toggles. F:crates/decision-gate-mcp/src/validation.rs L400-L414
Union handling
oneOf/anyOf/multi-type unions intersect allowances across variants. F:crates/decision-gate-mcp/src/validation.rs L234-L270 F:crates/decision-gate-mcp/src/validation.rs L675-L701- Nullable unions allow null without expanding comparator set. F:crates/decision-gate-mcp/src/validation.rs L703-L755
Runtime Comparator Semantics (Core)
- Numeric comparisons are decimal-aware (no float rounding). F:crates/decision-gate-core/src/runtime/comparator.rs L148-L277
- RFC 3339
date/date-timeordering is supported for string values. F:crates/decision-gate-core/src/runtime/comparator.rs L168-L295 - Unsupported comparisons yield
TriState::Unknown. F:crates/decision-gate-core/src/runtime/comparator.rs L65-L198 in_setonly applies to scalar evidence values; arrays/objects yieldUnknown. F:crates/decision-gate-core/src/runtime/comparator.rs L250-L258- Implementation:
crates/decision-gate-core/src/runtime/comparator.rs. F:crates/decision-gate-core/src/runtime/comparator.rs L39-L308
Configuration Surface
- Strict validation is default-on. Disabling strict requires
validation.allow_permissive = true. F:crates/decision-gate-config/src/config.rs L1472-L1511 - Optional comparator families are gated by config toggles. F:crates/decision-gate-config/src/config.rs L1472-L1487
- Implementation:
crates/decision-gate-config/src/config.rs(ValidationConfig). F:crates/decision-gate-config/src/config.rs L1469-L1521
Contract + Docs Alignment
- Comparator schema and annotations are in
crates/decision-gate-contract/src/schemas.rs. F:crates/decision-gate-contract/src/schemas.rs L1105-L1129 - Public tooltips and guidance are in
crates/decision-gate-contract/src/tooltips.rs. F:crates/decision-gate-contract/src/tooltips.rs L260-L296 - Regenerate contract artifacts after any validation or comparator changes:
Docs/generated/decision-gate/. F:Docs/generated/decision-gate/tooling.md L1-L42 F:Docs/generated/decision-gate/tooltips.json L1-L80
Change Checklist
- Update comparator semantics in
crates/decision-gate-core/src/runtime/comparator.rs. F:crates/decision-gate-core/src/runtime/comparator.rs L39-L308 - Update strict validation logic in
crates/decision-gate-mcp/src/validation.rs. F:crates/decision-gate-mcp/src/validation.rs L36-L673 - Update config toggles in
crates/decision-gate-config/src/config.rsif needed. F:crates/decision-gate-config/src/config.rs L1469-L1521 - Align schemas/tooltips in
crates/decision-gate-contract/src/schemas.rsandcrates/decision-gate-contract/src/tooltips.rs. F:crates/decision-gate-contract/src/schemas.rs L1105-L1129 F:crates/decision-gate-contract/src/tooltips.rs L260-L296 - Regenerate
Docs/generated/decision-gate/artifacts. F:Docs/generated/decision-gate/tooling.md L1-L42 - Update unit + system tests. F:crates/decision-gate-mcp/tests/validation.rs L1-L220 F:system-tests/tests/suites/validation.rs L1-L220