DEV Community

Cover image for How I stopped misclassifying jobs with Jev!
Angel Nikolov
Angel Nikolov

Posted on AI-assisted

How I stopped misclassifying jobs with Jev!

Why Java is not JavaScript, remote is not hybrid, and how one fan out call fixed our filters

Regex Was Miscategorizing My Job Board. I Added a Judgment Layer With JEV.

We run remotefrontendjobs.com, remotebackendjobs.com, and remotejavajobs.com. Thousands of remote jobs from 20 plus sources. This is how TypeSafe AI System One Models and the Jev model fixed our AI job classification.

Let me give you three real fails from last month.

A security role tagged as AI jobs. A Unity client role tagged as backend jobs. A JavaScript role tagged as Java jobs.
All three came from our old keyword rules, and all three were live on the site until someone emailed me to complain.

Keywords are fast and cheap. They have no idea what a job actually means. An LLM alternative built for structured decisions does.

What is Jev? A 60 second primer

Jev is the first public System One Model from TypeSafe AI, a San Francisco AI lab that came out of stealth on September 15, 2026 with 40M in seed funding.

Founders are Diogo Almeida (ex OpenAI engineer who co wrote core ChatGPT training techniques), plus Erik Gafni and Sasha Sheng. The official announcement is here: Introducing System One Models and Jev.

The name System One comes from Daniel Kahneman Thinking, Fast and Slow. Fast System 1 intuition vs slow System 2 reasoning. Jev is named after economist William Stanley Jevons.

Unlike a large language model that chats and generates text, Jev is built for AI decision making inside software. You send a state plus typed questions. You get back typed, calibrated decisions in JSON that code can use directly. No chat, no hallucination in the classic sense, no long winded chain of thought.

TypeSafe claims Jev is up to 193x faster and 444x cheaper than frontier LLMs on System One shaped tasks, with 70 to 500 ms end to end latency. Pricing on the direct TypeSafe API is 0.042 dollars per 1M input tokens, output tokens free. Current version in our logs is jev-1.13.0 with alias jev-latest.

Three primitives, and we use all three for job board AI classification:

  • Noul: yes or no probability. Returns a noul float from 0 to 1. Ideal for binary checks like is_frontend, is_backend, is_java, is_ai, plus benefits and region gates.
  • Choice: pick one option from up to 255 options. Returns choice plus full probabilities plus confidence. We use it for seniority classification and work model detection: fully_remote vs hybrid vs onsite.
  • Score: rate on an ordered scale of 2 to 10 levels. Returns score plus legend plus probabilities plus confidence. Useful for severity, urgency, or ranking style judgments.

Questions run in parallel and in isolation against the same state. Adding questions barely changes response time. That parallel sampler plus the training method TypeSafe calls Reinforcement Learning for Calibrated Decisions (RLCD) is why confidence is actually usable for branching in code.

You can call Jev three ways: direct via POST https://api.typesafe.ai/v1/systemone with the TypeSafe SDK, via Cloudflare Workers AI as typesafe/jev with env.AI.run, or via Vercel AI Gateway as typesafe-ai/jev. We run it via Cloudflare Workers AI, which keeps the call inside Cloudflare network and fits our Cloudflare hosted Next.js stack.

The problem in one picture: keyword job classification fails

Before, ingest looked like this:

Feed, keywords, save to database, show on site

If the title had java in it, it went to the Java jobs board. Even if it was JavaScript. If the description mentioned AI once, like Copilot is a plus, it went to AI jobs. Even if it was a normal support role.
Benefits extraction was worse. Real perks like 22 days PTO or 401k with 4 percent match often sit at the very bottom of the post, past 6000 characters, in a What We Offer block. Regex never saw it.

How we wired the Jev model into ingest

One fan out call per posting carries every question. Sites, seniority, regions, work model, benefits. Salaries stay on regex by design. Money needs exact extraction, not judgment.

State we send: truncated title plus company plus location plus full description plus an isolated benefits section. Questions we send: 4 site Nouls, 1 seniority Choice, 8 region Nouls, 1 work model Choice, 13 benefits Nouls. All built in one file so prompts are easy to review.
Response we get: jev-1.13.0 answers with noul, choice, probabilities, confidence, plus usage with input and output tokens. Every method returns null when Jev is unconfigured or errors, so callers fall back to keywords. Jev never breaks ingest.
The trick: shadow mode first, enforce mode later
I did not want AI job classification to break the site. So we shipped in two modes.

Step 1: Shadow mode, the default. JEV runs on a small sample per feed, usually 25 posts. It writes its raw answers to an audit field on the job, and writes a log row with what it decided vs what keywords decided. It changes nothing on the site. We just watch and compare.
Step 2: Enforce mode, only when confident. When we turn it on, confident structured decisions can update the row. Below the bar, keywords win and we only log the disagreement.

Each field has its own calibrated confidence bar, tuned on real labeled data:

  • Sites: low bar. The judge runs underconfident here.
  • Regions: medium bar. Stricter than keywords.
  • Work model: fill empty values easily, overwrite existing values only when very sure. A borderline call once flipped a correct hybrid to onsite, so overwrites need a higher bar.
  • Seniority: only fills when keywords found nothing. Title plus years of experience still beats title alone.
  • Benefits: prune only when sure.

Fail safe rules we kept for this LLM alternative:

No token, no call, keywords keep working.
Timeout after 8 seconds, one retry for transient errors, then skip.
Only runs on posts that already passed dedupe, so we never pay for duplicates.
Concurrency capped at 5, so mail and ingest never stall.

Two small details that fixed big AI classification errors

  1. Read the full post for benefits, not the snippet. Snippets are often 500 characters of company boilerplate with zero signal. The perks live at the bottom. We now pass the full text, isolate the benefits section, and let only the benefits Noul questions read that section. Everything else reads the full description.
    Result: we stopped voting confident No on real perks like wellness stipend, RRSP match, and vacation just because we truncated too early.

  2. Location counts as much as prose for geo classification. Remote US in the location field is stronger than three paragraphs of generic text. Same for Poland or Remote US. Our region Nouls now weigh location heavily. A bare Remote with no place named means worldwide, not Europe.

What changed for remote job seekers

This is why you should care if you just want a remote job.

  • Frontend jobs, Backend jobs, Java jobs, and AI jobs boards are cleaner. Fewer cross posts.
  • Remote region filters actually mean something. Europe remote jobs means Europe, not worldwide with the word Europe somewhere in the footer.
  • Remote work model is clearer. Fully remote vs hybrid vs onsite, based on both location and description.
  • Remote benefits badges show up more often, and with fewer false positives. No more stock options tag for a diversity statement that contains the word equity.

Try it: open any board, filter for salary plus region plus seniority, save that filter, and subscribe. You will feel the difference in the Tue and Sun digest.

What changed for us as builders of an AI job board

  • Every classified posting keeps its raw Jev answers as JSON in the database, with model name jev-1.13.0 and timestamp. We can re derive bars later without re paying for calls.
  • Every call writes a queryable log row: board, title, latency in ms, input tokens, output tokens, what was applied vs only logged, errors. No more CSV dumps.
  • Ingest logs now show both sides: keywords said X, Jev structured decision said Y. That made tuning the bars a 30 minute job instead of a debate.

How we keep AI classification honest: /audit-jev

Getting Jev live was the easy part. Trusting it every day is the real work.

We built a repeatable command called /audit-jev. Usage is simple: /audit-jev 100 audits the last 100 ingest classifications. It runs read only on prod, then forces fixes plus tests plus a changelog entry.

Here is what it does:

  1. Pull the last N ingest rows. It queries the JevLog table for scope ingest, ordered by newest first. For each row it looks at raw Noul plus Choice answers with confidences, plus what keywords said at the time, plus which fields enforce actually overwrote.
  2. Replay against the real Job rows. For suspicious rows it fetches the posting in chunks, because benefits tails sit past 5500 characters. Then it checks per area: benefits prunes, site writes, work model overwrites, region fills, seniority fills.
  3. Fix root causes, not symptoms. We prefer tightening keywords over lowering Jev confidence bars. Every fix gets regression tests, then a full test run plus typecheck.
  4. Append a changelog entry, every time. Even when nothing was wrong. Each entry lists scope, issues with real examples, fixes with file paths, tests, and a watchlist. Past entries are never rewritten, and a new fix is never allowed to silently remove an old fix.

This audit loop already paid off for our System One Model rollout:

  • Entry 1 found truncation blindness where What We Offer tails were invisible, plus pay equity text tagged as stock equity, plus hybrid text leaking into flexibility, plus a marginal work model overwrite flipping hybrid to onsite.
  • Entry 2 verified those fixes still hold on a fresh mix of 100 rows, then found new substring bugs like intuition matching tuition inside a URL, plus engineering async matching flexibility, plus Portuguese titles like Senior and Pleno missed by keywords.

Some excerpt of our audit-jev changelog

CHANGELOG

Entry 1–2026–09–21, last 100 ingest rows

  • Scope: 100 rows, breezy-only boards (ontrac 18, ismira 13, social-discovery 11, kimmel 11, zendar 7, …). Wrote counters (inflated by no-op re-writes, see fix 6): seniority 84, workModel 67, sites 39, benefits:prune 35, geoRegions 20, sites:prune 1.
  • Issues found:
  • Truncation blindness: enrichWithJev sliced content to 6000 chars, classifyPosting isolated benefits from the slice - "What We Offer" tails at ~5500–8800 chars invisible to JEV → confident-False prunes of true perks (Egym Wellpass/Wellness Pass, Group RRSP match, 401(K) match, "4 weeks of vacation", "Flexible time off", medical/dental/vision). Same sentence opposite verdicts across jobs.
  • Equity pay-equity FP: "…depending on experience and equity" tagged equity comp (zendar salary line).
  • Flexibility workModel leak: hybrid (work|model) + work from anywhere emitted flexibility for hybrid-3-days and LATAM-remote rows JEV rejects.

If you take one idea from this JEV post, take this one. Do not ship AI classification without a one command audit that anyone can rerun.

If you want to copy this TypeSafe Jev pattern

  • Keep keywords as fallback. Never let a System One Model break ingest.
  • Start in shadow mode. For the first few weeks I let it watch and take notes without touching anything on the site.
  • Use per field confidence bars, not one global bar. Sites and benefits behave very differently.
  • Isolate the section that matters. For us that was benefits at the bottom.
  • Audit every decision with one command like /audit-jev. You will thank yourself when you retune Noul and Choice thresholds.
  • Cap concurrency and timeouts. Even a 70 ms model should never stall your pipeline.

Full stack here: NestJS job aggregator, Prisma plus MySQL, Next.js on Cloudflare, Jev model via Cloudflare Workers AI typesafe/jev with gateway support.

Want Part 3? I can go deep on remote benefits extraction, or on instant company alerts plus Seeker Pro. Tell me in the comments which one you want next.

By Angel, builder of remotefrontendjobs.com, remotebackendjobs.com, and remotejavajobs.com.
Topics covered: Jev, TypeSafe AI, System One Models, System One Model, Jev model, jev-1.13.0, jev-latest, Noul, Choice, Score, calibrated decisions, structured decisions, LLM alternative, Cloudflare Workers AI, Vercel AI Gateway, AI job classification, AI job board, remote jobs, remote frontend jobs, remote backend jobs, remote Java jobs, benefits extraction, work model detection, seniority classification.

Top comments (0)