All posts

A Blog That Checks Itself

· 3 min read ·engineering machine-learning

This blog runs a model over every draft before the publish button will work. Not to write anything and not to decide anything by itself, but to answer a fixed list of narrow questions that plain Python then acts on. This post is about what that setup actually costs and whether it earns its place.

The thing being used is not an LLM

TypeSafe’s Jev is a System One model. The name comes from Kahneman’s fast, intuitive mode of thinking. Practically it means the model returns typed answers and probabilities rather than prose: you hand it some state and a set of questions, and you get back numbers your code can branch on. It cannot write your post for you. It is not trained to generate text at all.

Three question types cover everything I ask it:

  • a Noul returns the probability that a yes/no statement is true
  • a Choice picks one option from a set you define
  • a Score places something on ordered levels you describe

Nine questions, one request

The temptation with a model like this is to ask one big question. Is this post good? That is the wrong shape. One number hides a dozen judgments and gives you nothing to act on.

So the editor asks nine small ones instead. Seven are Nouls about specific properties: does the opening state the subject, does the summary match the body, does the title oversell, is there a concrete example, is jargon explained, does it end properly, are factual claims supported. A Score rates how finished the draft is. A Choice assigns a topic.

All nine go out in a single request. Jev reads the state once and evaluates every question against it in parallel, so nine questions cost one round trip rather than nine. That detail is what makes the whole design affordable.

The model does not decide anything

This is the part I care most about getting right. Jev returns judgments. What they mean is a decision my code makes:

publishable = (
    readiness_value >= 1.5
    and (gate_score / gate_max) >= 0.75
)

Thresholds and per-check weights live in Python, never in the prompt. Making the blog stricter is a one-line change that requires no new inference, because neither the evidence nor the questions have changed. And the Publish button has a “publish anyway” path, because the author outranks the model.

Some things are deliberately kept away from Jev entirely. Word count, reading time, and dates are arithmetic, and the model’s own documentation is candid that arithmetic is where it is weakest. Those are six lines of Python.

What it measures

Here are the two drafts I tested the setup with. One was deliberately sloppy, ending mid-sentence with a summary promising a “complete guide” that the body never delivered. The other was finished.

Sloppy draft Finished draft
Readiness rough notes publishable
Checks flagged 7 of 7 2 of 7
Verdict blocked passed

It caught the truncated ending at 0.96, the mismatched summary at 0.15, and two undefined acronyms at 0.91. On the finished draft it was less sure which topic applied, reporting 0.42 confidence, and the interface showed that as “unsure” rather than committing to a label. A model that says it does not know is more useful than one that guesses.

Cost

Jev bills input tokens only, at $0.042 per million, and output tokens are free. A full nine-question pass over a 1,000-token draft comes to about $0.000036.

Latency took one fix. My first version built a fresh API client for every request, which meant a TLS handshake every time: 17.5 seconds on the first call and around 830 ms after that. Holding a single client open for the process brought it to 799 ms cold and roughly 300 ms steady.

Three hundred milliseconds and three hundredths of a cent is cheap enough to re-run the entire battery a few seconds after every pause in typing. That is the actual unlock. The checks are not a gate I remember to run before publishing; they are just there, updating while I write.

Would I do it again

For this, yes. The work that made it useful was not the integration, which is about forty lines. It was deciding which seven questions were worth asking, and keeping every threshold out of the model and in code where I can see it and change it.

What I would not do is reach for this when an ordinary if statement would have worked. Most of a blog is not a judgment call.

Nguyen Huu Hoang Minh

Software Engineer crafting robust, scalable web applications with clean code and modern architecture.

View portfolio