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/core is 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.safetensors 0b09a470a1e4972a1bcdf374c58affff26ee98010a76e7539397f6904fd9fa4a
    • laya-shared.onnx (fp32, opset 17) 90b24a0b1ce9b3b3ab0b47a9120c383aafa134c24ceb4b1bd79a451ac5cf8798
    • pins pins/laya-shared-avg-f05-s14-fp32.pins.json 7d3ec1cb494aebf81703fe29963cf31a1621ffdcfb81fbd2da04708398db1158 (T=1, P(yes) ≥ 0.5, stance argmax, composition 2a). Re-issued from the research pins 8ef0b322… with new name/note text 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, snapshot 55cf4c4e…; backbone answerdotai/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.

Certification history: six attempts, four gate revisions, none passed

Gate revisions (each ADR records why):

  1. 2026-10-15 cutoff rule: P(yes) ≥ 0.5 at T=1, argmax stance, fresh seeds, no fallback.
  2. 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.
  3. 2026-10-18 averaged test unit and the "no worse than live" accuracy limit.
  4. 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):

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: false in 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-04 and ho2c-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.json maps 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.
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for AIRP-spec/airp-shared-primitives-modernbert-large

Finetuned
(197)
this model