PRISM
Predictable Reasoning In Steered Models — the engine that separates language from logic.
PRISM is the form-filling and conversation engine at the heart of Booker4j — the engine Blixo runs on. It lets a large language model hold a genuinely natural conversation with your customer while deterministic code owns every decision that matters: what to ask next, what counts as a valid answer, and whether anything is allowed to be submitted.
Reliable AI agents aren't magic. They're engineering — and PRISM is the engineering.
The model interprets what the user means. PRISM decides what happens next. That separation is what keeps the agent fast, predictable, and impossible to knock off-script.
At a glance
| What it is | A deterministic conversation engine for structured, goal-driven flows |
| What it does | Captures, qualifies, books, and submits — through natural conversation |
| What it guarantees | Validated answers, no skipped requirements, no hallucinated commits |
| Who steers | The model speaks; code decides |
| How it feels | Like talking to a helpful human — the engineering is invisible |
Why the name "PRISM"?
A prism takes a single beam of white light and separates it into a clean, ordered spectrum. PRISM does the same to a conversation — it splits apart the two things that should never be tangled together inside an "AI agent":
┌─────────────→ LANGUAGE · the model interprets meaning
conversation ──▶ ◣ PRISM ◢
└─────────────→ LOGIC · code decides what happens
Most agents hand both jobs to one model inside a black box, and hope. PRISM refracts them into two layers with clear responsibilities — and the name carries the meaning:
| Letter | Stands for | Meaning |
|---|---|---|
| P | Predictable | Same inputs, same path — every time |
| R | Reasoning | The model still reasons about language, intent, and nuance |
| I | In | …operating inside a defined structure |
| S | Steered | Guided by deterministic rules, not left to improvise |
| M | Models | Built around language models — used for what they're genuinely good at |
The core idea: language vs. logic
PRISM gives each layer exactly one job, and never lets them trade places.
| The model handles language | PRISM handles logic |
|---|---|
| Understands phrasing, intent, and context | Decides which question is next |
| Asks naturally and conversationally | Validates every answer |
| Handles corrections, digressions, repair | Opens and closes branches |
| Answers questions in the moment | Determines when a flow is complete |
| Phrases the result back to the user | Decides whether a submit is even allowed |
The model proposes. The code disposes. The model can request an action — but it can never decide one. Completion, validation, branching, and submission are all resolved in code, so the outcome never depends on a coin-flip inside the model.
How PRISM walks a form
A flow in PRISM isn't a script and it isn't a free-for-all. It's a directed dependency graph: a set of questions where some questions only become relevant because of earlier answers.
PRISM traverses that graph top-down, resolving the current frontier before it descends. It asks the top-level questions first; only once a branching question is answered does the relevant sub-branch open — and the branches you didn't choose are never entered.
▶ serviceType ? ← top-level frontier, asked first
├─ campusMoveOut → email · moveDate · address
├─ moveOutClean → rooms · preferredDate
└─ windowClean → windowCount · preferredDate
▲ only the chosen branch is ever traversed
Because the dependencies are declared up front, the engine always knows what is still outstanding and what unlocks next. The model is handed that "what's relevant right now" picture and nothing else — so it can ask intelligently, batch related questions, or let the user jump back, without ever having to guess the structure of the form.
- Exclusive branches — choosing an option commits to its sub-tree; sibling branches stay closed.
- Stable progress — progress is measured against the top-level questions, so "step 2 of 4" stays meaningful no matter which branch the user took.
- Deterministic next-step — given the answers so far, the remaining work is computed, never improvised.
Validation that can't be argued with
Every answer is checked against what that field actually expects — and it's checked twice: once in the moment as the conversation happens, and again by the engine before anything is ever stored. Defense in depth, by design.
PRISM ships with a library of automatic validators covering the common shapes of real-world input:
| Category | Examples of what it enforces |
|---|---|
| Presence | A required answer must actually be given |
| Length | Minimum / maximum character bounds |
| Range | Numeric values within allowed minimums and maximums |
| Format | Pattern rules — emails, postal codes, references, IDs |
| Scheduling | Dates far enough in the future, and not too far ahead |
When an answer doesn't pass, PRISM doesn't just reject it and stall — it steers. The model is told why the value didn't qualify and guides the user back, in character, without losing the thread:
"That date's a bit too soon — we need at least 24 hours' notice. Would tomorrow afternoon work instead?"
The constraint is enforced by code; the recovery feels like a helpful human.
Extensible by design
The validator set is not a fixed list. It's an open registry, so new rules slot in cleanly — and we build custom validators for a customer's specific needs (their own ID formats, business rules, eligibility checks). The conversation layer doesn't change; the new rule simply becomes part of what "valid" means for that field.
Guardrails: mandatory means mandatory
This is the part that makes PRISM trustworthy for serious flows.
If a field is marked required, it cannot be skipped — not by the user talking their way around it, and not by the model trying to be accommodating. A customer can ask to skip ahead; the model might even want to oblige. It doesn't matter. The requirement is a code constraint, not a polite suggestion the model is free to reinterpret.
There is no phrasing, no insistence, and no clever prompt that lets a mandatory step be bypassed. The model operates inside the guardrails — it never holds the key to them.
The remarkable part: from the outside, none of this feels rigid. The conversation stays warm and flexible. The rails are invisible — right up until someone tries to cross one.
Optional pre-submission checks
Some flows need a final gate before anything is committed — a stock check, an eligibility rule, a fraud or sanity check, a confirmation against an external system. PRISM supports customer-defined pre-submission checks that run inside the flow, just before commit.
They are opt-in and optional — a flow that doesn't need one doesn't pay for one — and when present they're a first-class part of the path to completion, not a bolt-on. If a check says "not yet," the flow handles it gracefully instead of submitting something invalid.
Confirm, then commit — deterministically
PRISM never commits on a hunch. Completion is detected by code at a single deterministic point: all required answers in, all relevant optional ones addressed. Only then does it move to finish — and how it finishes is a per-customer choice:
| Profile | Behaviour | Best for |
|---|---|---|
| Verified | Show a summary, wait for an explicit "yes," then commit | High-stakes flows — intake, KYC, anything costly to get wrong |
| Express | Commit the moment the flow is complete; the reply is the confirmation | Low-friction flows — quick bookings, casual reservations |
Two properties hold in both cases:
- The summary is deterministic — it's built from the captured answers, so the recap can never be hallucinated or drift from what was actually entered.
- The commit is idempotent — it happens once and exactly once, even under retries or duplicate clicks. No double bookings.
Fast — because it's constrained, not in spite of it
A common assumption is that all this rigor must make the agent slow and robotic. The opposite is true.
Because the model isn't asked to re-derive the form's structure, re-decide what's valid, or remember when to commit on every single turn, it has far less to do — so responses stay quick and the conversation stays light. PRISM does the bookkeeping; the model does the talking.
Your customer just has a natural conversation and gets the thing done. They never see the dependency graph, the validators, the guardrails, or the deterministic commit. That's the point — the engineering disappears into a good experience.
The PRISM guarantee
| Principle | What it means for you |
|---|---|
| 🧭 Deterministic control | The path, the validation, and the commit are decided by code — reproducible, every time |
| 🗣️ Natural conversation | The model is free to be genuinely human within the rails |
| ✅ Validated input | Every answer is checked by type, in the moment and before storage |
| 🚧 Unskippable requirements | Mandatory is mandatory — no prompt or persuasion gets around it |
| 🧩 Extensible rules | New and custom validators slot in without touching the conversation |
| 🛡️ Safe commits | Deterministic summaries, explicit confirmation when it matters, idempotent submission |
| ⚡ Low latency | Constraint reduces the model's load — rigor and speed at once |
PRISM is how Blixo turns a language model into something you can actually depend on: the flexibility of an LLM, with the reliability of deterministic logic — language and logic, cleanly separated, like light through a prism.
Related reading
- How the Form Is Presented to the LLM — the research behind the representation
- Confirmation, Profiles & Agent Architecture — why commit is deterministic and configurable
- References — the annotated bibliography behind these decisions