ainouche-abderahmane commited on
Commit
ad549f7
·
verified ·
1 Parent(s): 7a82f5e

Upload folder using huggingface_hub

Browse files
Files changed (2) hide show
  1. README.md +185 -126
  2. manifest.json +1 -1
README.md CHANGED
@@ -53,32 +53,50 @@ answer with calibrated probabilities, the parts of the context it relied on, and
53
  certified signal for when to act and when to escalate. It never generates text, so there
54
  is nothing to parse and nothing to hallucinate.
55
 
56
- **419M parameters** — a ModernBERT-Large encoder plus a decision head that refines one
57
- readout per iteration over four iterations, with a certified early exit at depth 2.
58
- Against Laya and GLiNER2.5-Decide, each run by us on identical records, it leads both on
59
- six of ten tasks: **+54.7 points on Banking77, +42.3 on MASSIVE English, +36.3 on typed
60
- decisions, +27.6 on prompt injections**. Where it cannot back an answer it abstains
61
- instead of guessing. Built for the decision layer under agents: routing requests, gating
62
- tool calls, verifying claims.
 
 
 
 
 
 
63
 
64
- ## Installation
 
 
 
 
 
65
 
66
- The `mimir-decisions` package is launched and is the way to use this model:
 
 
 
 
 
 
67
 
68
  ```bash
69
- pip install "mimir-decisions[local]" # CPU engine
70
- pip install "mimir-decisions[local-gpu]" # CUDA engine
71
- pip install mimir-decisions # data models and HTTP client only
72
  ```
73
 
74
- Python 3.11 or later. The distribution is `mimir-decisions`; the import and the command line are `mimir`.
 
75
 
76
  ## Quickstart
77
 
78
  ```python
79
  from mimir import Mimir
80
 
81
- model = Mimir.from_pretrained("Mythologic/MIMIR-1") # downloads weights on first use
82
 
83
  result = model.choose(
84
  "My card was charged twice for the same order.",
@@ -91,12 +109,21 @@ print(result.probabilities) # calibrated probability of each option
91
  print(result.certificate) # the certified threshold the decision was checked against
92
  ```
93
 
94
- > **Three outcomes, not two.** Every call ends `DECIDED`, `ABSTAINED` or `DEFERRED`.
95
- > `ABSTAINED` means none of the listed options is supported; `DEFERRED` means the
96
- > certificate does not cover this call at your risk level — `result.deferral.reason` says
97
- > why (`below_threshold`, `out_of_distribution` or `no_certified_threshold`). Both are
98
- > answers, not errors: a decision layer that cannot refuse is a random generator with
99
- > calibrated-looking outputs.
 
 
 
 
 
 
 
 
 
100
 
101
  ## What it decides
102
 
@@ -110,22 +137,100 @@ print(result.certificate) # the certified threshold the decision was checked
110
  | `rate` — rate on your ordered scale | a level id |
111
  | `estimate` — estimate a number in `[low, high]` | a number with an interval |
112
 
113
- Every result carries `status`, `confidence`, `relevant_context` (the context parts behind
114
- the answer, most relevant first), `certificate`, `deferral` and `latency_ms`. Choice,
115
- yes/no and verify results add `abstain_probability` and a conformal `prediction_set`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
- A context is a string, a list of passages, tables with typed numbers and dates, or a JSON
118
- state — and `decide_many` batches many decisions while every method has an async form.
 
 
 
119
 
120
  ## Load paths
121
 
122
- **This repo holds all three load paths.** The release root is the `mimir-decisions` contract
123
- (ONNX graphs plus certified policy); the same weights ship as plain `transformers` under
124
- a subfolder, and only what you load is downloaded:
125
 
126
  | Path | Format | Best at |
127
  |---|---|---|
128
- | **`Mythologic/MIMIR-1`** (this repo root) | ONNX graphs + certified policy via `mimir-decisions` | routing, gating, verification |
129
  | **`Mythologic/MIMIR-1`, `subfolder="transformers"`** | same weights for plain `transformers` | research, custom runtimes |
130
 
131
  ### Package mode (recommended)
@@ -138,9 +243,9 @@ mimir serve # HTTP, configured decision endpoints
138
  mimir mcp # MCP server: configured decision tools by default
139
  ```
140
 
141
- Both serve the certified fp32 graph with the shipped policy, so the certificate below
142
  applies to what they return. Adapters for eight agent frameworks, worked examples and
143
- the full API reference are in the package repository, with a docs site.
144
 
145
  ### Transformers mode
146
 
@@ -158,114 +263,66 @@ outputs.utilities # [4 depths, records, candidates]: every depth's readouts
158
  ```
159
 
160
  Load plus forward on pre-encoded batches only: text handling, calibration, the server
161
- and MCP stay in `mimir-decisions`. The staged modelling code holds the inference-only head
162
- forward — no loss, no training machinery — the same computation the shipped `model.onnx`
163
- already carries.
164
-
165
- ## Evidence
166
-
167
- Head-to-head against Laya (`convaiinnovations/laya`) and GLiNER2.5-Decide
168
- (`fastino/GLiNER2.5-Decide`), each run by us on identical records with paired bootstrap
169
- 95% intervals. Exact-match accuracy at full coverage:
170
-
171
- | Task | n | MIMIR | Laya | GLiNER | MIMIR − Laya |
172
- |---|---|---|---|---|---|
173
- | Banking77 | 3,076 | **0.883** | 0.335 | 0.706 | +0.547 [+0.530, +0.564] |
174
- | MASSIVE en | 2,974 | **0.866** | 0.443 | 0.643 | +0.423 [+0.403, +0.443] |
175
- | typed-decisions | 2,000 | **0.725** | 0.361 | 0.487 | +0.363 [+0.332, +0.394] |
176
- | prompt-injections | 116 | **0.957** | 0.681 | 0.638 | +0.276 [+0.190, +0.362] |
177
- | XNLI en | 4,995 | **0.828** | 0.676 | 0.398 | +0.152 [+0.137, +0.167] |
178
- | BoolQ | 3,270 | **0.840** | 0.777 | 0.727 | +0.064 [+0.048, +0.080] |
179
- | AG News | 7,600 | 0.921 | 0.926 | 0.735 | −0.005 [−0.011, +0.000] |
180
- | SST-5 | 2,210 | 0.362 | 0.360 | 0.446 | +0.001 [−0.029, +0.033] |
181
- | fast-decisions | 2,900 | 0.432 | 0.527 | 0.620 | −0.050 [−0.071, −0.030] |
182
- | DAIR Emotion | 2,000 | 0.080 | 0.589 | 0.562 | −0.508 [−0.530, −0.485] |
183
-
184
- MIMIR leads decisively on six tasks and ties Laya on AG News and SST-5; GLiNER leads on
185
- its own fast-decisions showcase. DAIR Emotion is abstention, not error — the model answers
186
- "none of the listed options" on 1,792 of 2,000 records (mean abstain mass 0.656); forced
187
- to pick among the six emotions it scores 0.595, against Laya's 0.589.
188
-
189
- ## Certificate
190
-
191
- The fp32 policy ships selective thresholds proven on 95,550 held-out records at four risk
192
- levels (origin `custom` in `policy/fp32.json`):
193
-
194
- | Type | 1% risk: taken | Errors |
195
- |---|---|---|
196
- | binary | 6,781 of 19,319 (35.1%) | 47 (0.69%) |
197
- | categorical | 19,947 of 54,728 (36.4%) | 166 (0.83%) |
198
- | ranking | 1,441 of 3,863 (37.3%) | 5 (0.35%) |
199
- | ordinal, multilabel | defer every record | — |
200
-
201
- Read the table as a contract: at 1% risk the model acts on about a third of binary,
202
- categorical and ranking calls and its error rate on the acted calls stays under the risk.
203
- Thresholds were fit on the PyTorch model's outputs and transferred to the graph, whose
204
- outputs match the model on every decision over 312 verification records (max relative
205
- readout gap 6.5e-5, zero decision differences). The release also ships a 200-record
206
- equivalence set, so any CPU hardware replays the graph and must reproduce every shipped
207
- decision. The certified configuration is CPU, ONNX Runtime 1.30.0. Other runtimes
208
- calibrate their own policy from their own labels:
209
-
210
- ```python
211
- from mimir import Mimir
212
- from mimir.core.labels import LabelledDecision
213
- from mimir.runtime.calibrate import calibrate
214
-
215
- model = Mimir.from_pretrained("Mythologic/MIMIR-1")
216
- labelled: list[LabelledDecision] = [...] # your context/decision/label triples
217
- policy = calibrate(model, labelled, risk=0.01, confidence=0.95)
218
- ```
219
-
220
- The fp16 graph ships without a policy; certify it the same way.
221
 
222
  ## Speed
223
 
224
- About **1.7 decisions per second on an M4 CPU**, flat from 1 to 32 concurrent clients —
225
- the batching absorbs concurrency rather than queueing it. GPU throughput is not measured
226
- in this release.
227
 
228
  ## Architecture
229
 
230
- - **Backbone:** ModernBERT-Large encoder plus a decision head trained from scratch:
231
  question-conditioned state memory, a candidate set processor, and a shared reasoning
232
- cell applied once per iteration. 419M total.
233
- - **Typed readouts:** choice, multi-choice, yes/no, verification, ranking, rating,
234
- estimation. The answer space is defined at request time, so new schemas need no
235
- retraining.
236
- - **Budget:** 512-token chunks capped at 256 question tokens; tested to 150 options,
237
- 49 levels and 26,406 context tokens. Larger inputs are refused.
238
- - **Refusal built in:** an out-of-distribution distance gate, conformal prediction sets,
239
- selective thresholds with finite-sample certificates, and an evidence mass over the
240
- context behind every decision.
241
 
242
  ## Training
243
 
244
- Training data and procedure are private.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
 
246
  ## FAQ
247
 
248
- **Why is DAIR Emotion 0.080?**
249
- Because the model refuses to guess: "none of the listed options" on 1,792 of 2,000
250
- records. Forced to pick, it scores 0.595 — above both competitors. If your pipeline
251
- needs a label on every row, read the argmax over the options; if it needs honesty, read
252
- the abstention.
253
 
254
  **What do I do with ABSTAINED and DEFERRED?**
255
  Route them to a person or a stronger check. Pipelines that treat every call as an answer
256
  turn refusals into someone else's silent default.
257
 
258
- **Can I use a GPU?**
259
- Yes, with the fp16 graph — but it ships without a policy, so calibrate your own or run
260
- the equivalence set first. There is no CUDA certificate in this release.
261
-
262
- **Why do ordinal and multilabel always defer?**
263
- Their first testable thresholds fail on held-out data. Shipping them would be shipping an
264
- unproven promise.
265
 
266
  **How do I reproduce the numbers?**
267
  The release carries a 200-record equivalence set: replay the graph on any CPU and every
268
- shipped decision must match.
269
 
270
  ## Files
271
 
@@ -278,20 +335,22 @@ shipped decision must match.
278
  | `transformers/modeling_mimir.py`, `transformers/configuration_mimir.py` | the architecture, `transformers` and `torch` only |
279
  | `tokenizer.json` | the 50,368-entry vocabulary |
280
  | `config.json` | variants, limits, layout and graph contract for `mimir-decisions` |
281
- | `policy/fp32.json` (+ `.npz`) | the certified selective thresholds |
282
  | `equivalence/` | 200 records with inputs, so any CPU replays the graph |
283
  | `LICENSE` | the Mythologic Community Model License |
284
  | `manifest.json` | SHA-256 of every file above |
285
-
286
- No optimiser state, no scheduler state, no RNG. Training cannot be resumed from these files.
287
 
288
  ## Links
289
 
290
- - Package: `mimir-decisions` on PyPI (`https://pypi.org/project/mimir-decisions/`), `from mimir import Mimir`
291
- - Code: [abderahmane-ai/mimir](https://github.com/abderahmane-ai/mimir) on GitHub
 
 
 
292
 
293
  ## Licence
294
 
295
- Mythologic Community License (see `LICENSE`): free for research, personal use and
296
- organisations under $500K annual revenue; commercial use above that needs a commercial
297
- licence. Contact Mythologic for production, on-premises and indemnity terms.
 
53
  certified signal for when to act and when to escalate. It never generates text, so there
54
  is nothing to parse and nothing to hallucinate.
55
 
56
+ - **419M parameters** — a ModernBERT-Large encoder plus a decision head.
57
+ - **Certified, not vibes**: selective thresholds with finite-sample guarantees ship in
58
+ the box, so the model can tell you when its answer is safe to act on — and when it is
59
+ not.
60
+ - **Built for the decision layer under agents**: routing requests, gating tool calls,
61
+ verifying claims.
62
+
63
+ | | |
64
+ |---|---|
65
+ | Repository | `Mythologic/MIMIR-1` (this card) |
66
+ | Package | [`mimir-decisions` on PyPI](https://pypi.org/project/mimir-decisions/) — `pip install "mimir-decisions[local]"` |
67
+ | Code and docs | [abderahmane-ai/mimir](https://github.com/abderahmane-ai/mimir) |
68
+ | Licence | Mythologic Community License — free for research, personal use and organisations under $500K annual revenue; [full text](LICENSE) |
69
 
70
+ ## Intended use and out of scope
71
+
72
+ **Use it for** structured decisions where the caller must be able to act or escalate on
73
+ the model's own terms: routing a ticket to a team, gating a refund tool call, verifying
74
+ a claim against evidence passages, ranking vendors against a requirement, rating an
75
+ incident on an ordered scale, estimating a bounded number with an interval.
76
 
77
+ **Do not use it for** anything that needs generated prose (it cannot produce text),
78
+ records that are not in English, or as the only reviewer of a decision whose options
79
+ were themselves wrong. Where the model cannot back an answer it returns `ABSTAINED` or
80
+ `DEFERRED` — route those to a person or a stronger check rather than reading them as a
81
+ vote against an option.
82
+
83
+ ## Installation
84
 
85
  ```bash
86
+ pip install "mimir-decisions[local]" # CPU engine (certified configuration)
87
+ pip install "mimir-decisions[local-gpu]" # CUDA engine
88
+ pip install mimir-decisions # data models and HTTP client only
89
  ```
90
 
91
+ Python 3.11 or later. The distribution is `mimir-decisions`; the import and the command
92
+ line are both `mimir`.
93
 
94
  ## Quickstart
95
 
96
  ```python
97
  from mimir import Mimir
98
 
99
+ model = Mimir.from_pretrained("Mythologic/MIMIR-1") # downloads and verifies on first use
100
 
101
  result = model.choose(
102
  "My card was charged twice for the same order.",
 
109
  print(result.certificate) # the certified threshold the decision was checked against
110
  ```
111
 
112
+ ### Three outcomes, not two
113
+
114
+ Every call ends `DECIDED`, `ABSTAINED` or `DEFERRED`.
115
+
116
+ - `DECIDED` — an option is chosen and certified to act on at your risk level.
117
+ - `ABSTAINED` — none of the listed options is supported; this is an answer, not a
118
+ failure.
119
+ - `DEFERRED` — the certificate does not cover this call; `result.deferral.reason` says
120
+ why: `below_threshold` (confidence missed the certified threshold),
121
+ `out_of_distribution` (the input sits outside what the thresholds were certified on)
122
+ or `no_certified_threshold` (nothing is certified for this decision type at this risk
123
+ level).
124
+
125
+ A decision layer that cannot refuse is a random generator with calibrated-looking
126
+ outputs. The refusal is the product.
127
 
128
  ## What it decides
129
 
 
137
  | `rate` — rate on your ordered scale | a level id |
138
  | `estimate` — estimate a number in `[low, high]` | a number with an interval |
139
 
140
+ Every result carries `status`, `confidence`, `relevant_context` (the context parts
141
+ behind the answer, most relevant first), `certificate`, `deferral` and `latency_ms`.
142
+ Choice, yes/no and verify results add `abstain_probability` and a conformal
143
+ `prediction_set`.
144
+
145
+ A context is a string, a list of passages, tables with typed numbers and dates, or a
146
+ JSON state. `decide_many` batches many decisions, and every method has an async form.
147
+ The answer space is defined at request time, so new option sets need no retraining.
148
+
149
+ ## Benchmarks
150
+
151
+ Head-to-head against Laya (`convaiinnovations/laya`) and GLiNER2.5-Decide
152
+ (`fastino/GLiNER2.5-Decide`), each run by us on identical records with paired bootstrap
153
+ 95% intervals. Exact-match accuracy at full coverage:
154
+
155
+ | Task | n | MIMIR | Laya | GLiNER | MIMIR − Laya |
156
+ |---|---|---|---|---|---|
157
+ | Banking77 | 3,076 | **0.883** | 0.335 | 0.706 | +0.547 [+0.530, +0.564] |
158
+ | MASSIVE en | 2,974 | **0.866** | 0.443 | 0.643 | +0.423 [+0.403, +0.443] |
159
+ | typed-decisions | 2,000 | **0.725** | 0.361 | 0.487 | +0.363 [+0.332, +0.394] |
160
+ | prompt-injections | 116 | **0.957** | 0.681 | 0.638 | +0.276 [+0.190, +0.362] |
161
+ | XNLI en | 4,995 | **0.828** | 0.676 | 0.398 | +0.152 [+0.137, +0.167] |
162
+ | BoolQ | 3,270 | **0.840** | 0.777 | 0.727 | +0.064 [+0.048, +0.080] |
163
+ | AG News | 7,600 | 0.921 | 0.926 | 0.735 | −0.005 [−0.011, +0.000] |
164
+ | SST-5 | 2,210 | 0.362 | 0.360 | 0.446 | +0.001 [−0.029, +0.033] |
165
+ | fast-decisions | 2,900 | 0.432 | 0.527 | 0.620 | −0.050 [−0.071, −0.030] |
166
+ | DAIR Emotion | 2,000 | 0.080 | 0.589 | 0.562 | −0.508 [−0.530, −0.485] |
167
+
168
+ MIMIR leads decisively on six tasks and ties Laya on AG News and SST-5; GLiNER leads on
169
+ its own fast-decisions showcase. The DAIR row is abstention, not error: the model
170
+ answers "none of the listed options" on 1,792 of 2,000 records (mean abstain mass
171
+ 0.656), because none of the six listed emotions is supported at its calibrated
172
+ abstention level. Forced to pick among the six it scores 0.595, above Laya's 0.589. If
173
+ your pipeline needs a label on every row, read the argmax over the options; if it needs
174
+ honesty, read the abstention.
175
+
176
+ ## The certificate
177
+
178
+ The shipped fp32 policy carries selective thresholds proven on 95,550 held-out records
179
+ at four risk levels, at confidence 0.95. Read the table as a contract: at each risk
180
+ level, on the calls the model chooses to take, its observed error stays under the risk.
181
+
182
+ **Binary, categorical and ranking** (taken / evaluated, observed error on taken calls):
183
+
184
+ | Risk level | Binary | Categorical | Ranking |
185
+ |---|---|---|---|
186
+ | 0.5% | 2,909 of 19,319 (15.1%) · 0.17% err | 15,171 of 54,728 (27.7%) · 0.36% err | defers |
187
+ | 1% | 6,781 of 19,319 (35.1%) · 0.69% err | 19,947 of 54,728 (36.4%) · 0.83% err | 1,441 of 3,863 (37.3%) · 0.35% err |
188
+ | 2% | 8,903 of 19,319 (46.1%) · 1.63% err | 25,917 of 54,728 (47.4%) · 1.76% err | 2,339 of 3,863 (60.5%) · 1.28% err |
189
+ | 5% | 11,173 of 19,319 (57.8%) · 4.45% err | 35,761 of 54,728 (65.3%) · 4.68% err | 3,422 of 3,863 (88.6%) · 1.52% err |
190
+
191
+ **Ordinal** defers at 0.5%, 1% and 2% risk; at 5% it takes 192 of 14,160 records
192
+ (1.04% error). **Multilabel and continuous** defer at every risk level in this release —
193
+ their first testable thresholds fail on held-out data, and shipping them would be
194
+ shipping an unproven promise. The package's default risk level is 1%.
195
+
196
+ Thresholds were fit on the PyTorch model's outputs and transferred to the ONNX graph,
197
+ whose outputs match the model on every decision over 312 verification records (max
198
+ relative readout gap 6.5e-5, zero decision differences).
199
+
200
+ **On your own data and hardware.** The certified configuration is CPU with ONNX Runtime
201
+ 1.30.0. On other runtimes or hardware, either run the shipped 200-record equivalence set
202
+ (the first load does this automatically and requires every decision to match) or
203
+ calibrate your own policy from your own labels:
204
+
205
+ ```python
206
+ from mimir import Mimir
207
+ from mimir.core.labels import LabelledDecision
208
+ from mimir.runtime.calibrate import calibrate
209
+
210
+ model = Mimir.from_pretrained("Mythologic/MIMIR-1")
211
+ labelled: list[LabelledDecision] = [...] # your context/decision/label triples
212
+ policy = calibrate(model, labelled, risk=0.01, confidence=0.95)
213
+ ```
214
+
215
+ `mimir doctor --verify` runs the same equivalence check on demand.
216
+
217
+ ## Integrity
218
 
219
+ Before any model file is read, the package verifies the manifest's Sigstore signature
220
+ against the `abderahmane-ai/mimir` release workflow, checks every file's SHA-256 against
221
+ the manifest, and checks the ONNX graph against its operator allowlist. No pickle is
222
+ used anywhere. The manifest and its signature cover every file below, including the
223
+ licence.
224
 
225
  ## Load paths
226
 
227
+ The release root is the `mimir-decisions` contract (ONNX graphs plus certified policy);
228
+ the same weights ship as plain `transformers` under a subfolder. Only what you load is
229
+ downloaded.
230
 
231
  | Path | Format | Best at |
232
  |---|---|---|
233
+ | **`Mythologic/MIMIR-1`** (repo root) | ONNX graphs + certified policy, via `mimir-decisions` | production: routing, gating, verification |
234
  | **`Mythologic/MIMIR-1`, `subfolder="transformers"`** | same weights for plain `transformers` | research, custom runtimes |
235
 
236
  ### Package mode (recommended)
 
243
  mimir mcp # MCP server: configured decision tools by default
244
  ```
245
 
246
+ Both serve the certified fp32 graph with the shipped policy, so the certificate above
247
  applies to what they return. Adapters for eight agent frameworks, worked examples and
248
+ the full API reference live in the [package repository](https://github.com/abderahmane-ai/mimir).
249
 
250
  ### Transformers mode
251
 
 
263
  ```
264
 
265
  Load plus forward on pre-encoded batches only: text handling, calibration, the server
266
+ and MCP stay in `mimir-decisions`. The staged modelling code holds the inference-only
267
+ head forward — no loss, no training machinery — the same computation the shipped
268
+ `model.onnx` already carries.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
 
270
  ## Speed
271
 
272
+ About **1.7 decisions per second on an Apple M4 CPU**, flat from 1 to 32 concurrent
273
+ clients — the batching absorbs concurrency rather than queueing it. GPU throughput is
274
+ not measured in this release.
275
 
276
  ## Architecture
277
 
278
+ - **Backbone:** a ModernBERT-Large encoder plus a decision head trained from scratch:
279
  question-conditioned state memory, a candidate set processor, and a shared reasoning
280
+ cell applied once per iteration. 419M parameters total.
281
+ - **Typed readouts:** choice, multi-choice, yes/no, verification, ranking, rating and
282
+ estimation, each producing its own typed result.
283
+ - **Budget:** 512-token chunks capped at 256 question tokens; tested to 150 options, 49
284
+ levels and 26,406 context tokens. Larger inputs are refused.
285
+ - **Refusal built in:** an out-of-distribution distance gate, conformal prediction
286
+ sets, selective thresholds with finite-sample certificates, and an evidence mass over
287
+ the context behind every decision.
 
288
 
289
  ## Training
290
 
291
+ Training data and procedure are private. No optimiser state, scheduler state or RNG
292
+ ships with the release; training cannot be resumed from these files.
293
+
294
+ ## Limitations
295
+
296
+ - **English only.** Non-English input is out of distribution.
297
+ - **Certified coverage is selective by design.** Ordinal certifies only at 5% risk;
298
+ multilabel and continuous defer at every level. Under the shipped policy those calls
299
+ come back `DEFERRED` — run them uncertified only if your pipeline accepts an
300
+ uncertified answer, or calibrate your own policy.
301
+ - **Abstention changes accuracy accounting.** On tasks whose listed options frequently
302
+ fail to apply, the model abstains instead of guessing (see DAIR Emotion above). Read
303
+ `ABSTAINED` as an answer, not a wrong one.
304
+ - **The fp16 graph ships without a policy.** There is no CUDA certificate in this
305
+ release; certify it yourself or run the equivalence set first.
306
+ - **One measured speed point.** The 1.7 decisions/s figure is M4 CPU only.
307
 
308
  ## FAQ
309
 
310
+ **Can I use a GPU?**
311
+ Yes, with the fp16 graph — it ships without a policy, so calibrate your own or run the
312
+ equivalence set first. There is no CUDA certificate in this release.
 
 
313
 
314
  **What do I do with ABSTAINED and DEFERRED?**
315
  Route them to a person or a stronger check. Pipelines that treat every call as an answer
316
  turn refusals into someone else's silent default.
317
 
318
+ **Why does ordinal only certify at 5% risk?**
319
+ Its first testable thresholds fail on held-out data at lower risks; at 5% the certified
320
+ slice is small (192 records) with a 1.04% observed error. Multilabel and continuous have
321
+ no certifiable threshold at any level in this release.
 
 
 
322
 
323
  **How do I reproduce the numbers?**
324
  The release carries a 200-record equivalence set: replay the graph on any CPU and every
325
+ shipped decision must match. `mimir doctor --verify` runs it on demand.
326
 
327
  ## Files
328
 
 
335
  | `transformers/modeling_mimir.py`, `transformers/configuration_mimir.py` | the architecture, `transformers` and `torch` only |
336
  | `tokenizer.json` | the 50,368-entry vocabulary |
337
  | `config.json` | variants, limits, layout and graph contract for `mimir-decisions` |
338
+ | `policy/fp32.json` (+ `.npz`) | the certified selective thresholds at four risk levels |
339
  | `equivalence/` | 200 records with inputs, so any CPU replays the graph |
340
  | `LICENSE` | the Mythologic Community Model License |
341
  | `manifest.json` | SHA-256 of every file above |
342
+ | `manifest.json.sigstore` | the Sigstore bundle signing the manifest |
 
343
 
344
  ## Links
345
 
346
+ - Package: [`mimir-decisions` on PyPI](https://pypi.org/project/mimir-decisions/), `from mimir import Mimir`
347
+ - Code: [abderahmane-ai/mimir](https://github.com/abderahmane-ai/mimir) on GitHub, with the
348
+ documentation site at [abderahmane-ai.github.io/mimir](https://abderahmane-ai.github.io/mimir/)
349
+ - MCP Registry: `io.github.abderahmane-ai/mimir`
350
+ - Container: `ghcr.io/abderahmane-ai/mimir`
351
 
352
  ## Licence
353
 
354
+ Mythologic Community License (see [`LICENSE`](LICENSE)): free for research, personal use
355
+ and organisations under $500K annual revenue; commercial use above that needs a
356
+ commercial licence. Contact Mythologic for production, on-premises and indemnity terms.
manifest.json CHANGED
@@ -2,7 +2,7 @@
2
  "format_version": 1,
3
  "files": {
4
  "LICENSE": "f6f9b088ae16499781624e5a760658239100b7ca7bb8fd4a3cc3c61564926163",
5
- "README.md": "f28605b4b6aa2828235f3684c5173e7ac5af78d556c143dcbb89adfdd6a0704c",
6
  "config.json": "10cbc7c171d2ce17fcf214f8ba31e08a8a8f68ea422e7bb92930c719b30c1ce4",
7
  "equivalence/expected.npz": "8317cc5b1e8c1e7168b991fdd030ea7e1eb45fbbbbd7922a07d302876bd67118",
8
  "equivalence/inputs.npz": "53777dff2852935d1009f556834f0607f1a25d9775c215632a13bd544300b29c",
 
2
  "format_version": 1,
3
  "files": {
4
  "LICENSE": "f6f9b088ae16499781624e5a760658239100b7ca7bb8fd4a3cc3c61564926163",
5
+ "README.md": "f05c6102c6326ec3cec6d514752f7b9302497c1151d9897bf800bb4f0ac9e7b4",
6
  "config.json": "10cbc7c171d2ce17fcf214f8ba31e08a8a8f68ea422e7bb92930c719b30c1ce4",
7
  "equivalence/expected.npz": "8317cc5b1e8c1e7168b991fdd030ea7e1eb45fbbbbd7922a07d302876bd67118",
8
  "equivalence/inputs.npz": "53777dff2852935d1009f556834f0607f1a25d9775c215632a13bd544300b29c",