Jevstiller roadmap
Shipped
Section titled “Shipped”0.2.0: the self-hosted, drop-in Jev proxy. Point TYPESAFE_BASE_URL at it, and every service keeps its code
and its own Jev key.
service A ─┐ ┌──────── Jevstiller (one container) ────────┐ service B ─┼─ TYPESAFE_BASE_URL ───► │ /v1/systemone → task per question │ ──► Jev service C ─┘ + own Jev key │ trained student answers, or forward to Jev │ └────────────────────────────────────────────┘- Validated against live Jev: Banking77, 70.7% held-out coverage at 99.45% agreement (target 98%).
- Many tasks, many tenants, one process: training runs in the background, fair across tenants.
- Security: keys are verified by Jev before any local answer and never stored.
- Operations: a TOML config, an admin API and CLI, Prometheus metrics, health checks, JSON logs, backup and restore.
- Packaging: a hardened container image and a Kubernetes manifest.
0.3.0:
- A status page at
/jevstiller/status. - A defined public Python API, pinned by a test.
- A third security audit: the audit channel now scores answers as they were served, calibration is split per request, and there is a per-key quota on new tasks.
- Hash-pinned release builds.
0.3.4:
- Bounded disk use. Old model versions and stored requests that nothing reads any more are deleted. A busy task levels off at ~300 MB. The 24-hour soak’s data went from 53 GB to 4.3 GB.
- A 24-hour soak: memory bounded, and a silent change in Jev’s answers at hour 12 recovered without intervention.
- A benchmark on five public tasks, with Jev’s recorded answers, so anyone can rerun it.
rare_classesdefaults todefer: a label Jev never uses no longer blocks a task’s first student.
0.4.0:
- The guarantee can cover your confidence check. Set a task’s
confidence_floorto the Jev confidence below which your code treats answers as unsure. The target then counts those requests too, and local answers report at least the floor. Without it, a check at 0.6 lost 8–37% of the flags Jev would have raised, on the benchmark. - A local answer’s
Result.confidencein the Python API uses Jev’s definition, as the proxy already did. - Apache 2.0 instead of MIT.
0.5.0:
- Yes/no (
noul) questions are answered locally, on by default. You state the cut-off your code compares Jev’s probability with (0.5 unless set), or two for an unsure band, and the target covers landing on the same outcome as Jev. 98% answered locally where Jev is decisive, 22–36% on noisy questions.
0.5.1:
- Fixes from the fourth security audit (docs/security.md, run 4): stored text is cut in bytes and dropped when the disk is nearly full, admin changes no longer race loads and deletes, one caller can’t flush others’ admission counts, and the website’s deploy token no longer shares a job with the build.
0.5.2:
- Jev 1.14’s image requests are forwarded up to Jev’s 32 MiB limit: above 4 MiB they got a 413 from the proxy. Nothing is learned from them.
- Docs: TypeSafe’s terms, guides on cutting the Jev bill and on rate limits, and
AGENTS.mdfor AI assistants.
0.5.3:
- Security: the proxy no longer trusts eMudhra’s compromised CA keys when it connects to Jev (certifi 2026.10.19). The image is rebuilt on Debian’s fixes and drops pip.
- Docs: comparison pages, a savings calculator, and benchmark numbers re-measured with the default settings.
0.6.0:
- Questions about images are learned locally (experimental, off by default): with
images = "auto", a repeatedchoiceor yes/no question about one image is answered locally once trained, under the same guarantee. SigLIP so400m on a GPU, SigLIP B/16 on CPU; image bytes are never stored. - Fixes from the fifth security audit (docs/security.md, run 5): the audit keeps running when a task is reloaded, one bad text no longer fails its whole encoder batch, a student trained with another encoder isn’t served, and slow or header-only uploads can’t hold the large-body slots.
- Faster under load: the text encoders batch by length, 1.9–3× the texts a second at 64–256 concurrent callers.
- A tolerance for yes/no answers. Since 0.5 a
noulanswer is covered for its side of your cut-off. For pipelines that use the number itself: the local probability within ±ε of Jev’s on at least the target share of requests. Measured as realistic where Jev is decisive (±0.1 on 96% of requests for two of four benchmark questions) and weak where it isn’t (12–18%). - A second teacher: OpenAI’s Decisions API. Announced at DevDay on 2026-09-29, it has the same shape as Jev’s
Choice: a question, a finite set of answers, a confidence. The loop doesn’t care which teacher labels a task, only the adapter does, so a Decisions API adapter is the natural next one, as soon as the API is generally available and its responses carry per-answer probabilities (the soft labels are worth 2–3 points of coverage). - An OpenAI-compatible endpoint. The proxy speaks Jev’s API only. A
/v1/chat/completionsfront that maps a constrained-choice prompt onto the same task loop would let the same local model, guarantee and audit sit in front of other providers’ classification calls. - An in-process option for teams that can’t run a service: a
TypeSafeClient-compatible wrapper over the same engine. - Hooks for a hosted version: a pluggable store, an external key validator, metering.
- Tighter, longer-lived guarantees:
- calibrate on post-deployment traffic with inverse-probability weights;
- anytime-valid monitoring (confidence sequences);
- a confidence budget spread across retrains;
- one learned deferral score instead of two thresholds.
- Forward only the questions the student couldn’t answer, instead of the whole request.
- Distil Jev’s
scorequestions (ordinal). - Postgres store and multiple replicas.
- Per-class thresholds and class-weighted budgets.
The full, checkbox-level plan is in DEPLOYMENT_PLAN.md.