Ask a typed question. Get a typed answer. Let code decide.
Jev is a decision model. It never writes prose: it answers yes-or-no, pick-one and how-much questions, each with a confidence. Everything after that is ordinary code, so the same answers and the same thresholds always give the same outcome.
Mark a real answer
Pick an answer from a Year 6 science paper. Jev is asked three questions about it, and the marking rules decide what happens. Drag a threshold past a confidence and watch the decision change.
Mark scheme
See the request and response for this answer
The confidences on this page come from the repo's fake driver, which returns hand labels with a confidence set by how clear-cut the answer is. Live Jev returns its own numbers; the rules that act on them are the same.
Then the whole paper
Once every answer is settled, code adds up the marks. A total close to the pass mark goes to a human however confident Jev was, because that is where a one-mark mistake changes the result.
Three kinds of question, one shape
Every question has a type, an instruction and criteria. Every answer comes back with a confidence, so there is nothing to parse and nothing to guess.
The same pattern works wherever work needs sorting
Marking is one case of a general job: read something, answer a few typed questions about it, and route it. Here are three more. The answers are examples you can change, not live Jev output; the rules beneath them never change.
How it is built
The marking app is Laravel 13. Jev sits behind one interface, DecisionClient::decide($state, $questions), and every call is logged with its tokens, cost and latency.
The rules live in MarkingRouter, a plain PHP class with its thresholds in config. The router on this page is a line-for-line copy, and a test runs both against the same cases so they cannot drift apart.
A generative model only writes text around decisions that are already final: pupil feedback, report comments and verbatim transcripts of handwritten scans. It never sets a mark.