Zeno Divergent v0.68
A small, open model that checks a panel of forecasts before you trust it.
Give it one question, many forecasts and each forecaster's track record. It returns:
- Forecast: what to use, and when to keep the panel's own answer.
- Failure risk: the chance the panel is confidently wrong together.
Under 0.5M parameters per seed (471,495) · 1.6 MB ONNX · runs on any CPU · 3 seeds.
Live now: web demo · API (version: "v0.68") · MCP tool zeno_check.
Model at a glance
| Parameters | 471,495 per checkpoint (0.47M) · 3 seeds × 2 checkpoints (forecast-best, failure-risk-best) |
| Weights | model.safetensors (seed 11, forecast-best; shown as the model size above) · all six in model-s{11,12,13}.safetensors, fragility-s{11,12,13}.safetensors |
| Architecture | Zeno shared surprise kernel: attention over up to 64 forecasters (width 192, 4 heads) with pair-wise "who misses together" input, a GRU over each forecaster's last 16 outcomes, one shared core for all sources, and per-source forecast heads plus a joint-failure head |
| Training | 1x NVIDIA H200 · 2,000 updates per seed · seeds 11, 12, 13 · walk-forward over 15 test dates · weights frozen before the untouched ForecastBench window was scored |
| Formats | safetensors · ONNX opset 17 (onnx/, 1.6 MB each) · Python package zeno068 (ONNX or PyTorch backend) |
| Checks | ONNX = PyTorch training forward to < 5e-7 on 200 real held-out cases (research/export-check.json); parity_check.py reproduces every example |
Why it is smaller than v0.57 (9.16M): v0.68 uses the shared kernel introduced in v0.67. It is one small network for every source, built to read who disagrees and who fails together rather than to memorise each source. It has no deep panel transformer. Size was not what held either version back: v0.57's 9.16M parameters also kept the reference on most sources.
Try it online (no install)
- Web demo: https://huggingface.co/spaces/mbarbosa1/zeno-try-it (v0.68 section)
- HTTP:
POST https://zenodivergent.dev/api/public/v1/checkwith{"version": "v0.68", "question": {...}} - MCP:
https://zenodivergent.dev/api/public/v1/mcp, toolzeno_check, argumentversion: "v0.68"
All three run this exact revision through the zeno068 package on CPU, so they give the same answer as a local download.
Quickstart (CPU, about 1 minute)
pip install huggingface_hub
huggingface-cli download ZenoDivergent/zeno-divergent-v068 --local-dir zeno-v068
cd zeno-v068
pip install -r requirements.txt # numpy, onnxruntime, safetensors
python parity_check.py # runs every example; prints "ok" for each
import json, zeno068
z = zeno068.load(".") # ONNX Runtime; zeno068.load(".", "torch") also works
out = z.predict(json.load(open("examples/crypto-request.json")))
print(out["served"]) # forecast + 90% range you can use (the trained reference)
print(out["failure_risk"]) # calibrated chance the panel is confidently wrong together
print(out["support"]) # release status, and why the model could not run (if it couldn't)
z.predict(request, experimental=True)["experimental"] # the raw Zeno correction: NOT released, untested
What every answer contains
| Field | Meaning | Evidence behind it |
|---|---|---|
served.forecast, served.range90 | The source's trained reference (e.g. panel median, or calibrated market price for markets) | Release rule output, decision.json |
failure_risk.value | Calibrated chance (3-seed mean, isotonic calibration fitted on earlier data only) that the panel's confident members all miss together | Untouched ForecastBench window: underpowered (see below) |
support.release_status | keep the reference for every source in this version | decision.json |
support.pass_through + reasons | true when the trained inputs (task label, past-miss sequence) can't be rebuilt from your request. The model then doesn't run, and you get the reference only | n/a |
experimental (opt-in) | Zeno's own corrected forecast and range, plus that source's measured gain and range coverage | serving.json → confirmation |
Input formats
1. Plain request. This is the same shape as the public API POST /api/public/v1/check. See examples/crypto-request.json.
The numbers in that file are made up, to show the format.
{"source": "crypto", "decision_at": "2026-01-10T12:00:00Z", "lead_hours": 1,
"task": {"forecast_type": "quantile", "variable": "btc-usd", "horizon": "1h"},
"inputs": {"panel": [
{"forecaster_id": "a", "available_at": "2026-01-10T12:00:00Z",
"quantiles": {"0.05": 90120, "0.5": 90650, "0.95": 91180},
"history_sequence": [{"scaled_error": 0.4, "missed": false, "label_available_at": "2026-01-10T09:00:00Z"}]}]}}
- Each member gives one of:
quantiles,probability(yes/no questions), orpointwitherror_scale. - Forecasts available after
decision_atare dropped. history_sequenceholds the forecaster's past resolved outcomes.scaled_erroris (forecast − outcome) divided by that outcome's panel spread. Outcomes known after the decision are dropped. Usezeno068.history_sequence(...)to build it.- If
taskor everyhistory_sequenceis missing, the answer is a labelled pass-through.
2. Prepared panel case. This is the exact training format, used for the two real examples/forecastbench-*.json cases from the
untouched window. Each one's .expected.json also records what actually happened.
Sources this package accepts: crypto, ecb_spf, forecastbench, health_covid, health_flu, health_rsv, markets, philfed_spf, philfed_spf_prob, sea. Any other source is refused, not guessed.
Using the ONNX files directly
onnx/kernel-s{11,12,13}.onnx hold the shared network. onnx/fragility-s{seed}.onnx hold the failure-risk checkpoint.
| Inputs (batch b, members k) | Outputs |
|---|---|
member (b,k,8), history (b,k,4), dependency (b,k,k,3), mask (b,k) bool, context (b,4), seq (b,k,16,3), seq_len (b,k) int64, task (b) int64, source_index (b) int64 | z (b,96), joint_miss_logit (b) |
- Forecast heads: these are small linear layers stored in
model-s{seed}.safetensors(heads.<source>.weight/bias,strength).zeno068/__init__.py(_forecast) shows how they are applied on top of each source's reference. - Failure risk: this is
sigmoid(joint_miss_logit)mapped throughcalibration-s{seed}.json(isotonic), then averaged over the three seeds. - Match check:
research/export-check.jsoncompares ONNX against the original PyTorch training code on 200 real cases across 3 seeds. The largest difference is 3e-6.
What was measured (confirmation period, 3 seeds of the main version)
Status in one line: every source serves its trained reference. The run stopped after 4 of 12 trainings, so the matched controls the release rule needs are incomplete. The failure-risk output is labelled underpowered.
v0.57 stays the default model on zenodivergent.dev: it still improves crypto and some weather forecasts, and v0.68 does not beat it yet. Ask for v0.68 by name with version: "v0.68".
| Source | Score gain vs its reference | 90% range coverage (target 85–95%) | Reading |
|---|---|---|---|
| Crypto | +3.9% to +4.7% | 81% | Real forecast gain, but ranges too narrow. Not released |
| Phil. Fed SPF probabilities | +7.2% | n/a | Uncertainty crosses zero. Not established |
| Phil. Fed SPF | +0.4% to +1.2% | 82–83% | Too small, ranges too narrow |
| Space weather | +0.6% | 54% | Large range failure. Not in this package |
| Markets | +0.2% | n/a | Not established |
| COVID-19 hospitalisations | −0.5% to +0.1% | 93% | No gain |
| Flu, RSV, deterministic weather | −0.8% to −1.7% | 76–89% | Worse; reference kept |
| ECB SPF, sea, ForecastBench | ≈ 0 | — | Correction switched off by design |
no_history (1 seed) gained only +0.35% on crypto. That suggests forecaster track records drive the crypto gain,
but one seed is not a test.
Failure-risk test (untouched ForecastBench window, rescored 14 Oct with score_sealed/1.1.0)
- 2,585 held predictions on 735 questions. 577 had no eligible label and were excluded, not counted as "no failure".
- Weekly review of the riskiest 10%: 13 confident shared failures in total. Zeno caught 1–2; confidence alone caught 0.
- Verdict: underpowered. This window was also seen during an earlier rehearsal, so it is not fully prospective.
v0.57 vs v0.68
| v0.57 (served) | v0.68 (this candidate) | |
|---|---|---|
| Live on zenodivergent.dev / API / MCP | yes | no |
| Sources with a released correction | crypto, ensemble weather | none (reference everywhere) |
| Warnings | ensemble weather only | panel-level failure risk, calibrated, labelled underpowered |
| New in this version | — | ForecastBench as a trained source (808 forecasters, 82 families); panel cap 64; question-level scoring |
| Files | ONNX + safetensors + zeno/ | ONNX + safetensors + zeno068/ |
Known limits
- The failure-risk part reads a frozen copy of the shared network, so it can't shape what the network learns.
- Two matched controls (
no_dependence,shuffled_dependence) never ran, andno_historyran 1 of 3 seeds. So no source can be released. - Timing for two controls was estimated, not measured.
- Range repair needs per-case confirmation predictions, which this run didn't save. Ranges are withheld rather than widened after the fact.
- Same-answer checks between this download and the live API apply only if v0.68 is ever switched live.
Files
| Path | What |
|---|---|
model-s{11,12,13}.safetensors | forecast network per seed (safe format, no pickle) |
fragility-s{11,12,13}.safetensors, calibration-s*.json | failure-risk checkpoint + frozen isotonic calibration per seed |
onnx/ | ONNX graphs of both, per seed |
zeno068/ | CPU inference package; _core/ is the exact training feature code |
config.json, serving.json, decision.json | architecture, packaged settings, release decision |
examples/ | 2 real held cases + 1 request, with expected outputs |
research/ | original training files, gate reports, rescored sealed results, receipts, export scripts |
receipt.json | SHA-256 of every file |
Licence: CC BY-SA 4.0. Training data includes ForecastBench (CC BY-SA 4.0).