A model can emit a wrong payment screen for reasons you can't prevent, an injection, a poisoned tool result, or a plain hallucination. This isn't about stopping the attack; it's about not trusting the output. Below, the same agent emitted surface renders two ways: a naive generative UI renders whatever it's given, Catalystic UI verifies it first and rejects any tampered or invented confirmation before it reaches the user.
It doesn't matter whether the bad surface came from an injection, a poisoned tool, or a plain hallucination. Consequential components are a strict, closed contract: a tampered or invented confirm can't validate against it, and a consequential failure is rejected, never repaired. Enforced on every render, by construction, not by luck.
"ConfirmSheet": {
"x-consequential": true, // this component is enforced, not repaired
"properties": {
"component": { "const": "ConfirmSheet" },
"kind": { "enum": ["payment", "transfer", "generic"] },
"currency": { "enum": ["GBP", "USD", "EUR"] }, // "BTC" can't pass
"confirmLabel": { "type": "string" }
},
"required": ["confirmLabel"], // the confirm action can't be stripped
"unevaluatedProperties": false // no injected props (e.g. "autoApprove")
}
// runtime failure policy
consequential + invalid → REJECT // never coerce, never render
nonconsequential + bad → repair // tolerance is fine here