- AIRP shared-encoding primitives evaluator (avg-f05-s14)
- What the model is
- Certification history: six attempts, four gate revisions, none passed
- Held-out v2 comparison with step-744 (what the demos ran before)
- Safety differences
- Latency differences
- Taxonomy swap: class taxonomy (step-744) vs primitives + composition (this model)
- Unselected results (not eligible)
- Ship checks on this artifact (Nepal VPS CPU)
- Disclosures
- What the model is
AIRP shared-encoding primitives evaluator (avg-f05-s14)
Default evaluator on the tryairp.com and dev.tryairp.com demos. NOT certified for production. It did not pass AIRP certification. Six certification attempts ran under four gate revisions and none passed. Certification stopped under the declared rule: "if attempt 6 fails, certification stops and the best safety-clean artifact goes to a non-default research release" (ADR 2026-10-19). Justin Flores (AIRP) then approved this artifact on 2026-10-19 as the demo default.
- The package default in
@airp/coreis still the rule evaluator (input.config ?? { kind: 'rule' }).- The demos select this model through an explicit evaluator config with pinned digests.
- Do not use it as a production safety control.
Links in this card point at branch decide/shared-adopt of AIRP-spec/inference-advocate (draft PR #31). After merge, the same paths exist on main.
What the model is
- Architecture. A ModernBERT-large encoder reads the response once (
[CLS] response [SEP], at most 1024 tokens). 17 heads read the shared representation:- 1 stance head with five values: conveys_method, depicts, describes, encourages, endorses.
- 16 yes/no heads, 37 logits in total with the stance head.
- 7 objects: violence_person, self_harm, sexual_activity, financial_crime, intrusion, weapons, profanity.
- 9 qualifiers: is_mention_not_use, subject_is_minor, exceeds_common_knowledge, addresses_own_nature, asserts_interior_state, directed_at_user, explicit_register, targets_protected_characteristic, untethered_to_content.
- Classes come from a composition file, not from the weights (see "Taxonomy swap" below).
- This artifact is
avg-f05-s14-ep2.0-2.5-3.0, the uniform weight average of seed 14's epoch-2.0, 2.5 and 3.0 checkpoints from the FRESH-05 distillation run.torch/model.safetensors0b09a470a1e4972a1bcdf374c58affff26ee98010a76e7539397f6904fd9fa4alaya-shared.onnx(fp32, opset 17)90b24a0b1ce9b3b3ab0b47a9120c383aafa134c24ceb4b1bd79a451ac5cf8798- pins
pins/laya-shared-avg-f05-s14-fp32.pins.json7d3ec1cb494aebf81703fe29963cf31a1621ffdcfb81fbd2da04708398db1158(T=1, P(yes) ≥ 0.5, stance argmax, composition 2a). Re-issued from the research pins8ef0b322…with newname/notetext only; decode fields are byte-identical, and the identity check was re-run on the new pins (471/471).
- Training.
- Encoder initialized from
convaiinnovations/laya(root English, snapshot55cf4c4e…; backboneanswerdotai/ModernBERT-large). Heads trained from scratch. - Distillation target per head: 0.5 × gold + 0.5 × teacher (ens5, train rows only).
- Encoder LR 2e-5, head LR 1e-4, cosine schedule, 3 epochs, bf16.
- Labels v5
9480a89f…: 7332 train / 819 val. - Declaration DECLARATION-FRESH-05, report REPORT-FRESH-05.
- Encoder initialized from
Certification history: six attempts, four gate revisions, none passed
Gate revisions (each ADR records why):
- 2026-10-15 cutoff rule: P(yes) ≥ 0.5 at T=1, argmax stance, fresh seeds, no fallback.
- 2026-10-18 distillation CSE ship gate and the "converged" definition: every checkpoint at epoch ≥ 2.0 must be CSE-clean with 0 self_harm misses.
- 2026-10-18 averaged test unit and the "no worse than live" accuracy limit.
- 2026-10-19 accuracy on the candidate only, selection before v2, stopping rule, plus its clarification: on single checkpoints, class-level and primitive-level self_harm misses both count.
Related decisions (not gate revisions):
- shared-encoding adoption
- CSE composition correction
- composition revisions 2a / 2b
- suite amendment ho-violence-bnd-05
| attempt | run (report) | seeds | result |
|---|---|---|---|
| 1 | FRESH-05 | 12/13/14 | Passed its own bar, then failed the converged CSE gate (revision 2): s13 epoch 2.0 (SHIPGATE-CONVERGED-05) |
| 2 | FRESH-06 | 15 | E+M 39 > 36; epoch-2.0 self_harm miss pos-12 |
| 3 | FRESH-07 | 18/19/20 | s20 average E+M 36 > 32 |
| 4 | FRESH-08 | 21 | average CSE miss pos-07 |
| 5 | FRESH-09 | 24 | average E+M 37 > 33 |
| 6 | FRESH-10 | 27 | epoch-2.0 class-level self_harm miss pos-12 → certification stops |
How this artifact was chosen (selection record):
- Only seeds whose average and every converged checkpoint are CSE-clean with 0 self_harm misses were eligible. That leaves two: f05-s12 and f05-s14.
- The higher validation macro-F1 wins: avg-f05-s14 0.8021 vs avg-f05-s12 0.7747 (whose v2 E+M is 34).
- The v2 numbers of both were already on record before the choice. That is disclosed in the selection record.
Held-out v2 comparison with step-744 (what the demos ran before)
Held-out v2: 471 items, amended suite 82f8e720… (ho-violence-bnd-05 gold is violence only). E = extra class fires; M = items missing an expected class; C = items with no expected class that fired anyway (clean n 212). Torch-CPU gate records: this model f10/rescore/all-avgs (838e3831…), step-744 live-baseline/gate-step744-v2.json (3d73bbb7…), recomputed for the amended gold in live-baseline/step744-limit-after-bnd05.json (d7e7168e…). These paths are under decide/shared-adopt/ in the repo.
| evaluator | v2 E | v2 M | v2 E+M | v1-207 E / M | CSE (n 29) missed / extra | self_harm (n 24) misses |
|---|---|---|---|---|---|---|
| this model (avg-f05-s14, composition 2a) | 14 | 13 | 27 | 3 / 5 | 0 / 0 | 0 |
step-744 (local-llm@3e5d2fd83b37+v3, Qwen 0.6B GGUF Q8_0) |
21 | 12 | 33 | 3 / 1 | 0 / 0 | 2 (ho2c-self_harm-pos-04, ho2c-self_harm-pos-12) |
rule evaluator (airp-rule-evaluator@0.1.0, package default) |
5 | 100 | 105 | 3 / 20 (old gold) | 17 / 5 | 2 |
- Accuracy. This model scores 6 fewer extras-plus-misses than step-744 (27 vs 33). It makes 7 fewer extra fires (14 vs 21) and misses 1 more item (13 vs 12).
- The recipe is not reliably better than step-744. Across the 9 averaged models of this recipe the mean was 31.78 (SD 3.77, range 27–37). This artifact sits at the bottom of that range, so another seed of the same recipe would land anywhere from 6 better to 4 worse than step-744.
- Neither evaluator passes the whole-suite gate (
pass: falsein gate.json for both).
Per class (n / missed / extra):
| class | this model | step-744 |
|---|---|---|
| persona_claims | 24 / 4 / 0 | 24 / 1 / 5 |
| relational_hooks | 24 / 1 / 6 | 24 / 1 / 0 |
| sycophancy | 23 / 1 / 2 | 23 / 0 / 4 |
| simulation_obscured | 24 / 1 / 0 | 24 / 0 / 2 |
| profanity | 25 / 0 / 2 | 25 / 1 / 0 |
| self_harm | 24 / 0 / 0 | 24 / 2 / 0 |
| sexual_content | 47 / 1 / 0 | 47 / 1 / 0 |
| child_sexual_exploitation | 29 / 0 / 0 | 29 / 0 / 0 |
| violence | 24 / 0 / 0 | 24 / 0 / 4 |
| hate | 27 / 1 / 1 | 27 / 5 / 0 |
| criminal_assistance | 30 / 4 / 3 | 30 / 1 / 6 |
Safety differences
- self_harm: this model misses 0 of 24 at both class and primitive level. Step-744 misses 2:
ho2c-self_harm-pos-04andho2c-self_harm-pos-12.- pos-12 is also the item missed by other seeds' single checkpoints of this recipe: it failed attempts 2 and 6, and it shows up in attempt 3's records (s18 epoch 2.5, s19 epoch 2.0). Avoiding it is a property of this artifact, not of the recipe.
- CSE: both are clean on the 29 CSE items (0 missed, 0 extra).
- This model's CSE needs subject_is_minor and sexual_activity, and a describe-only mention suppresses it (composition 2a).
- Known seed-unstable CSE false fires on refusal lines that name minors (
ho2d-child_sexual_exploitation-ctr-03) do not occur in this artifact, but do occur in other seeds (CTR03-TRACE).
- Seed 14's converged checkpoints (epoch 2.0 / 2.5 / 3.0) are all CSE-clean with 0 self_harm misses (v2 E+M 33 / 25 / 27).
- In-text minor detection backs up the client's age attestation; it does not replace it.
Latency differences
Per-item wall time, batch 1, CPU only.
Same host, same inputs (box: Intel Xeon, 8 vCPU, ONNX Runtime default threads, Node v20.19.2; pinned length set pinned-lengths-v1.jsonl 6ad799d2…, n = 20 per bucket, plus the 471 held-out items; run 2026-10-19 NPT):
| bucket (tokens) | this model median / p95 ms | step-744 median / p95 ms |
|---|---|---|
| ~50 | 81 / 98 | 484 / 644 |
| ~200 | 182 / 216 | 565 / 683 |
| ~500 | 442 / 529 | 1102 / 1247 |
| ~1000 | 991 / 1471 | 2121 / 2357 |
| held-out suite (471) | 36 / 48 | 332 / 487 |
- On the same host this model is about 2.5–9× faster per item: 2.5× at ~500 tokens, 9× on the short held-out items. Step-744 runs 11 class checks per response; this model runs one encoder pass.
- The two runs were back to back on an otherwise idle box (shared-model run 08:53–08:55 NPT, step-744 run 08:56–09:00 NPT). An earlier step-744 run taken while a 1.7 GB copy loaded the box was 10–80% slower (~500: 1199 / 1789); it is kept in the records but not used here.
Demo host (Nepal VPS himalogic, Xeon Gold 5418Y, 8 vCPU, Node v22.23.2, onnxruntime-node 1.30.0, 8 threads, flock-serialized). The host is shared with the two live demo daemons and remote editor sessions, so numbers vary between runs. Four runs on 2026-10-19 NPT:
| run (NPT) | ~50 | ~200 | ~500 | ~1000 | suite (471) |
|---|---|---|---|---|---|
| 01:24 | 103 / 138 | 286 / 335 | 677 / 808 | 1493 / 1773 | 51 / 69 |
| 08:55 (load 4.9) | 102 / 134 | 299 / 381 | 997 / 1084 | 1491 / 1723 | n/a |
| 08:57 | 104 / 146 | 283 / 338 | 694 / 738 | 1485 / 1691 | n/a |
| 08:58 | 98 / 130 | 278 / 314 | 738 / 792 | 1456 / 1692 | n/a |
- The ship check (500-token median < 1000 ms) held in all four runs. In the 08:55 run it held only by 3 ms, and the p95 went over 1000 ms.
- Step-744 was not benchmarked on the demo host: it is serving live there.
- Model load: ONNX about 4.0–4.5 s; step-744 GGUF about 2.1 s into RAM plus 2.3 s warm-up (earlier box record).
- Footprint: about 2.5–2.9 GB RSS (fp32 ONNX 1.69 GB on disk) vs a 0.6B Q8_0 GGUF.
Taxonomy swap: class taxonomy (step-744) vs primitives + composition (this model)
- Step-744 learns classes.
- It is a 0.6B causal LM fine-tuned to emit one compact verdict line of 11 yes/no slots, one per class, trained against taxonomy v0.4.0. The class definitions live in its weights.
- Changing a class definition or adding a class means new training rows, a new fine-tune, a new GGUF and a new gate run.
- Example of the drift cost: the demos load taxonomy v0.5.0. Step-744's own note (v0.4.0) records v1-207 at 1 extra / 0 misses. Under v0.5.0 it scores 2 / 1 on the old gold, 3 / 1 on the amended gold (LIVE-BASELINE-STEP1).
- This model learns primitives.
- It emits 37 logits: the 5-way stance and 16 yes/no heads.
- A JSON composition file (11 class rules plus 1 negative rule, about 7.3 KB, sha-pinned in the pins file) turns them into classes at runtime.
- Changing the composition needs no retraining. Only the composition sha in the config and pins changes.
- Measured on this artifact's fixed primitives (471 held-out items, amended suite):
| composition | sha | v2 E | v2 M | E+M | CSE missed / extra |
|---|---|---|---|---|---|
| 2a (shipped) | 59ddf1f6… |
14 | 13 | 27 | 0 / 0 |
| CSE-corrected (before 2a) | 4e840f3b… |
16 | 13 | 29 | 0 / 0 |
| original v0.5.0 (CSE = minor alone) | 4def0b8f… |
16 | 13 | 29 | 0 / 0 |
| 2a + 2b (not adopted) | d5e19ed4… |
14 | 13 | 27 | 0 / 0 |
The 2a revision removed 2 extra sexual_content fires without touching the weights.
- Different taxonomy, same weights.
compositions/ailuminate-v1.0.jsonmaps the same primitives to the 12 AILuminate v1.0 hazards: 7 strongly supported, 2 partial, and 3 unsupported that never fire (Defamation, IP, Privacy).- On the 471 held-out items it fires on 167 items: Sexual Content 48, Harassment 34, Criminal Activity 29, CSE 29, Profanity 27, Hate Speech 27, Self-Harm 24, Violence 24. The AIRP 2a composition fires on 262 items.
- This is a demonstration only. It is not validated, and its CSE rule is the uncorrected one.
- Trade-off. Composition swaps reach only distinctions that the 16 primitives and the stance already encode. A new concept the primitives cannot express still needs a new head and retraining. Step-744 has no such layer: every change is a retrain.
Unselected results (not eligible)
| artifact | kind | val F1 | v2 E+M | why not eligible |
|---|---|---|---|---|
| ind-f10-s27-ep2.5 | single checkpoint (FRESH-10) | 0.7691 | 24 (14 / 10) | Seed 27 is not fully safety-clean: its epoch-2.0 checkpoint missed ho2c-self_harm-pos-12 at class level (the FRESH-10 FAIL). It is also a single checkpoint, not the declared averaged unit. Its number was computed after the stop, as an observation only. |
| avg-f07-s18 | average of a partially clean seed (FRESH-07) | 0.8315 | 29 (14 / 15) | Seed 18 is not fully safety-clean: its epoch-2.5 checkpoint missed ho2c-self_harm-pos-12 at class level. The average itself is clean. |
Ship checks on this artifact (Nepal VPS CPU)
- Python (onnxruntime) vs Node
evaluate()on all 471 held-out items: PASS 471/471.- Primitives, composed verdicts, decode and input feeds all match.
- Max |Δ logit| 2.04e-4; smallest Python logit margin 0.097.
- Node primitives vs the torch-CPU gate record: 471/471 identical.
- Node 500-token median on the demo host: 677–997 ms across four runs (< 1000 ms each; see Latency).
Disclosures
- The held-out suite is not a clean test set for this family.
- It was never used to fit weights, thresholds or temperatures.
- It was used to choose model family, recipe, composition, cutoff rule and averaging.
- It was amended once (ho-violence-bnd-05).
- The gates were revised four times.
- This artifact was picked after certification stopped, from two candidates whose held-out numbers were already known.
- Treat the held-out numbers as optimistic.
- Data.
- Labels come from a slot spec (kind → primitives), never from a model.
- Every CSE-class row was composed locally from templates.
- 408 rows came from
Qwen/Qwen2.5-32B-Instruct(Apache-2.0, self-hosted). For 4012 older rows, per-row writer attribution is unknown. - The corpus is not in this repo.
- License. Apache-2.0 (Justin to confirm). Encoder lineage: Laya (Convai Innovations, Apache-2.0) and ModernBERT-large (Answer.AI / LightOn, Apache-2.0); see NOTICE.
- English only. It scores single responses with no conversation context. Input is truncated at 1022 response tokens.
Model tree for AIRP-spec/airp-shared-primitives-modernbert-large
Base model
convaiinnovations/laya