AI agents are probabilistic. Business decisions must be deterministic. Sertainly gives your agents versioned decision APIs they call via REST or MCP — sub-millisecond decisions, full trace, zero inference at runtime.
No SDK required · Any agent framework · Curl-compatible
LLMs reason probabilistically. When your agent needs to approve, deny, route, or escalate — probabilities aren't good enough. Sertainly is the deterministic layer between your agent and the real world.
Same case + same rules version = identical decision, every single time. No model variability. No prompt drift. No “it said yes yesterday and no today.” Version-pin a decision package and your agent's decision logic is locked until you explicitly promote a new version.
Pin artifacts per environment:expense_policy@2.1.0 in prod, @2.2.0-rc1 in staging.Every decision comes with a trace_id, fired-rule list, computed facts, and citations back to the source document. Debug “why did the agent do that?” with evidence — not by replaying prompts and hoping the model behaves the same way twice.
Sertainly evaluates compiled rules IR — no embedding search, no retrieval, no LLM inference at decision time. Evaluations run in sub-millisecond time, making Sertainly suitable for high-volume, real-time agentic workflows where RAG latency would be a showstopper.
RAG: 500ms–3s per decision. Sertainly: <1ms. At 10,000 decisions/day, that's hours of agent wait time eliminated.Sertainly uses AI once — at compile time — to extract rules and generate the artifact. After that, evaluations are pure computation: no tokens, no inference, no per-decision AI bill. The cost model is flat and predictable.
AI is used once at compile time, not on every runtime evaluation. Cost per decision approaches zero at scale.RAG is powerful for research and guidance. But when your agent needs to make an authoritative decision — approve or deny, route or escalate — you need rules enforced outside the prompt, not inside it.
evidence_needed[] when fields are absent — no hallucinated gap-fillingThe difference isn't just conceptual — it affects latency, cost, determinism, and auditability at runtime.
| Dimension | RAG / Runtime AI | Sertainly |
|---|---|---|
| Determinism | Low–Medium | High |
| Per-decision cost | Scales with tokens + retrieval | Near-zero (compiled IR) |
| Latency | ~500ms–3s (retrieval + inference) | Sub-millisecond evaluation |
| Missing data | Fills gaps — silently, confidently | halts with evidence_needed[] |
| Auditability | Reconstruct from logs | First-class trace + source citations |
| Rules versioning | Implicit (doc change = silent drift) | Semver, pinnable per environment |
| AI at runtime | Every call — retrieval + inference | None — AI used only at compile time |
| Best for | Advice, exploration, guidance | Authoritative enforcement |
The winning pattern: use an LLM for natural language understanding and planning, then call Sertainly for the authoritative decision. LLMs reason; Sertainly decides.
Sertainly makes missing information a first-class outcome. When a require rule's evidence is absent, the engine halts execution and returns halted with an explicit evidence_needed[] array. Your agent loops back, asks the user exactly the right questions, and re-evaluates. No guessing. No hallucinated field values. Guaranteed termination because the schema is finite.
Rules (YAML) — require rule
Agent loop (pseudo-code)
A real agent conversation powered by Sertainly. The agent uses the halted + evidence_needed channel to collect only what's required, then returns a deterministic decision. No hallucinations. No over-asking.

Sertainly exposes four MCP tools: list_policies, get_schema, evaluate_case, and get_trace. Your agent discovers and calls them natively — no custom integration code.

Discover available rules, versions, and effective dates. Agent uses this to select the correct rules to evaluate against.
Input: none · Output: [{package_id, version, effective}]Returns JSON Schema for the case — what fields are required, their types, and allowed enums. Drives the agent's question generation.
Input: package_id, version · Output: JSON SchemaSubmit the case. Returns status (ok / halted / failed / invalid), channel-shaped outputs, and a trace_id. The core decision call.
Input: case, package_id · Output: status, outputs, trace_idRetrieve the full audit trail for any evaluation. Returns the applied rules, computed facts, candidate resolution per channel, and source citations.
Input: trace_id · Output: applied_rules[], facts, trace_detail.candidatesMulti-agent systems need more than routing logic written in LLM prompts — they need routing logic that is versioned, auditable, and identical across every run. The route rule kind emits a destination into outputs.routes[]. Your orchestrator reads that destination and hands the case to the right specialist agent — deterministically, every time.
outputs.routes[] — downstream consumers see every destination that firedsla_hours travels with each route entry for downstream SLA trackingWhen routing is in an LLM prompt, the routing logic changes every time the prompt changes — silently, without a version bump. With ROUTE statements in Sertainly, routing logic is part of the decision package. It's versioned, testable, and replayable. Promoting a new rules version is the only way routing logic changes.
Use for: compliance triage, approval chains, specialist escalation, human-in-the-loop gates.Every routed evaluation carries a trace_id that the receiving agent can pass to get_trace. The specialist agent sees exactly which route rule fired, what data triggered it, and the full case at the moment of handoff — no context reconstruction required.
Every evaluate_case call returns six independent channels plus a derived status. Status is a first-class signal your agent can act on deterministically — not a probability score to interpret, but a structured instruction to follow.
Read outputs.tags, outputs.routes, and outputs.facts to see what the rules emitted. The agent acts on the channel-shaped decision.
The engine cannot proceed without evidence the policy demands. outputs.evidence_needed[] tells the agent exactly what to ask for.
An engine error, FEEL exception, or output-contract violation aborted the run. execution.errors[] carries the cause.
The case object didn't match the package's input schema. case_validity.missing_fields[] and case_validity.errors[] point at the problem.
route rules add destinations into outputs.routes[] alongside any tags. Status stays ok; routes are how the agent hands off downstream.
outputs.routes[] and dispatch to the named specialist or human queue.No SDK required. Sertainly is a REST API — if you can curl, you can integrate. Here's the complete flow from zero to decision.
Don't want to write rules by hand? Upload a source document and let AI extract, compile, and test the decision package for you. You review and approve — then everything below applies.
Create a free account. Copy your API key from Settings → API Keys. No credit card required.
Call list_policies to see what's available. Returns policy IDs, versions, and effective dates.
Before sending a case, get the schema to understand what fields are required. This is what drives agent question generation.
Send the case. You'll get a status, channel-shaped outputs, and a trace ID. If the status is halted, outputs.evidence_needed[] tells you exactly what's missing.
When evidence is missing, Sertainly returns status: "halted" with an outputs.evidence_needed[] array. Loop back, collect the missing data, and re-evaluate.
reason_code so the agent can phrase the question preciselyEvery evaluation produces a trace. Use the trace_id to retrieve the applied rules, computed facts, candidate resolution per channel, and source citations.
Expose list_policies, get_schema, evaluate_case, and get_trace as tools in your MCP server. Your LLM agent can discover and call them natively — no custom orchestration code needed.
Patterns builders are shipping today. Each is enabled by deterministic decisions — not possible with prompt-based guardrails alone.
Agent loops on status: "halted" until all required evidence is present, then gets a final decision. Guaranteed termination. Zero hallucinated field values. Works over multi-turn chat, voice, or async forms.
outputs.evidence_needed[]Agent proposes an action (refund, approval, write operation). Sertainly evaluates before anything is executed. The emitted tag set tells the agent whether to proceed, block, or hand off — not a probabilistic “probably no.”
Key signal:outputs.tags + outputs.reason_codesLow-risk cases (tags: ["compliant"]) proceed autonomously. Medium-risk fires a route rule that drops a human-queue destination into outputs.routes[]. High-risk classify rules emit a non_compliant tag and your orchestrator blocks. One set of rules, three lanes.
route → outputs.routes with to: APPROVAL_QUEUEWrite test cases as JSON. Replay them against new rules versions before promoting to production. Diff channel outputs across versions to catch behavior changes — not in prod, in CI.
Key tool:get_trace · replay token on every decisionDecisions are billed per evaluation. AI features use separate credits. Start free, scale when you need to.
Free
Build and test on shared infrastructure. No credit card required.
10,000 decisions / month
Professional
For teams shipping agentic workloads in production.
250,000 decisions / month
Enterprise
Governance, certified builds, and private runtime for mission-critical agents.
Custom decision volume
Give your agents deterministic guardrails they call as tools. No prompt engineering. No inference at runtime.