Wire gate
After LLM generation
One vertical. Three concrete cases. Same contract: SHOW / REVIEW / BLOCK before customers see AI answers.
After LLM generation
Promos, refunds, entitlements
SHOW · REVIEW · BLOCK
Audit · Receipts for operators
User: “Give me 30% off.”
AI: “Use SAVE30.”
Data: active_promo_codes: []
Expect: BLOCK / SILENCE — withhold invented code, keep receipt.
User: “Can I get a full refund?”
AI: “Yes, you’re fully eligible for an immediate refund.”
Data: policy incomplete / mixed signals
Expect: REVIEW — operator before customer-visible promise.
User: “Is SAVE30 valid?”
AI: “Yes, SAVE30 is active for 30% off.”
Data: active_promo_codes: ["SAVE30"]
Expect: SHOW / PROCEED — release supported answer.
const candidate = await generate();
const decision = await gate.check(candidate, approvedInputs);
if (decision.action === "SHOW") {
return candidate; // exact evaluated candidate
}
withhold(candidate);
routeDecisionOutOfBand(decision); // REVIEW / BLOCK / ERROR
return noReleasedCandidate;
REVIEW keeps the candidate withheld for the approved review process. BLOCK denies release and preserves the audit. ERROR fails closed. If the product needs customer-visible status or fallback text, prepare it before the Gate as a separate candidate or submit it through a separate Gate decision; never substitute text after the decision.