Preview build — illustrative data. All benchmark numbers are seeded placeholders, not real measurements. Nothing here is citable yet.

Adapters

An adapter connects a model to the benchmark. Three patterns cover nearly everything.

The interface

def decide(ctx: CaseContext) -> ChoiceOutput | ScoreOutput | AbstainOutput: ...

CaseContext carries the case text, options, and decision vocabulary — never gold labels. Adapters that need gold labels to function are rejected; the benchmark is blind by construction.

The three patterns

  1. Encoder-head (Laya, Kev) — a classifier head over a frozen encoder. Map the head’s argmax to ChoiceOutput, read logits for ScoreOutput.
  2. Logit-readout (SemIf) — run the base LM, read the logits of the decision tokens, renormalize. The adapter does the renormalization, not the model.
  3. Structured-output API (Jev, LLM baselines) — call the provider with a strict JSON schema, parse the typed decision. Temperature 0, deterministic seeds.

The adapter matrix

TierAdapters
Tier 1 (flagship)Jev, Laya, Kev, SemIf, OpenJev-SGLang
Tier 2 (baselines)GPT-6 Sol/Luna, GPT-5.6 Luna, Grok 4.7, DeepSeek V4.1 Flash, Opus 5.5, Gemini 3.8 Flash, Kimi K3, Claude Fable 5.1
Tier 3 (guardrails)Shieldstral 1.0, Granite Guardian 4.1, WildGuard, Qwen3-Guard, ShieldGemma 2, gpt-oss-safeguard

Writing an adapter

  1. pip install peira
  2. Implement decide(ctx) — see the mock adapter for a worked example
  3. Test offline: peira run --adapter myadapter --suite trial-demo --verify
  4. Full run: peira run --adapter myadapter --suite v1-full --seed 20260923
  5. Seal: peira seal runs/<run-id>.jsonl — the sealed artifact is your submission

Rules: no network calls inside decide except to your own model endpoint; honor timeouts; deterministic seeds; honest abstention (don’t abstain to dodge hard cases — abstention-flip is measured).