Why bounded semantic decisions may become an important layer in agentic AI architecture.
๐๐ฒ๐, ๐๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฆ๐๐ฎ๐๐ฒ, and Why I Think of It as ๐๐ผ๐บ๐ฒ ๐๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐ vs. a ๐๐น๐ฎ๐๐ฑ๐ฒ ๐๐๐ณ๐ณ๐ฒ๐
For the last few years, our default AI architecture has been surprisingly simple:
Have a problem? Send it to an LLM.
Need to classify something? LLM.
Need to choose a tool? LLM.
Need to decide whether an agent should retry? LLM.
Need to determine whether a document contains enough evidence? LLM.
Need to choose one option from three possibilities? Again, LLM.
General-purpose models such as Claude are extremely capable, but while experimenting with TypeSafe AI's ๐๐ฒ๐, I started asking a different architectural question:
Why hire a chef when all I need is someone to pick the right item from an already-defined menu?
That is where my ๐๐ผ๐บ๐ฒ ๐๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐ vs. ๐๐๐ณ๐ณ๐ฒ๐ analogy came from.
But before getting to the analogy, it is important to understand what Jev actually is.
What Is ๐๐ฒ๐?
Jev is TypeSafe AI's first public ๐ฆ๐๐๐๐ฒ๐บ ๐ข๐ป๐ฒ ๐ ๐ผ๐ฑ๐ฒ๐น. Unlike a general-purpose LLM whose primary interface is generated text, Jev is designed for decisions inside software.
The basic idea is remarkably simple:
๐๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฆ๐๐ฎ๐๐ฒ โ ๐ง๐๐ฝ๐ฒ๐ฑ ๐ค๐๐ฒ๐๐๐ถ๐ผ๐ป๐ โ ๐ฃ๐ฟ๐ผ๐ฏ๐ฎ๐ฏ๐ถ๐น๐ถ๐๐๐ถ๐ฐ ๐๐ฒ๐ฐ๐ถ๐๐ถ๐ผ๐ป๐
TypeSafe describes the model as taking program state and returning typed decisions that software can consume directly. The possible outputs are defined ahead of time instead of allowing the model to generate an arbitrary string.
That difference is important.
With Claude, I might ask:
Analyze this candidate's experience and explain whether this person would be appropriate for an enterprise AI architecture role.
The output could be several paragraphs.
With Jev, I can instead define a bounded question:
Which role best matches this state?
A. Traditional Backend Developer
B. Generative and Agentic AI Architect
C. Database Administrator
D. Manual Test Engineer
Now I am not asking the model to generate language.
I am asking it to make a decision within a vocabulary that my application already controls.
That is why, as my own mental model, I think of Jev as:
โ๐๐๐๐ ๐๐ป๐ฟ๐ถ๐ฐ๐ต๐ฒ๐ฑ ๐ฉ๐ผ๐ฐ๐ฎ๐ฏ๐๐น๐ฎ๐ฟ๐โ โ not the official expansion of Jev, but a useful way for me to remember what the architecture is doing.
The vocabulary belongs to my application.
Jev adds semantic judgment around it.
๐๐ฒ๐ Starts With the ๐ฆ๐๐ฎ๐๐ฒ of the Application
This is the part I find most interesting.
Instead of beginning with a chat prompt such as:
โYou are an expert AI architect. Analyze the following informationโฆโ
I start by defining the ๐ฆ๐๐ฎ๐๐ฒ that exists right now.
For example:
{
"name": "Sreeni Ramadurai",
"myboss": "Krishna K",
"skills": "GenAI, AgenticAI, AWS, Azure"
}
This is not really a prompt in the traditional chatbot sense.
It is a snapshot of what the application currently knows.
The state might contain a customer message, an account status, a transaction, retrieved documents, an agent trace, tool results, user permissions, workflow history, or any other information required to make the next decision.
TypeSafe's own description emphasizes this distinction: Jev inputs are oriented around structured program state, while conventional LLM interfaces tend to be organized around sequential conversational messages.
That gives me a useful mental model:
State is not what I want the model to say. State is what the system currently knows.
Then I separately define what I want the system to decide.
๐ฆ๐๐ฎ๐๐ฒ First, ๐ค๐๐ฒ๐๐๐ถ๐ผ๐ป๐ Second
Using the small state above, I experimented with questions such as:
Is there sufficient evidence of architecture readiness?
Which enterprise AI role best matches the available evidence?
How strong is the evidence?
Does this state support a production deployment claim?
Does this state establish that Krishna K is Sreeni's manager?
Which conclusion would require information that is not present?
Notice the architecture.
I am not putting everything into one large prompt and asking:
โThink about all of this and tell me what you think.โ
Instead, the application provides one state and several independent decision questions.
That is very close to normal software engineering.
We define the data.
We define the contract.
We define the permitted outputs.
Then intelligence evaluates the state against those contracts.
Three Kinds of Decisions
In the current Jev interface, these bounded judgments are expressed through typed question forms such as ๐ก๐ผ๐๐น, ๐๐ต๐ผ๐ถ๐ฐ๐ฒ, and ๐ฆ๐ฐ๐ผ๐ฟ๐ฒ. TypeSafe's public materials describe Jev broadly as returning typed decisions with probabilities and confidence values rather than open-ended generated text.
For example, a binary judgment might ask whether the state contains enough evidence for a particular claim.
A ๐๐ต๐ผ๐ถ๐ฐ๐ฒ might ask:
Traditional Backend Developer
Generative and Agentic AI Architect
Database Administrator
Manual Test Engineer
A ๐ฆ๐ฐ๐ผ๐ฟ๐ฒ might ask how strongly the available evidence supports enterprise AI capability on a predefined scale.
The important point is not the names of these primitives.
The important point is that the shape of the answer exists before inference begins.
The application owns the decision boundary.
The model judges what belongs inside it.
Jev Playground with my own State
Now the Restaurant Analogy Becomes Clear
Imagine opening a food-delivery application.
The restaurant has only three dishes available:
Pizza
Burger
Biryani
Then I provide some state:
Vegetarian
Likes spicy food
Wants something filling
The menu has already been established.
Jev does not need to invent another meal.
It does not need to write a recipe.
It does not need to explain the history of biryani.
Its job is simply to evaluate the state against the known choices.
The result might look conceptually like:
Biryani 82%
Pizza 14%
Burger 4%
This is why I call Jev ๐ถ๐ป๐๐ฒ๐น๐น๐ถ๐ด๐ฒ๐ป๐ ๐ต๐ผ๐บ๐ฒ ๐ฑ๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐.
The intelligence is real, because choosing correctly may require semantic understanding.
But the destination is bounded.
๐๐ผ๐บ๐ฒ ๐๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐ = ๐ธ๐ป๐ผ๐๐ป ๐บ๐ฒ๐ป๐ + ๐ฐ๐ผ๐ป๐๐ฒ๐ ๐ + ๐ท๐๐ฑ๐ด๐บ๐ฒ๐ป๐.
๐๐น๐ฎ๐๐ฑ๐ฒ Is the ๐๐๐ณ๐ณ๐ฒ๐
Now imagine walking into a buffet.
I can ask:
What should I eat?
Build me a vegetarian dinner.
Compare these dishes.
Explain why one is healthier.
Suggest something I haven't considered.
Create a completely different meal.
Plan my meals for the entire week.
Now I am no longer choosing from one narrowly defined application vocabulary.
I want exploration.
I want synthesis.
I want explanation.
I may not even know the answer space before I start asking questions.
That is where a general-purpose model such as Claude becomes valuable.
So in my architecture analogy:
๐๐ฒ๐ is ๐๐ผ๐บ๐ฒ ๐๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐. ๐๐น๐ฎ๐๐ฑ๐ฒ is the ๐๐๐ณ๐ณ๐ฒ๐.
Home delivery does not mean unintelligent.
And buffet does not mean better.
They solve different problems.
But Before Jev, There Is Still ๐๐ผ๐ฑ๐ฒ
There is an even simpler layer.
Suppose my application already has this business rule:
IF vegetarian
remove all meat dishes
I do not need Jev.
And I certainly do not need Claude.
The business has already determined exactly what should happen.
Use code.
That gives me three architectural layers:
CODE
Explicit rule is already known
โ
JEV
Options are known,
but choosing requires semantic judgment
โ
CLAUDE
Answer space is open,
requiring reasoning, synthesis or generation
Or, using my restaurant analogy:
CODE
"The restaurant rule already decides."
โ
JEV โ HOME DELIVERY
"The menu is fixed.
Choose the best item for this context."
โ
CLAUDE โ BUFFET
"Explore, compare, combine,
explain and create."
That distinction is much more useful to me than asking which model is โsmarter.โ
Where Jev Gets Really Interesting: ๐๐ด๐ฒ๐ป๐๐ถ๐ฐ ๐๐
Now move away from restaurants and consider an enterprise agent.
During one workflow, an agent may need to decide:
Which tool should I call?
Is this retrieved document relevant?
Did the tool actually satisfy the task?
Should I retry?
Should I continue?
Should I escalate to a human?
Is this transaction low, medium or high risk?
Does the evidence support this claim?
Many of these are semantic decisions.
They cannot always be expressed as simple if/else statements.
But they also do not necessarily need paragraphs of generated reasoning.
Their answer spaces often look like this:
Tool
Salesforce | ServiceNow | SharePoint | None
Action
Continue | Retry | Escalate
Risk
Low | Medium | High
Evidence
Supported | Partial | Unsupported
This is where I see Jev fitting naturally inside an ๐๐ด๐ฒ๐ป๐ ๐๐ฎ๐ฟ๐ป๐ฒ๐๐.
AGENT HARNESS
โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ โ โ
CODE JEV CLAUDE
โ โ โ
Rules Semantic Reasoning
Judgment Generation
โ โ โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ
TOOLS
โ
ACTION
Code controls deterministic behavior.
Jev makes bounded semantic judgments.
Claude handles the parts where broader reasoning or generation is actually necessary.
That architecture interests me much more than simply routing everything through one giant model.
Is Jev's โ๐๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฆ๐๐ฎ๐๐ฒโ Related to ๐๐๐ง๐๐ข๐๐ฆ?
When I started thinking about Jev in terms of application state, another architecture immediately came to mind:
๐๐๐ง๐๐ข๐๐ฆ โ Hypermedia as the Engine of Application State.
There is definitely a conceptual connection, but they are not the same thing.
In REST, HATEOAS means the server representation provides hypermedia controls that tell the client what resources or transitions are available next. Rather than hard-coding every possible navigation path, the client can discover permitted next actions from the representation it receives. This is part of the REST architectural style described by Roy Fielding.
For example, an order might be represented as:
{
"orderId": 1001,
"status": "pending",
"links": [
{
"rel": "cancel",
"href": "/orders/1001/cancel"
},
{
"rel": "pay",
"href": "/orders/1001/payment"
}
]
}
The current state determines which transitions are available.
That sounds somewhat similar to what we are doing with Jevโbut there is an important difference.
๐๐๐ง๐๐ข๐๐ฆ exposes the allowed next actions.
๐๐ฒ๐ can semantically judge which allowed action best fits the current context.
That leads to an architecture I find fascinating.
Imagine the application state says:
{
"orderStatus": "pending",
"customerMessage": "I accidentally placed this order twice.",
"paymentCaptured": false,
"availableActions": [
"cancel",
"continue",
"escalate"
]
}
HATEOAS could tell the application:
These are the actions currently available.
Jev could then answer:
Given the complete state,
which available action best fits the situation?
cancel 94%
escalate 5%
continue 1%
Then deterministic code executes the selected transition subject to whatever confidence threshold, permissions, policy checks, and guardrails the application requires.
So I would summarize the relationship this way:
๐๐๐ง๐๐ข๐๐ฆ tells the client what it may do next.
๐๐ฒ๐ can help the application judge which permitted action makes sense next.
That is not part of the formal definition of HATEOAS, nor is Jev an implementation of HATEOAS.
It is simply a useful architectural connection.
HATEOAS gives us state-driven discoverability.
Jev gives us state-driven semantic judgment.
Put together, they suggest an interesting pattern for intelligent APIs and agents.
๐ฆ๐๐ฎ๐๐ฒ โ ๐ฃ๐ผ๐๐๐ถ๐ฏ๐ถ๐น๐ถ๐๐ถ๐ฒ๐ โ ๐๐๐ฑ๐ด๐บ๐ฒ๐ป๐ โ ๐๐ฐ๐๐ถ๐ผ๐ป
This may actually be the most useful way for me to think about Jev.
Not:
Prompt โ LLM โ Text
But:
CURRENT STATE
โ
AVAILABLE DECISIONS
โ
SEMANTIC JUDGMENT
โ
PROBABILITY / CONFIDENCE
โ
BUSINESS RULES + GUARDRAILS
โ
ACTION
โ
NEW STATE
And then the cycle repeats.
Stateโ
โ
Decision
โ
Action
โ
Stateโ
โ
Decision
โ
Action
โ
Stateโ
Now Jev starts looking less like a chatbot and more like an intelligence primitive inside a stateful software system.
That is the part I find most compelling.
Why Not Just Give Claude Structured Output?
This is the obvious question.
Claude can absolutely be given:
Choose exactly one:
cancel
continue
escalate
It can return JSON.
It can use tool calling.
It can conform to a schema.
So the question is not:
Can Claude make bounded decisions?
Of course it can.
The architecture question is:
If my application needs thousands of small semantic judgments whose output spaces are already known, should every one of them go through a general-purpose text-generation architecture?
Jev was explicitly designed around this narrower machine-facing task. TypeSafe describes it as optimizing for structured, calibrated decisions rather than free-form strings.
This becomes especially interesting inside agentic systems where a single user request may cause many internal decisions.
One model call may be insignificant.
Thousands of decisions across many agents, tools, users, and workflow steps are a different architectural problem.
๐๐ผ๐๐ป๐ฑ๐ฒ๐ฑ Does Not Mean ๐๐ผ๐ฟ๐ฟ๐ฒ๐ฐ๐
There is one distinction I think is essential.
Suppose Jev produces:
Biryani 82%
That does not make Biryani objectively correct.
Likewise:
{
"risk": "high"
}
being perfectly valid structured output does not prove that the risk assessment itself is correct.
๐ง๐๐ฝ๐ฒ ๐๐ฎ๐ณ๐ฒ๐๐ โ ๐ฆ๐ฒ๐บ๐ฎ๐ป๐๐ถ๐ฐ ๐ฐ๐ผ๐ฟ๐ฟ๐ฒ๐ฐ๐๐ป๐ฒ๐๐.
So we still need evaluations, thresholds, observability, guardrails, and human review where the consequence demands it.
The difference is that the decision surface is constrained and machine-consumable.
That can make the surrounding system easier to reason about.
How I Would Use Jev in an Enterprise Application
My pattern would be simple:
1. Build the application state
โ
2. Define the decisions the application actually needs
โ
3. Express those decisions as bounded typed questions
โ
4. Let Jev evaluate the state
โ
5. Read probabilities/confidence
โ
6. Apply deterministic thresholds and policies in code
โ
7. Execute a tool, ask Claude for deeper reasoning,
or escalate to a human
โ
8. Update the application state
โ
9. Repeat
The model should not own the entire workflow.
๐ง๐ต๐ฒ ๐ต๐ฎ๐ฟ๐ป๐ฒ๐๐ ๐ผ๐๐ป๐ ๐๐ต๐ฒ ๐๐ผ๐ฟ๐ธ๐ณ๐น๐ผ๐.
The model contributes intelligence at specific decision points.
That separation matters.
My Mental Model After Using Jev
I now think about AI architecture using three increasingly flexible layers.
๐๐ข๐๐ = ๐ฅ๐จ๐๐๐ฆ
The correct behavior is already explicitly known.
If payment has already been captured, do not cancel automatically.
๐๐๐ฉ = ๐๐จ๐๐๐ ๐๐ก๐ง / ๐๐ข๐ ๐ ๐๐๐๐๐ฉ๐๐ฅ๐ฌ
The options are known, but the correct choice depends on interpreting context.
Cancel, Continue, or Escalate?
๐๐๐๐จ๐๐ = ๐ฅ๐๐๐ฆ๐ข๐ก๐๐ก๐ + ๐๐๐ก๐๐ฅ๐๐ง๐๐ข๐ก / ๐๐จ๐๐๐๐ง
The problem requires exploration, explanation, planning, synthesis, or creation.
Analyze the entire situation, explain the trade-offs, and propose a resolution strategy.
This is not a competition between models.
It is separation of concerns.
The Bigger Question: Are We Overusing Generation?
Software architecture has always been about choosing the appropriate abstraction.
We do not use a database where a queue belongs.
We do not use Kubernetes to execute one shell script.
And perhaps we should not use open-ended generation where all we really need is a bounded semantic decision.
That is the larger lesson I took from experimenting with Jev.
The future of AI applications may not be:
Application โ One giant LLM โ Everything
It may look more like:
Application State
โ
โผ
Harness
โ
โโโโโโผโโโโโโโโโโโโโ
โ โ โ
Code Jev Claude
โ โ โ
Rules Judgment Reasoning
Generation
โโโโโโผโโโโโโโโโโโโโ
โ
Tools
โ
Actions
โ
New State
And once I saw it this way, my restaurant analogy finally clicked.
๐๐ผ๐ฑ๐ฒ already knows the restaurant rules.
๐๐ฒ๐ is intelligent ๐๐ผ๐บ๐ฒ ๐๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐ from a defined menu.
๐๐น๐ฎ๐๐ฑ๐ฒ gives me the ๐๐๐ณ๐ณ๐ฒ๐ when I genuinely need exploration and creation.
So before making the next expensive generative call, perhaps the architecture question should not be:
Which model is smartest?
It should be:
Does this decision need a ๐ฟ๐๐น๐ฒ, intelligent ๐ต๐ผ๐บ๐ฒ ๐ฑ๐ฒ๐น๐ถ๐๐ฒ๐ฟ๐, or the entire ๐ฏ๐๐ณ๐ณ๐ฒ๐?
Sometimes we need the chef.
But sometimes all we needed was someone intelligent enough to pick the right item from the menu.
Sreeni Ramadorai
AI Architect





Top comments (0)