[Side Project] 'Jev-compatible' had no spec: building jevcompat
Loading comments...
Loading comments...
jevcompat is three things:
POST /v1/systemone). It has 48 requirements, each with a level (MUST/SHOULD) and the official source it comes from.jevcompat test URL: runs the spec against any server. Each failure comes with the request that caused it and the response bytes that broke the rule.jevcompat proxy URL: sits in front of a non-conforming server, fixes what can be fixed, and refuses what can't instead of passing a wrong answer through.TypeSafe released Jev on September 15. It takes typed questions (yes/no, choice, score) and returns typed answers with probabilities. The model was closed and the API waitlisted. Within nine days, about a hundred open-source servers called themselves "Jev-compatible".
I read the code of the 26 most-starred ones:
/v1/systemone.confidence meant different things on different servers: the top probability, the top-two margin, or 1 − entropy."model": "jev-latest", was handled four different ways.There was nothing to check the claim against, and the would-be references: TypeSafe's docs, its OpenAPI file and its two SDKs: disagree in eight places.
I checked what already existed first. There were leaderboards (JevBench), calibration benchmarks (sys1bench), semantic grep tools (17) and SQL integrations (25). The empty slot was the API contract itself: the same situation Markdown was in before CommonMark gave dozens of implementations a spec and a test suite.
| server | ★ | MUST | verdict | what breaks for a Jev client |
|---|---|---|---|---|
| kev (0.8B) | 5.8k | 32/32 | conformant | none |
| decider (0.8B) | 338 | 32/32 | conformant | none |
| von | 571 | 31/32 | not conformant | object or array instructions rejected |
| rizzo-flow (1.7B) | 389 | 31/32 | not conformant | more than 26 options rejected |
| Open-Jev (2B) | 284 | 31/32 | not conformant | one-sided noul criteria rejected |
| laya | 20.1k | 30/32 | not conformant | 128 options rejected; a null legend value the SDK can't parse |
| jeff | 230 | 30/32 | not conformant | more than 64 options rejected; score isn't the expectation of its own probabilities |
| simple-jev (0.8B) | 499 | 29/32 | not conformant | jev-latest rejected; more than 50 options rejected |
Two of eight conform. The most striking finding was jeff: reversing the order of the questions in one request moved the team answer from Billing 0.768 to 0.351, because the questions share one encoder pass.
Writing the checks was quick. What came after took much longer. This tool grades other people's open-source work in public, so the worst bug isn't a missing feature. It's a false positive: a "MUST violation" stamped on a server that did nothing wrong.
So it was verified in three layers.
1. Every check has to be able to fail. The reference server (jevcompat mock) implements the spec exactly and can break any requirement on purpose (47 faults). CI checks three things: every check passes on the clean server, each fault fails its target requirement, and no single fault spreads into unrelated MUSTs. A check that can never fail is no check.
2. Three independent reviews. The first found a critical problem. "Does renaming a question id change the answer?" was judged from the difference between two requests, so correct servers with noisy probabilities failed about 25% of the time. The tests passed only because they used one lucky seed. Now requests are sent several times, means are compared against a limit from the pooled standard deviation, and a difference counts only if a fresh second round shows it in the same direction. The false-positive rate is tested over many seeds. The reviews also found:
3. Every real failure checked by hand. Each of the eight servers' failures was compared against the recorded request and response. That found five more bugs in the tool itself:
All were fixed before publication. The 42 failures in the final reports are all real (REVIEW.md).