openvibers/openvibe.contracts Commits
openvibe-contracts 0.422.0: one evaluation loop (entrants, matches, model/harness factors, blind plays) (#476)
Changes
@@@ -1,5 +1,37 @@# Changelog++## 0.422.0 — 2026-11-13++++**One evaluation loop: entrants, matches, and ratings that separate the model from the harness**++(compare-arena-ecosystem.md). The owner, 11-13: the Arena "should still use our multi purpose shared universal agentic++multi harness system", and comparisons should do "harness vs harness and model vs model … better".++++- **`bench.entrant@1`:** what competes.++ - Kinds: a `model` (on the neutral harness), a `harness` (over a fixed model panel), an `agent` (harness + model +++ settings, a blueprint version), or a `product`.++ - Stable ids: `model:…`, `harness:…@version`, `agent:harness+model#confighash`, `product:…`.++- **`bench.match@1`:** one task given to two or more entrants under the same budget.++ - Each side carries its receipts: cost, tokens, TTFT, TPS, wall time, tool calls, and the length and markdown style++ covariates.++ - `shown` records the order the sides were displayed in; `blind` records whether names were hidden.++ - Judgements come from `human_pairwise`, `audience_poll`, `implicit` (merged, accepted, copied, kept, retried,++ stopped, edited), `test_suite`, `rubric` and `game_outcome`. A voter is a keyed hash with a quality weight, never++ an id.++ - Sources: arena, chat, codes, live, games, exchange, space, bench and check jobs.++- **`bench.rating@1` 1.1.0** (all optional):++ - `entrant_kind` and `style_control`;++ - `factors`: an agent's strength split into model, harness and interaction, each with an interval;++ - `cost_per_solved_usd`, `tokens_per_task`, `ttft_ms` and `tps` percentiles, `reliability` (pass^k), `matches`,++ `as_of`.++- **Event `bench.match.recorded` v1**, produced by Bench.++- **`agents.play@1` 1.1.0:** `blind` hides the roles' names until the first judgement. This is the race play an Arena++ round runs on the agent engine.++- **Fixtures:**++ - entrants: an agent, a harness, a model;++ - matches: an Arena vote, and a Codes race judged by its tests and then merged;++ - a rating with its factors;++ - invalid: an agent without its harness, a kind nobody has, a one-sided match, an unknown judge.++## 0.421.0 — 2026-11-12**Every AI call, measured everywhere** (ai-metrics.md).@@@ -229,6 +229,11 @@"maxLength": 160}}++ },++ "blind": {++ "type": "boolean",++ "default": false,++ "description": "1.1.0 (2026-11-13): the roles' models, harnesses and names are hidden from the person until the play's first judgement (the race play an Arena round runs: one child run per entrant, the same budget, the names after the vote)."}}}nnew file mode 100644@@@ -0,0 +1,63 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/bench/entrant.v1.json",++ "title": "BenchEntrant",++ "description": "bench.entrant@1 (compare-arena-ecosystem.md, 2026-11-13): what competes in a match. KIND says which: a MODEL alone (on the neutral harness), a HARNESS alone (rated over a fixed model panel), an AGENT (a harness with a model and its settings, the way people run it; CONFIG_HASH or BLUEPRINT pins the settings) or a PRODUCT (a builder people use whole). ID is the entrant's stable name: model:<model>, harness:<harness>@<version>, agent:<harness>+<model>#<config hash>, product:<slug>. Every rating and every number on a page names the entrant's kind, so a model's score is never shown without its harness.",++ "type": "object",++ "additionalProperties": false,++ "required": ["id", "kind", "label"],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^(model:[A-Za-z0-9._/:-]{1,200}|harness:[a-z0-9][a-z0-9._-]{0,60}@[A-Za-z0-9._-]{1,40}|agent:[a-z0-9][a-z0-9._-]{0,60}\\+[A-Za-z0-9._/:-]{1,200}#[a-f0-9]{8,64}|product:[a-z0-9][a-z0-9-]{0,60})$"++ },++ "kind": { "enum": ["model", "harness", "agent", "product"] },++ "label": { "type": "string", "minLength": 1, "maxLength": 160 },++ "model": {++ "type": "object",++ "additionalProperties": false,++ "required": ["id"],++ "properties": {++ "id": { "type": "string", "minLength": 1, "maxLength": 200 },++ "provider": { "type": ["string", "null"], "maxLength": 120 },++ "maker": { "type": ["string", "null"], "maxLength": 120 },++ "family": { "type": ["string", "null"], "maxLength": 80, "description": "The model family, so the matchmaker can avoid pairing two of one family." }++ }++ },++ "harness": {++ "type": "object",++ "additionalProperties": false,++ "required": ["id", "version"],++ "properties": {++ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,60}$", "description": "claude-code, codex, opencode, goose, gemini-cli, aider, openvibe (the engine's own loop), ov-bare (the neutral harness) …" },++ "version": { "type": "string", "minLength": 1, "maxLength": 40 }++ }++ },++ "config_hash": { "type": ["string", "null"], "pattern": "^[a-f0-9]{8,64}$", "description": "An agent's settings (tools, effort, prompts) hashed, so a change of settings is a new entrant." },++ "blueprint": {++ "type": ["object", "null"],++ "additionalProperties": false,++ "required": ["id", "version"],++ "properties": {++ "id": { "type": "string", "minLength": 1, "maxLength": 120 },++ "version": { "type": "integer", "minimum": 1 }++ },++ "description": "An agent made as agents.blueprint@1: the blueprint and its version."++ },++ "owner": {++ "type": ["object", "null"],++ "additionalProperties": false,++ "required": ["type", "id"],++ "properties": {++ "type": { "enum": ["network", "user", "community"] },++ "id": { "type": "string", "minLength": 1, "maxLength": 160 }++ },++ "description": "Who entered it: the network's own catalogue, a person's agent or a community machine."++ }++ },++ "allOf": [++ { "if": { "properties": { "kind": { "const": "model" } } }, "then": { "required": ["model"] } },++ { "if": { "properties": { "kind": { "const": "harness" } } }, "then": { "required": ["harness"] } },++ { "if": { "properties": { "kind": { "const": "agent" } } }, "then": { "required": ["model", "harness"] } }++ ]++}nnew file mode 100644@@@ -0,0 +1,102 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/bench/match.v1.json",++ "title": "BenchMatch",++ "description": "bench.match@1 (compare-arena-ecosystem.md, 2026-11-13): one task given to two or more entrants under the same budget and machine class, the receipts of each side, and every judgement that came in. Every comparison on the network is one: an Arena vote, a Chat draft picked, a Codes race whose patch was merged, a check job's tests, a rubric model, a game, a Live chat's poll. SOURCE says where it came from; SLOTS are the sides (a, b, …) with the entrant, the run that answered and its receipts; SHOWN is the order the sides were shown in (position bias is modelled, never ignored); BLIND says whether the names were hidden until the first judgement. OpenVibe.Bench keeps matches and rates entrants from them (bench.rating@1).",++ "type": "object",++ "additionalProperties": false,++ "required": ["id", "source", "task", "slots", "judgements", "at"],++ "properties": {++ "id": { "type": "string", "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$" },++ "source": { "enum": ["arena", "chat", "codes", "live", "games", "exchange", "space", "bench", "check"] },++ "task": {++ "type": "object",++ "additionalProperties": false,++ "required": ["kind"],++ "properties": {++ "kind": { "enum": ["chat", "code", "design", "image", "speech", "search", "computer", "game"] },++ "category": { "type": ["string", "null"], "pattern": "^[a-z][a-z0-9._-]{0,60}$", "description": "What the task is about, from the classifier (code.debug, writing.email, math …), so boards are per category." },++ "prompt_hash": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$", "description": "sha256 of the prompt: dedupe and the private pool, never the prompt itself." },++ "prompt": { "type": ["string", "null"], "maxLength": 20000, "description": "Only when the asker opted in to share it (PUBLIC true)." },++ "public": { "type": "boolean", "default": false },++ "repo": { "type": ["string", "null"], "maxLength": 300 },++ "sha": { "type": ["string", "null"], "pattern": "^[a-f0-9]{40}$" },++ "suite": { "type": ["string", "null"], "maxLength": 120, "description": "A Bench suite and task id, when the task came from one." }++ }++ },++ "slots": {++ "type": "array",++ "minItems": 2,++ "maxItems": 8,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": ["slot", "entrant"],++ "properties": {++ "slot": { "type": "string", "pattern": "^[a-h]$" },++ "entrant": { "type": "string", "minLength": 1, "maxLength": 300, "description": "A bench.entrant@1 id." },++ "run_id": { "type": ["string", "null"], "maxLength": 120, "description": "The agents.run@1 (or AI run) that answered, so its steps and receipts can be read." },++ "receipts": {++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "outcome": { "enum": ["succeeded", "failed", "timed_out", "refused", "cancelled"] },++ "cost_usd": { "type": ["number", "null"], "minimum": 0 },++ "tokens_in": { "type": ["integer", "null"], "minimum": 0 },++ "tokens_out": { "type": ["integer", "null"], "minimum": 0 },++ "ttft_ms": { "type": ["number", "null"], "minimum": 0 },++ "tps": { "type": ["number", "null"], "minimum": 0 },++ "wall_ms": { "type": ["number", "null"], "minimum": 0 },++ "tool_calls": { "type": ["integer", "null"], "minimum": 0 },++ "length_chars": { "type": ["integer", "null"], "minimum": 0, "description": "The answer's length, a style covariate." },++ "markdown_items": { "type": ["integer", "null"], "minimum": 0, "description": "Headings, lists and bold spans in the answer, a style covariate." }++ }++ }++ }++ }++ },++ "shown": { "type": "array", "items": { "type": "string", "pattern": "^[a-h]$" }, "maxItems": 8, "description": "The order the sides were shown in, left to right or top to bottom." },++ "blind": { "type": "boolean", "default": true },++ "budget": {++ "type": ["object", "null"],++ "additionalProperties": false,++ "properties": {++ "usd": { "type": ["number", "null"], "minimum": 0 },++ "ms": { "type": ["integer", "null"], "minimum": 0 },++ "machine_class": { "type": ["string", "null"], "maxLength": 60 }++ },++ "description": "The same for every side: a match between unequal budgets is not a match."++ },++ "judgements": {++ "type": "array",++ "maxItems": 200,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": ["judge", "at"],++ "properties": {++ "judge": { "enum": ["human_pairwise", "audience_poll", "implicit", "test_suite", "rubric", "game_outcome"] },++ "winner": { "type": ["string", "null"], "pattern": "^([a-h]|tie|both_bad)$" },++ "scores": { "type": ["object", "null"], "propertyNames": { "pattern": "^[a-h]$" }, "additionalProperties": { "type": "number" }, "description": "Per side: tests passed (0..1), a rubric score, a game's points." },++ "signal": { "type": ["string", "null"], "enum": [null, "merged", "accepted", "copied", "kept", "retried", "stopped", "edited"], "description": "An implicit judge's signal: what the person did with a side." },++ "votes": { "type": ["object", "null"], "propertyNames": { "pattern": "^([a-h]|tie)$" }, "additionalProperties": { "type": "integer", "minimum": 0 }, "description": "An audience poll's counts." },++ "by": {++ "type": ["object", "null"],++ "additionalProperties": false,++ "required": ["type"],++ "properties": {++ "type": { "enum": ["person", "audience", "model", "suite", "game"] },++ "id_hash": { "type": ["string", "null"], "pattern": "^[a-f0-9]{16,64}$", "description": "A keyed hash of who judged, for rate limits and voter quality; never the person's id." },++ "model": { "type": ["string", "null"], "maxLength": 200, "description": "A rubric judge's model (of another family than the sides)." }++ }++ },++ "weight": { "type": ["number", "null"], "minimum": 0, "maximum": 1, "description": "The voter's quality weight when the judgement was counted (gold pairs, agreement)." },++ "style_note": { "type": ["string", "null"], "maxLength": 200 },++ "at": { "type": "string", "format": "date-time" }++ }++ }++ },++ "play": { "type": ["object", "null"], "additionalProperties": false, "required": ["id"], "properties": { "id": { "type": "string" }, "run_id": { "type": ["string", "null"] } }, "description": "The race play and its parent run, when the match was run on the agent engine." },++ "at": { "type": "string", "format": "date-time" }++ }++}@@@ -2,7 +2,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/bench/rating.v1.json","title": "BenchRating",-- "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.",++ "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.","type": "object","additionalProperties": false,"required": ["kind_id", "category", "subject", "elo", "games", "wins", "losses", "ties", "win_rate", "ci_lower", "ci_upper"],@@@ -18,6 +18,16 @@"win_rate": { "type": "number" },"ci_lower": { "type": "number" },"ci_upper": { "type": "number" },++ "entrant_kind": { "enum": ["model", "harness", "agent", "product"] },++ "style_control": { "type": "boolean" },++ "factors": { "type": ["object", "null"], "additionalProperties": false, "properties": { "model": { "type": "object", "additionalProperties": false, "required": ["score"], "properties": { "score": { "type": "number" }, "ci_lower": { "type": ["number", "null"] }, "ci_upper": { "type": ["number", "null"] } } }, "harness": { "type": "object", "additionalProperties": false, "required": ["score"], "properties": { "score": { "type": "number" }, "ci_lower": { "type": ["number", "null"] }, "ci_upper": { "type": ["number", "null"] } } }, "interaction": { "type": "object", "additionalProperties": false, "required": ["score"], "properties": { "score": { "type": "number" }, "ci_lower": { "type": ["number", "null"] }, "ci_upper": { "type": ["number", "null"] } } } }, "description": "An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale." },++ "matches": { "type": "integer", "minimum": 0 },++ "cost_per_solved_usd": { "type": ["number", "null"], "minimum": 0 },++ "tokens_per_task": { "type": ["number", "null"], "minimum": 0 },++ "ttft_ms": { "type": ["object", "null"], "additionalProperties": false, "properties": { "p50": { "type": ["number", "null"], "minimum": 0 }, "p95": { "type": ["number", "null"], "minimum": 0 }, "n": { "type": "integer", "minimum": 0 } } },++ "tps": { "type": ["object", "null"], "additionalProperties": false, "properties": { "p50": { "type": ["number", "null"], "minimum": 0 }, "p95": { "type": ["number", "null"], "minimum": 0 }, "n": { "type": "integer", "minimum": 0 } } },++ "reliability": { "type": ["object", "null"], "additionalProperties": false, "required": ["k", "pass_k"], "properties": { "k": { "type": "integer", "minimum": 1 }, "pass_k": { "type": "number", "minimum": 0, "maximum": 1 } }, "description": "pass^k: the share of tasks solved on all k tries." },++ "as_of": { "type": "string", "format": "date-time" },"median_cost_usd": { "type": ["number", "null"] },"median_ms": { "type": ["number", "null"] },"provisional": { "type": "boolean" }@@@ -9602,13 +9602,31 @@},{"id": "bench.rating",-- "version": "1.0.0",++ "version": "1.1.0","owner": "bench","schema": "bench/rating.v1.json","visibility": "first-party","compatibility": "backward","status": "active"},++ {++ "id": "bench.entrant",++ "version": "1.0.0",++ "owner": "bench",++ "schema": "bench/entrant.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "bench.match",++ "version": "1.0.0",++ "owner": "bench",++ "schema": "bench/match.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "bench.round.finished","version": "1.0.0",@@@ -9627,6 +9645,15 @@"compatibility": "backward","status": "active"},++ {++ "id": "bench.match.recorded",++ "version": "1.0.0",++ "owner": "bench",++ "schema": "events/payloads/bench.match.recorded.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },{"id": "bench.rating.changed","version": "1.0.0",@@@ -11858,7 +11885,7 @@},{"id": "agents.play",-- "version": "1.0.0",++ "version": "1.1.0","owner": "network","schema": "agents/play.v1.json","visibility": "public",nnew file mode 100644@@@ -0,0 +1,84 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/bench.match.recorded.v1.json",++ "title": "BenchMatchRecordedPayload",++ "description": "bench.match.recorded v1 (OpenVibe.Bench, 2026-11-13): a match was recorded or gained a judgement. Envelope: source bench, subject { type: match, id: <match id> }. The payload names the match, its source, its task kind and category, its entrants and the judges so far; the match itself (bench.match@1) is read from Bench. Report keeps the open ledger from these; the AI router and Run's Dispatcher refresh their priors from bench.rating.changed.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "match_id",++ "source",++ "task_kind",++ "entrants",++ "judges",++ "at"++ ],++ "properties": {++ "match_id": {++ "type": "string",++ "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "source": {++ "enum": [++ "arena",++ "chat",++ "codes",++ "live",++ "games",++ "exchange",++ "space",++ "bench",++ "check"++ ]++ },++ "task_kind": {++ "enum": [++ "chat",++ "code",++ "design",++ "image",++ "speech",++ "search",++ "computer",++ "game"++ ]++ },++ "category": {++ "type": [++ "string",++ "null"++ ]++ },++ "entrants": {++ "type": "array",++ "minItems": 2,++ "maxItems": 8,++ "items": {++ "type": "string"++ }++ },++ "judges": {++ "type": "array",++ "items": {++ "enum": [++ "human_pairwise",++ "audience_poll",++ "implicit",++ "test_suite",++ "rubric",++ "game_outcome"++ ]++ }++ },++ "winner_entrant": {++ "type": [++ "string",++ "null"++ ]++ },++ "at": {++ "type": "string",++ "format": "date-time"++ }++ }++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "id": "model:x",++ "kind": "robot",++ "label": "x"++}nnew file mode 100644@@@ -0,0 +1,8 @@++{++ "id": "agent:codex+gpt-5-mini#3f9a1c22",++ "kind": "agent",++ "label": "Codex with GPT-5 mini",++ "model": {++ "id": "gpt-5-mini"++ }++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "id": "harness:[email protected]",++ "kind": "harness",++ "label": "OpenCode",++ "harness": {++ "id": "opencode",++ "version": "1.4.2"++ }++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "id": "model:deepseek-flash",++ "kind": "model",++ "label": "DeepSeek Flash",++ "model": {++ "id": "deepseek-flash",++ "provider": "deepseek",++ "family": "deepseek"++ }++}nnew file mode 100644@@@ -0,0 +1,16 @@++{++ "id": "agent:codex+gpt-5-mini#3f9a1c22",++ "kind": "agent",++ "label": "Codex with GPT-5 mini",++ "model": {++ "id": "gpt-5-mini",++ "provider": "openai",++ "maker": "OpenAI",++ "family": "gpt"++ },++ "harness": {++ "id": "codex",++ "version": "0.98.0"++ },++ "config_hash": "3f9a1c22"++}nnew file mode 100644@@@ -0,0 +1 @@++{"match_id": "mat_01KA0000000000000000000000", "source": "arena", "task_kind": "chat", "entrants": ["model:deepseek-flash"], "judges": ["human_pairwise"], "at": "2026-11-13T02:00:00Z"}nnew file mode 100644@@@ -0,0 +1,15 @@++{++ "match_id": "mat_01KA0000000000000000000000",++ "source": "arena",++ "task_kind": "chat",++ "category": "writing.email",++ "entrants": [++ "model:deepseek-flash",++ "model:gpt-5-mini"++ ],++ "judges": [++ "human_pairwise"++ ],++ "winner_entrant": "model:deepseek-flash",++ "at": "2026-11-13T02:00:00Z"++}nnew file mode 100644@@@ -0,0 +1,71 @@++{++ "id": "mat_01KA0000000000000000000000",++ "source": "arena",++ "task": {++ "kind": "chat",++ "category": "writing.email",++ "prompt_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",++ "public": false++ },++ "slots": [++ {++ "slot": "a",++ "entrant": "model:deepseek-flash",++ "run_id": "run_01KA0000000000000000000001",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.0004,++ "tokens_in": 120,++ "tokens_out": 300,++ "ttft_ms": 540,++ "tps": 86,++ "wall_ms": 4100,++ "length_chars": 1210,++ "markdown_items": 3++ }++ },++ {++ "slot": "b",++ "entrant": "model:gpt-5-mini",++ "run_id": "run_01KA0000000000000000000002",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.0011,++ "tokens_in": 120,++ "tokens_out": 280,++ "ttft_ms": 820,++ "tps": 61,++ "wall_ms": 5300,++ "length_chars": 980,++ "markdown_items": 0++ }++ }++ ],++ "shown": [++ "b",++ "a"++ ],++ "blind": true,++ "budget": {++ "usd": 0.01,++ "ms": 60000,++ "machine_class": null++ },++ "judgements": [++ {++ "judge": "vibes",++ "winner": "a",++ "by": {++ "type": "person",++ "id_hash": "0123456789abcdef"++ },++ "weight": 0.9,++ "at": "2026-11-13T02:00:00Z"++ }++ ],++ "play": {++ "id": "race",++ "run_id": "run_01KA0000000000000000000000"++ },++ "at": "2026-11-13T01:59:30Z"++}nnew file mode 100644@@@ -0,0 +1,55 @@++{++ "id": "mat_01KA0000000000000000000000",++ "source": "arena",++ "task": {++ "kind": "chat",++ "category": "writing.email",++ "prompt_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",++ "public": false++ },++ "slots": [++ {++ "slot": "a",++ "entrant": "model:deepseek-flash",++ "run_id": "run_01KA0000000000000000000001",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.0004,++ "tokens_in": 120,++ "tokens_out": 300,++ "ttft_ms": 540,++ "tps": 86,++ "wall_ms": 4100,++ "length_chars": 1210,++ "markdown_items": 3++ }++ }++ ],++ "shown": [++ "b",++ "a"++ ],++ "blind": true,++ "budget": {++ "usd": 0.01,++ "ms": 60000,++ "machine_class": null++ },++ "judgements": [++ {++ "judge": "human_pairwise",++ "winner": "a",++ "by": {++ "type": "person",++ "id_hash": "0123456789abcdef"++ },++ "weight": 0.9,++ "at": "2026-11-13T02:00:00Z"++ }++ ],++ "play": {++ "id": "race",++ "run_id": "run_01KA0000000000000000000000"++ },++ "at": "2026-11-13T01:59:30Z"++}nnew file mode 100644@@@ -0,0 +1,57 @@++{++ "id": "mat_01KA0000000000000000000003",++ "source": "codes",++ "task": {++ "kind": "code",++ "category": "code.bugfix",++ "repo": "https://github.com/OpenVibers/OpenVibe.Compare",++ "sha": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"++ },++ "slots": [++ {++ "slot": "a",++ "entrant": "agent:codex+gpt-5-mini#3f9a1c22",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.21,++ "wall_ms": 312000,++ "tool_calls": 41++ }++ },++ {++ "slot": "b",++ "entrant": "agent:opencode+glm-5.3#9b7e2d10",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.09,++ "wall_ms": 401000,++ "tool_calls": 57++ }++ }++ ],++ "blind": false,++ "judgements": [++ {++ "judge": "test_suite",++ "scores": {++ "a": 1,++ "b": 0.8++ },++ "by": {++ "type": "suite"++ },++ "at": "2026-11-13T02:10:00Z"++ },++ {++ "judge": "implicit",++ "winner": "a",++ "signal": "merged",++ "by": {++ "type": "person",++ "id_hash": "fedcba9876543210"++ },++ "at": "2026-11-13T02:30:00Z"++ }++ ],++ "at": "2026-11-13T02:00:00Z"++}nnew file mode 100644@@@ -0,0 +1,71 @@++{++ "id": "mat_01KA0000000000000000000000",++ "source": "arena",++ "task": {++ "kind": "chat",++ "category": "writing.email",++ "prompt_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",++ "public": false++ },++ "slots": [++ {++ "slot": "a",++ "entrant": "model:deepseek-flash",++ "run_id": "run_01KA0000000000000000000001",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.0004,++ "tokens_in": 120,++ "tokens_out": 300,++ "ttft_ms": 540,++ "tps": 86,++ "wall_ms": 4100,++ "length_chars": 1210,++ "markdown_items": 3++ }++ },++ {++ "slot": "b",++ "entrant": "model:gpt-5-mini",++ "run_id": "run_01KA0000000000000000000002",++ "receipts": {++ "outcome": "succeeded",++ "cost_usd": 0.0011,++ "tokens_in": 120,++ "tokens_out": 280,++ "ttft_ms": 820,++ "tps": 61,++ "wall_ms": 5300,++ "length_chars": 980,++ "markdown_items": 0++ }++ }++ ],++ "shown": [++ "b",++ "a"++ ],++ "blind": true,++ "budget": {++ "usd": 0.01,++ "ms": 60000,++ "machine_class": null++ },++ "judgements": [++ {++ "judge": "human_pairwise",++ "winner": "a",++ "by": {++ "type": "person",++ "id_hash": "0123456789abcdef"++ },++ "weight": 0.9,++ "at": "2026-11-13T02:00:00Z"++ }++ ],++ "play": {++ "id": "race",++ "run_id": "run_01KA0000000000000000000000"++ },++ "at": "2026-11-13T01:59:30Z"++}nnew file mode 100644@@@ -0,0 +1,53 @@++{++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",++ "category": "model",++ "subject": "agent:codex+gpt-5-mini#3f9a1c22",++ "elo": 1500,++ "games": 10,++ "wins": 6,++ "losses": 3,++ "ties": 1,++ "win_rate": 0.6,++ "ci_lower": 1400,++ "ci_upper": 1600,++ "median_cost_usd": null,++ "median_ms": null,++ "provisional": false,++ "entrant_kind": "agent",++ "style_control": true,++ "factors": {++ "model": {++ "score": 1062,++ "ci_lower": 1040,++ "ci_upper": 1084++ },++ "harness": {++ "score": 31,++ "ci_lower": 12,++ "ci_upper": 50++ },++ "interaction": {++ "score": -4,++ "ci_lower": -21,++ "ci_upper": 13++ }++ },++ "matches": 412,++ "cost_per_solved_usd": 0.31,++ "tokens_per_task": 48200,++ "ttft_ms": {++ "p50": 540,++ "p95": 1310,++ "n": 412++ },++ "tps": {++ "p50": 86,++ "p95": null,++ "n": 380++ },++ "reliability": {++ "k": 3,++ "pass_k": 0.71++ },++ "as_of": "2026-11-13T02:00:00Z"++}@@@ -106591,14 +106591,14 @@}},"bench.rating": {-- "version": "1.0.0",++ "version": "1.1.0","owner": "bench","status": "active","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/bench/rating.v1.json","title": "BenchRating",-- "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.",++ "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.","type": "object","additionalProperties": false,"required": [@@@ -106642,26 +106642,839 @@"win_rate": {"type": "number"},-- "ci_lower": {-- "type": "number"++ "ci_lower": {++ "type": "number"++ },++ "ci_upper": {++ "type": "number"++ },++ "entrant_kind": {++ "enum": [++ "model",++ "harness",++ "agent",++ "product"++ ]++ },++ "style_control": {++ "type": "boolean"++ },++ "factors": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "properties": {++ "model": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "score"++ ],++ "properties": {++ "score": {++ "type": "number"++ },++ "ci_lower": {++ "type": [++ "number",++ "null"++ ]++ },++ "ci_upper": {++ "type": [++ "number",++ "null"++ ]++ }++ }++ },++ "harness": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "score"++ ],++ "properties": {++ "score": {++ "type": "number"++ },++ "ci_lower": {++ "type": [++ "number",++ "null"++ ]++ },++ "ci_upper": {++ "type": [++ "number",++ "null"++ ]++ }++ }++ },++ "interaction": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "score"++ ],++ "properties": {++ "score": {++ "type": "number"++ },++ "ci_lower": {++ "type": [++ "number",++ "null"++ ]++ },++ "ci_upper": {++ "type": [++ "number",++ "null"++ ]++ }++ }++ }++ },++ "description": "An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale."++ },++ "matches": {++ "type": "integer",++ "minimum": 0++ },++ "cost_per_solved_usd": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "tokens_per_task": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "ttft_ms": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "properties": {++ "p50": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "p95": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "n": {++ "type": "integer",++ "minimum": 0++ }++ }++ },++ "tps": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "properties": {++ "p50": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "p95": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "n": {++ "type": "integer",++ "minimum": 0++ }++ }++ },++ "reliability": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "k",++ "pass_k"++ ],++ "properties": {++ "k": {++ "type": "integer",++ "minimum": 1++ },++ "pass_k": {++ "type": "number",++ "minimum": 0,++ "maximum": 1++ }++ },++ "description": "pass^k: the share of tasks solved on all k tries."++ },++ "as_of": {++ "type": "string",++ "format": "date-time"++ },++ "median_cost_usd": {++ "type": [++ "number",++ "null"++ ]++ },++ "median_ms": {++ "type": [++ "number",++ "null"++ ]++ },++ "provisional": {++ "type": "boolean"++ }++ }++ }++ },++ "bench.entrant": {++ "version": "1.0.0",++ "owner": "bench",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/bench/entrant.v1.json",++ "title": "BenchEntrant",++ "description": "bench.entrant@1 (compare-arena-ecosystem.md, 2026-11-13): what competes in a match. KIND says which: a MODEL alone (on the neutral harness), a HARNESS alone (rated over a fixed model panel), an AGENT (a harness with a model and its settings, the way people run it; CONFIG_HASH or BLUEPRINT pins the settings) or a PRODUCT (a builder people use whole). ID is the entrant's stable name: model:<model>, harness:<harness>@<version>, agent:<harness>+<model>#<config hash>, product:<slug>. Every rating and every number on a page names the entrant's kind, so a model's score is never shown without its harness.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "kind",++ "label"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^(model:[A-Za-z0-9._/:-]{1,200}|harness:[a-z0-9][a-z0-9._-]{0,60}@[A-Za-z0-9._-]{1,40}|agent:[a-z0-9][a-z0-9._-]{0,60}\\+[A-Za-z0-9._/:-]{1,200}#[a-f0-9]{8,64}|product:[a-z0-9][a-z0-9-]{0,60})$"++ },++ "kind": {++ "enum": [++ "model",++ "harness",++ "agent",++ "product"++ ]++ },++ "label": {++ "type": "string",++ "minLength": 1,++ "maxLength": 160++ },++ "model": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id"++ ],++ "properties": {++ "id": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "family": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80,++ "description": "The model family, so the matchmaker can avoid pairing two of one family."++ }++ }++ },++ "harness": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "version"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^[a-z0-9][a-z0-9._-]{0,60}$",++ "description": "claude-code, codex, opencode, goose, gemini-cli, aider, openvibe (the engine's own loop), ov-bare (the neutral harness) …"++ },++ "version": {++ "type": "string",++ "minLength": 1,++ "maxLength": 40++ }++ }++ },++ "config_hash": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-f0-9]{8,64}$",++ "description": "An agent's settings (tools, effort, prompts) hashed, so a change of settings is a new entrant."++ },++ "blueprint": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "id",++ "version"++ ],++ "properties": {++ "id": {++ "type": "string",++ "minLength": 1,++ "maxLength": 120++ },++ "version": {++ "type": "integer",++ "minimum": 1++ }++ },++ "description": "An agent made as agents.blueprint@1: the blueprint and its version."++ },++ "owner": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "type",++ "id"++ ],++ "properties": {++ "type": {++ "enum": [++ "network",++ "user",++ "community"++ ]++ },++ "id": {++ "type": "string",++ "minLength": 1,++ "maxLength": 160++ }++ },++ "description": "Who entered it: the network's own catalogue, a person's agent or a community machine."++ }++ },++ "allOf": [++ {++ "if": {++ "properties": {++ "kind": {++ "const": "model"++ }++ }++ },++ "then": {++ "required": [++ "model"++ ]++ }++ },++ {++ "if": {++ "properties": {++ "kind": {++ "const": "harness"++ }++ }++ },++ "then": {++ "required": [++ "harness"++ ]++ }++ },++ {++ "if": {++ "properties": {++ "kind": {++ "const": "agent"++ }++ }++ },++ "then": {++ "required": [++ "model",++ "harness"++ ]++ }++ }++ ]++ }++ },++ "bench.match": {++ "version": "1.0.0",++ "owner": "bench",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/bench/match.v1.json",++ "title": "BenchMatch",++ "description": "bench.match@1 (compare-arena-ecosystem.md, 2026-11-13): one task given to two or more entrants under the same budget and machine class, the receipts of each side, and every judgement that came in. Every comparison on the network is one: an Arena vote, a Chat draft picked, a Codes race whose patch was merged, a check job's tests, a rubric model, a game, a Live chat's poll. SOURCE says where it came from; SLOTS are the sides (a, b, …) with the entrant, the run that answered and its receipts; SHOWN is the order the sides were shown in (position bias is modelled, never ignored); BLIND says whether the names were hidden until the first judgement. OpenVibe.Bench keeps matches and rates entrants from them (bench.rating@1).",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "source",++ "task",++ "slots",++ "judgements",++ "at"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "source": {++ "enum": [++ "arena",++ "chat",++ "codes",++ "live",++ "games",++ "exchange",++ "space",++ "bench",++ "check"++ ]++ },++ "task": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "kind"++ ],++ "properties": {++ "kind": {++ "enum": [++ "chat",++ "code",++ "design",++ "image",++ "speech",++ "search",++ "computer",++ "game"++ ]++ },++ "category": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9._-]{0,60}$",++ "description": "What the task is about, from the classifier (code.debug, writing.email, math …), so boards are per category."++ },++ "prompt_hash": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-f0-9]{64}$",++ "description": "sha256 of the prompt: dedupe and the private pool, never the prompt itself."++ },++ "prompt": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 20000,++ "description": "Only when the asker opted in to share it (PUBLIC true)."++ },++ "public": {++ "type": "boolean",++ "default": false++ },++ "repo": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 300++ },++ "sha": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-f0-9]{40}$"++ },++ "suite": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "A Bench suite and task id, when the task came from one."++ }++ }++ },++ "slots": {++ "type": "array",++ "minItems": 2,++ "maxItems": 8,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "slot",++ "entrant"++ ],++ "properties": {++ "slot": {++ "type": "string",++ "pattern": "^[a-h]$"++ },++ "entrant": {++ "type": "string",++ "minLength": 1,++ "maxLength": 300,++ "description": "A bench.entrant@1 id."++ },++ "run_id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "The agents.run@1 (or AI run) that answered, so its steps and receipts can be read."++ },++ "receipts": {++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "outcome": {++ "enum": [++ "succeeded",++ "failed",++ "timed_out",++ "refused",++ "cancelled"++ ]++ },++ "cost_usd": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "tokens_in": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "tokens_out": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "ttft_ms": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "tps": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "wall_ms": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "tool_calls": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "length_chars": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0,++ "description": "The answer's length, a style covariate."++ },++ "markdown_items": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0,++ "description": "Headings, lists and bold spans in the answer, a style covariate."++ }++ }++ }++ }++ }++ },++ "shown": {++ "type": "array",++ "items": {++ "type": "string",++ "pattern": "^[a-h]$"++ },++ "maxItems": 8,++ "description": "The order the sides were shown in, left to right or top to bottom."},-- "ci_upper": {-- "type": "number"++ "blind": {++ "type": "boolean",++ "default": true},-- "median_cost_usd": {++ "budget": {"type": [-- "number",++ "object","null"-- ]++ ],++ "additionalProperties": false,++ "properties": {++ "usd": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "machine_class": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 60++ }++ },++ "description": "The same for every side: a match between unequal budgets is not a match."},-- "median_ms": {++ "judgements": {++ "type": "array",++ "maxItems": 200,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "judge",++ "at"++ ],++ "properties": {++ "judge": {++ "enum": [++ "human_pairwise",++ "audience_poll",++ "implicit",++ "test_suite",++ "rubric",++ "game_outcome"++ ]++ },++ "winner": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^([a-h]|tie|both_bad)$"++ },++ "scores": {++ "type": [++ "object",++ "null"++ ],++ "propertyNames": {++ "pattern": "^[a-h]$"++ },++ "additionalProperties": {++ "type": "number"++ },++ "description": "Per side: tests passed (0..1), a rubric score, a game's points."++ },++ "signal": {++ "type": [++ "string",++ "null"++ ],++ "enum": [++ null,++ "merged",++ "accepted",++ "copied",++ "kept",++ "retried",++ "stopped",++ "edited"++ ],++ "description": "An implicit judge's signal: what the person did with a side."++ },++ "votes": {++ "type": [++ "object",++ "null"++ ],++ "propertyNames": {++ "pattern": "^([a-h]|tie)$"++ },++ "additionalProperties": {++ "type": "integer",++ "minimum": 0++ },++ "description": "An audience poll's counts."++ },++ "by": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "type"++ ],++ "properties": {++ "type": {++ "enum": [++ "person",++ "audience",++ "model",++ "suite",++ "game"++ ]++ },++ "id_hash": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-f0-9]{16,64}$",++ "description": "A keyed hash of who judged, for rate limits and voter quality; never the person's id."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 200,++ "description": "A rubric judge's model (of another family than the sides)."++ }++ }++ },++ "weight": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0,++ "maximum": 1,++ "description": "The voter's quality weight when the judgement was counted (gold pairs, agreement)."++ },++ "style_note": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 200++ },++ "at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ },++ "play": {"type": [-- "number",++ "object","null"-- ]++ ],++ "additionalProperties": false,++ "required": [++ "id"++ ],++ "properties": {++ "id": {++ "type": "string"++ },++ "run_id": {++ "type": [++ "string",++ "null"++ ]++ }++ },++ "description": "The race play and its parent run, when the match was run on the agent engine."},-- "provisional": {-- "type": "boolean"++ "at": {++ "type": "string",++ "format": "date-time"}}}@@@ -106765,6 +107578,95 @@}}},++ "bench.match.recorded": {++ "version": "1.0.0",++ "owner": "bench",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/bench.match.recorded.v1.json",++ "title": "BenchMatchRecordedPayload",++ "description": "bench.match.recorded v1 (OpenVibe.Bench, 2026-11-13): a match was recorded or gained a judgement. Envelope: source bench, subject { type: match, id: <match id> }. The payload names the match, its source, its task kind and category, its entrants and the judges so far; the match itself (bench.match@1) is read from Bench. Report keeps the open ledger from these; the AI router and Run's Dispatcher refresh their priors from bench.rating.changed.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "match_id",++ "source",++ "task_kind",++ "entrants",++ "judges",++ "at"++ ],++ "properties": {++ "match_id": {++ "type": "string",++ "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "source": {++ "enum": [++ "arena",++ "chat",++ "codes",++ "live",++ "games",++ "exchange",++ "space",++ "bench",++ "check"++ ]++ },++ "task_kind": {++ "enum": [++ "chat",++ "code",++ "design",++ "image",++ "speech",++ "search",++ "computer",++ "game"++ ]++ },++ "category": {++ "type": [++ "string",++ "null"++ ]++ },++ "entrants": {++ "type": "array",++ "minItems": 2,++ "maxItems": 8,++ "items": {++ "type": "string"++ }++ },++ "judges": {++ "type": "array",++ "items": {++ "enum": [++ "human_pairwise",++ "audience_poll",++ "implicit",++ "test_suite",++ "rubric",++ "game_outcome"++ ]++ }++ },++ "winner_entrant": {++ "type": [++ "string",++ "null"++ ]++ },++ "at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ },"bench.rating.changed": {"version": "1.0.0","owner": "bench",@@@ -138290,7 +139192,7 @@}},"agents.play": {-- "version": "1.0.0",++ "version": "1.1.0","owner": "network","status": "active","schema": {@@@ -138524,6 +139426,11 @@"maxLength": 160}}++ },++ "blind": {++ "type": "boolean",++ "default": false,++ "description": "1.1.0 (2026-11-13): the roles' models, harnesses and names are hidden from the person until the play's first judgement (the race play an Arena round runs: one child run per entrant, the same budget, the names after the vote)."}}}@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bench API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -2175,7 +2175,7 @@},"bench.rating.v1": {"title": "BenchRating",-- "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.",++ "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.","type": "object","additionalProperties": false,"required": [@@@ -2225,6 +2225,198 @@"ci_upper": {"type": "number"},++ "entrant_kind": {++ "enum": [++ "model",++ "harness",++ "agent",++ "product"++ ]++ },++ "style_control": {++ "type": "boolean"++ },++ "factors": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "properties": {++ "model": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "score"++ ],++ "properties": {++ "score": {++ "type": "number"++ },++ "ci_lower": {++ "type": [++ "number",++ "null"++ ]++ },++ "ci_upper": {++ "type": [++ "number",++ "null"++ ]++ }++ }++ },++ "harness": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "score"++ ],++ "properties": {++ "score": {++ "type": "number"++ },++ "ci_lower": {++ "type": [++ "number",++ "null"++ ]++ },++ "ci_upper": {++ "type": [++ "number",++ "null"++ ]++ }++ }++ },++ "interaction": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "score"++ ],++ "properties": {++ "score": {++ "type": "number"++ },++ "ci_lower": {++ "type": [++ "number",++ "null"++ ]++ },++ "ci_upper": {++ "type": [++ "number",++ "null"++ ]++ }++ }++ }++ },++ "description": "An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale."++ },++ "matches": {++ "type": "integer",++ "minimum": 0++ },++ "cost_per_solved_usd": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "tokens_per_task": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "ttft_ms": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "properties": {++ "p50": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "p95": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "n": {++ "type": "integer",++ "minimum": 0++ }++ }++ },++ "tps": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "properties": {++ "p50": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "p95": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "n": {++ "type": "integer",++ "minimum": 0++ }++ }++ },++ "reliability": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "k",++ "pass_k"++ ],++ "properties": {++ "k": {++ "type": "integer",++ "minimum": 1++ },++ "pass_k": {++ "type": "number",++ "minimum": 0,++ "maximum": 1++ }++ },++ "description": "pass^k: the share of tasks solved on all k tries."++ },++ "as_of": {++ "type": "string",++ "format": "date-time"++ },"median_cost_usd": {"type": ["number",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe Connect API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Design API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Domains API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Exchange API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Git API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Mail API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.421.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Quest API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Report API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Today API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Vision API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.421.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.422.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -297438,9 +297438,9 @@ export interface BenchJudgement {at: string;}--/** [email protected] (owner: bench) */++/** [email protected] (owner: bench) *//**-- * bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.++ * bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.*/export interface BenchRating {kind_id: string;@@@ -297454,11 +297454,1237 @@ export interface BenchRating {win_rate: number;ci_lower: number;ci_upper: number;++ entrant_kind?: "model" | "harness" | "agent" | "product";++ style_control?: boolean;++ /**++ * An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale.++ */++ factors?: {++ model?: {++ score: number;++ ci_lower?: number | null;++ ci_upper?: number | null;++ };++ harness?: {++ score: number;++ ci_lower?: number | null;++ ci_upper?: number | null;++ };++ interaction?: {++ score: number;++ ci_lower?: number | null;++ ci_upper?: number | null;++ };++ } | null;++ matches?: number;++ cost_per_solved_usd?: number | null;++ tokens_per_task?: number | null;++ ttft_ms?: {++ p50?: number | null;++ p95?: number | null;++ n?: number;++ } | null;++ tps?: {++ p50?: number | null;++ p95?: number | null;++ n?: number;++ } | null;++ /**++ * pass^k: the share of tasks solved on all k tries.++ */++ reliability?: {++ k: number;++ pass_k: number;++ } | null;++ as_of?: string;median_cost_usd?: number | null;median_ms?: number | null;provisional?: boolean;}++/** [email protected] (owner: bench) */++/**++ * bench.entrant@1 (compare-arena-ecosystem.md, 2026-11-13): what competes in a match. KIND says which: a MODEL alone (on the neutral harness), a HARNESS alone (rated over a fixed model panel), an AGENT (a harness with a model and its settings, the way people run it; CONFIG_HASH or BLUEPRINT pins the settings) or a PRODUCT (a builder people use whole). ID is the entrant's stable name: model:<model>, harness:<harness>@<version>, agent:<harness>+<model>#<config hash>, product:<slug>. Every rating and every number on a page names the entrant's kind, so a model's score is never shown without its harness.++ */++export type BenchEntrant = {++ [k: string]: unknown | undefined;++} & {++ id: string;++ kind: "model" | "harness" | "agent" | "product";++ label: string;++ model?: {++ id: string;++ provider?: string | null;++ maker?: string | null;++ /**++ * The model family, so the matchmaker can avoid pairing two of one family.++ */++ family?: string | null;++ };++ harness?: {++ /**++ * claude-code, codex, opencode, goose, gemini-cli, aider, openvibe (the engine's own loop), ov-bare (the neutral harness) …++ */++ id: string;++ version: string;++ };++ /**++ * An agent's settings (tools, effort, prompts) hashed, so a change of settings is a new entrant.++ */++ config_hash?: string | null;++ /**++ * An agent made as agents.blueprint@1: the blueprint and its version.++ */++ blueprint?: {++ id: string;++ version: number;++ } | null;++ /**++ * Who entered it: the network's own catalogue, a person's agent or a community machine.++ */++ owner?: {++ type: "network" | "user" | "community";++ id: string;++ } | null;++};++++/** [email protected] (owner: bench) */++/**++ * bench.match@1 (compare-arena-ecosystem.md, 2026-11-13): one task given to two or more entrants under the same budget and machine class, the receipts of each side, and every judgement that came in. Every comparison on the network is one: an Arena vote, a Chat draft picked, a Codes race whose patch was merged, a check job's tests, a rubric model, a game, a Live chat's poll. SOURCE says where it came from; SLOTS are the sides (a, b, …) with the entrant, the run that answered and its receipts; SHOWN is the order the sides were shown in (position bias is modelled, never ignored); BLIND says whether the names were hidden until the first judgement. OpenVibe.Bench keeps matches and rates entrants from them (bench.rating@1).++ */++export interface BenchMatch {++ id: string;++ source: "arena" | "chat" | "codes" | "live" | "games" | "exchange" | "space" | "bench" | "check";++ task: {++ kind: "chat" | "code" | "design" | "image" | "speech" | "search" | "computer" | "game";++ /**++ * What the task is about, from the classifier (code.debug, writing.email, math …), so boards are per category.++ */++ category?: string | null;++ /**++ * sha256 of the prompt: dedupe and the private pool, never the prompt itself.++ */++ prompt_hash?: string | null;++ /**++ * Only when the asker opted in to share it (PUBLIC true).++ */++ prompt?: string | null;++ public?: boolean;++ repo?: string | null;++ sha?: string | null;++ /**++ * A Bench suite and task id, when the task came from one.++ */++ suite?: string | null;++ };++ /**++ * @minItems 2++ * @maxItems 8++ */++ slots:++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ]++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ]++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ]++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ]++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ]++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ]++ | [++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ },++ {++ slot: string;++ /**++ * A bench.entrant@1 id.++ */++ entrant: string;++ /**++ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.++ */++ run_id?: string | null;++ receipts?: {++ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";++ cost_usd?: number | null;++ tokens_in?: number | null;++ tokens_out?: number | null;++ ttft_ms?: number | null;++ tps?: number | null;++ wall_ms?: number | null;++ tool_calls?: number | null;++ /**++ * The answer's length, a style covariate.++ */++ length_chars?: number | null;++ /**++ * Headings, lists and bold spans in the answer, a style covariate.++ */++ markdown_items?: number | null;++ };++ }++ ];++ /**++ * The order the sides were shown in, left to right or top to bottom.++ *++ * @maxItems 8++ */++ shown?:++ | []++ | [string]++ | [string, string]++ | [string, string, string]++ | [string, string, string, string]++ | [string, string, string, string, string]++ | [string, string, string, string, string, string]++ | [string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string];++ blind?: boolean;++ /**++ * The same for every side: a match between unequal budgets is not a match.++ */++ budget?: {++ usd?: number | null;++ ms?: number | null;++ machine_class?: string | null;++ } | null;++ /**++ * @maxItems 200++ */++ judgements: {++ judge: "human_pairwise" | "audience_poll" | "implicit" | "test_suite" | "rubric" | "game_outcome";++ winner?: string | null;++ /**++ * Per side: tests passed (0..1), a rubric score, a game's points.++ */++ scores?: {++ [k: string]: number | undefined;++ } | null;++ /**++ * An implicit judge's signal: what the person did with a side.++ */++ signal?: null | "merged" | "accepted" | "copied" | "kept" | "retried" | "stopped" | "edited";++ /**++ * An audience poll's counts.++ */++ votes?: {++ [k: string]: number | undefined;++ } | null;++ by?: {++ type: "person" | "audience" | "model" | "suite" | "game";++ /**++ * A keyed hash of who judged, for rate limits and voter quality; never the person's id.++ */++ id_hash?: string | null;++ /**++ * A rubric judge's model (of another family than the sides).++ */++ model?: string | null;++ } | null;++ /**++ * The voter's quality weight when the judgement was counted (gold pairs, agreement).++ */++ weight?: number | null;++ style_note?: string | null;++ at: string;++ }[];++ /**++ * The race play and its parent run, when the match was run on the agent engine.++ */++ play?: {++ id: string;++ run_id?: string | null;++ } | null;++ at: string;++}++/** [email protected] (owner: bench) *//*** bench.round.finished v1 (OpenVibe.Bench): a pinned round reached finished with at least two usable entries and is ready for judgements. Envelope: source bench, subject { type: user, id: <created_by> }, visibility first-party.@@@ -297487,6 +298713,32 @@ export interface BenchJudgementRecordedPayload {at: string;}++/** [email protected] (owner: bench) */++/**++ * bench.match.recorded v1 (OpenVibe.Bench, 2026-11-13): a match was recorded or gained a judgement. Envelope: source bench, subject { type: match, id: <match id> }. The payload names the match, its source, its task kind and category, its entrants and the judges so far; the match itself (bench.match@1) is read from Bench. Report keeps the open ledger from these; the AI router and Run's Dispatcher refresh their priors from bench.rating.changed.++ */++export interface BenchMatchRecordedPayload {++ match_id: string;++ source: "arena" | "chat" | "codes" | "live" | "games" | "exchange" | "space" | "bench" | "check";++ task_kind: "chat" | "code" | "design" | "image" | "speech" | "search" | "computer" | "game";++ category?: string | null;++ /**++ * @minItems 2++ * @maxItems 8++ */++ entrants:++ | [string, string]++ | [string, string, string]++ | [string, string, string, string]++ | [string, string, string, string, string]++ | [string, string, string, string, string, string]++ | [string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string];++ judges: ("human_pairwise" | "audience_poll" | "implicit" | "test_suite" | "rubric" | "game_outcome")[];++ winner_entrant?: string | null;++ at: string;++}++/** [email protected] (owner: bench) *//*** bench.rating.changed v1 (OpenVibe.Bench): a rating moved on a benchmark board. Envelope: source bench, subject { type: service, id: bench }, visibility first-party.@@@ -364368,7 +365620,7 @@ export interface AgentsRunUpdatedPayload {};}--/** [email protected] (owner: network) */++/** [email protected] (owner: network) *//*** agents.play@1 (agent-engine.md §4, 2026-11-12): a named way for several agents to work on one ask, as data, so a person or an AI can write one and openvibe.run can list it. ROLES are the agents it uses (each with what it does, the size of model it wants, and how many may run at once); PHASES run in order, the roles in a phase together when PARALLEL; CHECKS say who checks whose work, against a written BAR; STOP says when the play is over; BUDGET.SPLIT gives each role its share of the parent's budget. The orchestrator turns a play into child runs (agents.run@1's PARENT_RUN, PLAY and ROLE). Rules every play keeps, whatever it says: a child's end never ends its parent; a person's message never waits behind new work; a child's budget is a slice of its parent's.*/@@@ -371619,6 +372871,10 @@ export interface AgentsPlay {type: "user" | "agent" | "service";id: string;};++ /**++ * 1.1.0 (2026-11-13): the roles' models, harnesses and names are hidden from the person until the play's first judgement (the race play an Arena round runs: one child run per entrant, the same budget, the names after the vote).++ */++ blind?: boolean;}/** [email protected] (owner: network) */@@@ -37,6 +37,7 @@"eventsProduced": ["bench.round.finished","bench.judgement.recorded",++ "bench.match.recorded","bench.rating.changed"],"eventsConsumed": [@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.421.0",++ "version": "0.422.0","description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.","main": "index.js","types": "generated/typescript/index.d.ts",
@@ -1,5 +1,37 @@
@@ -1,5 +1,37 @@
# Changelog
# Changelog
+## 0.422.0 — 2026-11-13
+
+**One evaluation loop: entrants, matches, and ratings that separate the model from the harness**
+(compare-arena-ecosystem.md). The owner, 11-13: the Arena "should still use our multi purpose shared universal agentic
+multi harness system", and comparisons should do "harness vs harness and model vs model … better".
+
+- **`bench.entrant@1`:** what competes.
+ - Kinds: a `model` (on the neutral harness), a `harness` (over a fixed model panel), an `agent` (harness + model +
+ settings, a blueprint version), or a `product`.
+ - Stable ids: `model:…`, `harness:…@version`, `agent:harness+model#confighash`, `product:…`.
+- **`bench.match@1`:** one task given to two or more entrants under the same budget.
+ - Each side carries its receipts: cost, tokens, TTFT, TPS, wall time, tool calls, and the length and markdown style
+ covariates.
+ - `shown` records the order the sides were displayed in; `blind` records whether names were hidden.
+ - Judgements come from `human_pairwise`, `audience_poll`, `implicit` (merged, accepted, copied, kept, retried,
+ stopped, edited), `test_suite`, `rubric` and `game_outcome`. A voter is a keyed hash with a quality weight, never
+ an id.
+ - Sources: arena, chat, codes, live, games, exchange, space, bench and check jobs.
+- **`bench.rating@1` 1.1.0** (all optional):
+ - `entrant_kind` and `style_control`;
+ - `factors`: an agent's strength split into model, harness and interaction, each with an interval;
+ - `cost_per_solved_usd`, `tokens_per_task`, `ttft_ms` and `tps` percentiles, `reliability` (pass^k), `matches`,
+ `as_of`.
+- **Event `bench.match.recorded` v1**, produced by Bench.
+- **`agents.play@1` 1.1.0:** `blind` hides the roles' names until the first judgement. This is the race play an Arena
+ round runs on the agent engine.
+- **Fixtures:**
+ - entrants: an agent, a harness, a model;
+ - matches: an Arena vote, and a Codes race judged by its tests and then merged;
+ - a rating with its factors;
+ - invalid: an agent without its harness, a kind nobody has, a one-sided match, an unknown judge.
+
## 0.421.0 — 2026-11-12
## 0.421.0 — 2026-11-12
**Every AI call, measured everywhere** (ai-metrics.md).
**Every AI call, measured everywhere** (ai-metrics.md).
@@ -229,6 +229,11 @@
@@ -229,6 +229,11 @@
"maxLength": 160
"maxLength": 160
}
}
}
}
+ },
+ "blind": {
+ "type": "boolean",
+ "default": false,
+ "description": "1.1.0 (2026-11-13): the roles' models, harnesses and names are hidden from the person until the play's first judgement (the race play an Arena round runs: one child run per entrant, the same budget, the names after the vote)."
}
}
}
}
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,63 @@
@@ -0,0 +1,63 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/bench/entrant.v1.json",
+ "title": "BenchEntrant",
+ "description": "bench.entrant@1 (compare-arena-ecosystem.md, 2026-11-13): what competes in a match. KIND says which: a MODEL alone (on the neutral harness), a HARNESS alone (rated over a fixed model panel), an AGENT (a harness with a model and its settings, the way people run it; CONFIG_HASH or BLUEPRINT pins the settings) or a PRODUCT (a builder people use whole). ID is the entrant's stable name: model:<model>, harness:<harness>@<version>, agent:<harness>+<model>#<config hash>, product:<slug>. Every rating and every number on a page names the entrant's kind, so a model's score is never shown without its harness.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "kind", "label"],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^(model:[A-Za-z0-9._/:-]{1,200}|harness:[a-z0-9][a-z0-9._-]{0,60}@[A-Za-z0-9._-]{1,40}|agent:[a-z0-9][a-z0-9._-]{0,60}\\+[A-Za-z0-9._/:-]{1,200}#[a-f0-9]{8,64}|product:[a-z0-9][a-z0-9-]{0,60})$"
+ },
+ "kind": { "enum": ["model", "harness", "agent", "product"] },
+ "label": { "type": "string", "minLength": 1, "maxLength": 160 },
+ "model": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id"],
+ "properties": {
+ "id": { "type": "string", "minLength": 1, "maxLength": 200 },
+ "provider": { "type": ["string", "null"], "maxLength": 120 },
+ "maker": { "type": ["string", "null"], "maxLength": 120 },
+ "family": { "type": ["string", "null"], "maxLength": 80, "description": "The model family, so the matchmaker can avoid pairing two of one family." }
+ }
+ },
+ "harness": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "version"],
+ "properties": {
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,60}$", "description": "claude-code, codex, opencode, goose, gemini-cli, aider, openvibe (the engine's own loop), ov-bare (the neutral harness) …" },
+ "version": { "type": "string", "minLength": 1, "maxLength": 40 }
+ }
+ },
+ "config_hash": { "type": ["string", "null"], "pattern": "^[a-f0-9]{8,64}$", "description": "An agent's settings (tools, effort, prompts) hashed, so a change of settings is a new entrant." },
+ "blueprint": {
+ "type": ["object", "null"],
+ "additionalProperties": false,
+ "required": ["id", "version"],
+ "properties": {
+ "id": { "type": "string", "minLength": 1, "maxLength": 120 },
+ "version": { "type": "integer", "minimum": 1 }
+ },
+ "description": "An agent made as agents.blueprint@1: the blueprint and its version."
+ },
+ "owner": {
+ "type": ["object", "null"],
+ "additionalProperties": false,
+ "required": ["type", "id"],
+ "properties": {
+ "type": { "enum": ["network", "user", "community"] },
+ "id": { "type": "string", "minLength": 1, "maxLength": 160 }
+ },
+ "description": "Who entered it: the network's own catalogue, a person's agent or a community machine."
+ }
+ },
+ "allOf": [
+ { "if": { "properties": { "kind": { "const": "model" } } }, "then": { "required": ["model"] } },
+ { "if": { "properties": { "kind": { "const": "harness" } } }, "then": { "required": ["harness"] } },
+ { "if": { "properties": { "kind": { "const": "agent" } } }, "then": { "required": ["model", "harness"] } }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,102 @@
@@ -0,0 +1,102 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/bench/match.v1.json",
+ "title": "BenchMatch",
+ "description": "bench.match@1 (compare-arena-ecosystem.md, 2026-11-13): one task given to two or more entrants under the same budget and machine class, the receipts of each side, and every judgement that came in. Every comparison on the network is one: an Arena vote, a Chat draft picked, a Codes race whose patch was merged, a check job's tests, a rubric model, a game, a Live chat's poll. SOURCE says where it came from; SLOTS are the sides (a, b, …) with the entrant, the run that answered and its receipts; SHOWN is the order the sides were shown in (position bias is modelled, never ignored); BLIND says whether the names were hidden until the first judgement. OpenVibe.Bench keeps matches and rates entrants from them (bench.rating@1).",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "source", "task", "slots", "judgements", "at"],
+ "properties": {
+ "id": { "type": "string", "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$" },
+ "source": { "enum": ["arena", "chat", "codes", "live", "games", "exchange", "space", "bench", "check"] },
+ "task": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["kind"],
+ "properties": {
+ "kind": { "enum": ["chat", "code", "design", "image", "speech", "search", "computer", "game"] },
+ "category": { "type": ["string", "null"], "pattern": "^[a-z][a-z0-9._-]{0,60}$", "description": "What the task is about, from the classifier (code.debug, writing.email, math …), so boards are per category." },
+ "prompt_hash": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$", "description": "sha256 of the prompt: dedupe and the private pool, never the prompt itself." },
+ "prompt": { "type": ["string", "null"], "maxLength": 20000, "description": "Only when the asker opted in to share it (PUBLIC true)." },
+ "public": { "type": "boolean", "default": false },
+ "repo": { "type": ["string", "null"], "maxLength": 300 },
+ "sha": { "type": ["string", "null"], "pattern": "^[a-f0-9]{40}$" },
+ "suite": { "type": ["string", "null"], "maxLength": 120, "description": "A Bench suite and task id, when the task came from one." }
+ }
+ },
+ "slots": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 8,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["slot", "entrant"],
+ "properties": {
+ "slot": { "type": "string", "pattern": "^[a-h]$" },
+ "entrant": { "type": "string", "minLength": 1, "maxLength": 300, "description": "A bench.entrant@1 id." },
+ "run_id": { "type": ["string", "null"], "maxLength": 120, "description": "The agents.run@1 (or AI run) that answered, so its steps and receipts can be read." },
+ "receipts": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "outcome": { "enum": ["succeeded", "failed", "timed_out", "refused", "cancelled"] },
+ "cost_usd": { "type": ["number", "null"], "minimum": 0 },
+ "tokens_in": { "type": ["integer", "null"], "minimum": 0 },
+ "tokens_out": { "type": ["integer", "null"], "minimum": 0 },
+ "ttft_ms": { "type": ["number", "null"], "minimum": 0 },
+ "tps": { "type": ["number", "null"], "minimum": 0 },
+ "wall_ms": { "type": ["number", "null"], "minimum": 0 },
+ "tool_calls": { "type": ["integer", "null"], "minimum": 0 },
+ "length_chars": { "type": ["integer", "null"], "minimum": 0, "description": "The answer's length, a style covariate." },
+ "markdown_items": { "type": ["integer", "null"], "minimum": 0, "description": "Headings, lists and bold spans in the answer, a style covariate." }
+ }
+ }
+ }
+ }
+ },
+ "shown": { "type": "array", "items": { "type": "string", "pattern": "^[a-h]$" }, "maxItems": 8, "description": "The order the sides were shown in, left to right or top to bottom." },
+ "blind": { "type": "boolean", "default": true },
+ "budget": {
+ "type": ["object", "null"],
+ "additionalProperties": false,
+ "properties": {
+ "usd": { "type": ["number", "null"], "minimum": 0 },
+ "ms": { "type": ["integer", "null"], "minimum": 0 },
+ "machine_class": { "type": ["string", "null"], "maxLength": 60 }
+ },
+ "description": "The same for every side: a match between unequal budgets is not a match."
+ },
+ "judgements": {
+ "type": "array",
+ "maxItems": 200,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["judge", "at"],
+ "properties": {
+ "judge": { "enum": ["human_pairwise", "audience_poll", "implicit", "test_suite", "rubric", "game_outcome"] },
+ "winner": { "type": ["string", "null"], "pattern": "^([a-h]|tie|both_bad)$" },
+ "scores": { "type": ["object", "null"], "propertyNames": { "pattern": "^[a-h]$" }, "additionalProperties": { "type": "number" }, "description": "Per side: tests passed (0..1), a rubric score, a game's points." },
+ "signal": { "type": ["string", "null"], "enum": [null, "merged", "accepted", "copied", "kept", "retried", "stopped", "edited"], "description": "An implicit judge's signal: what the person did with a side." },
+ "votes": { "type": ["object", "null"], "propertyNames": { "pattern": "^([a-h]|tie)$" }, "additionalProperties": { "type": "integer", "minimum": 0 }, "description": "An audience poll's counts." },
+ "by": {
+ "type": ["object", "null"],
+ "additionalProperties": false,
+ "required": ["type"],
+ "properties": {
+ "type": { "enum": ["person", "audience", "model", "suite", "game"] },
+ "id_hash": { "type": ["string", "null"], "pattern": "^[a-f0-9]{16,64}$", "description": "A keyed hash of who judged, for rate limits and voter quality; never the person's id." },
+ "model": { "type": ["string", "null"], "maxLength": 200, "description": "A rubric judge's model (of another family than the sides)." }
+ }
+ },
+ "weight": { "type": ["number", "null"], "minimum": 0, "maximum": 1, "description": "The voter's quality weight when the judgement was counted (gold pairs, agreement)." },
+ "style_note": { "type": ["string", "null"], "maxLength": 200 },
+ "at": { "type": "string", "format": "date-time" }
+ }
+ }
+ },
+ "play": { "type": ["object", "null"], "additionalProperties": false, "required": ["id"], "properties": { "id": { "type": "string" }, "run_id": { "type": ["string", "null"] } }, "description": "The race play and its parent run, when the match was run on the agent engine." },
+ "at": { "type": "string", "format": "date-time" }
+ }
+}
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/bench/rating.v1.json",
"$id": "https://openvibe.network/contracts/bench/rating.v1.json",
"title": "BenchRating",
"title": "BenchRating",
- "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.",
+ "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": ["kind_id", "category", "subject", "elo", "games", "wins", "losses", "ties", "win_rate", "ci_lower", "ci_upper"],
"required": ["kind_id", "category", "subject", "elo", "games", "wins", "losses", "ties", "win_rate", "ci_lower", "ci_upper"],
@@ -18,6 +18,16 @@
@@ -18,6 +18,16 @@
"win_rate": { "type": "number" },
"win_rate": { "type": "number" },
"ci_lower": { "type": "number" },
"ci_lower": { "type": "number" },
"ci_upper": { "type": "number" },
"ci_upper": { "type": "number" },
+ "entrant_kind": { "enum": ["model", "harness", "agent", "product"] },
+ "style_control": { "type": "boolean" },
+ "factors": { "type": ["object", "null"], "additionalProperties": false, "properties": { "model": { "type": "object", "additionalProperties": false, "required": ["score"], "properties": { "score": { "type": "number" }, "ci_lower": { "type": ["number", "null"] }, "ci_upper": { "type": ["number", "null"] } } }, "harness": { "type": "object", "additionalProperties": false, "required": ["score"], "properties": { "score": { "type": "number" }, "ci_lower": { "type": ["number", "null"] }, "ci_upper": { "type": ["number", "null"] } } }, "interaction": { "type": "object", "additionalProperties": false, "required": ["score"], "properties": { "score": { "type": "number" }, "ci_lower": { "type": ["number", "null"] }, "ci_upper": { "type": ["number", "null"] } } } }, "description": "An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale." },
+ "matches": { "type": "integer", "minimum": 0 },
+ "cost_per_solved_usd": { "type": ["number", "null"], "minimum": 0 },
+ "tokens_per_task": { "type": ["number", "null"], "minimum": 0 },
+ "ttft_ms": { "type": ["object", "null"], "additionalProperties": false, "properties": { "p50": { "type": ["number", "null"], "minimum": 0 }, "p95": { "type": ["number", "null"], "minimum": 0 }, "n": { "type": "integer", "minimum": 0 } } },
+ "tps": { "type": ["object", "null"], "additionalProperties": false, "properties": { "p50": { "type": ["number", "null"], "minimum": 0 }, "p95": { "type": ["number", "null"], "minimum": 0 }, "n": { "type": "integer", "minimum": 0 } } },
+ "reliability": { "type": ["object", "null"], "additionalProperties": false, "required": ["k", "pass_k"], "properties": { "k": { "type": "integer", "minimum": 1 }, "pass_k": { "type": "number", "minimum": 0, "maximum": 1 } }, "description": "pass^k: the share of tasks solved on all k tries." },
+ "as_of": { "type": "string", "format": "date-time" },
"median_cost_usd": { "type": ["number", "null"] },
"median_cost_usd": { "type": ["number", "null"] },
"median_ms": { "type": ["number", "null"] },
"median_ms": { "type": ["number", "null"] },
"provisional": { "type": "boolean" }
"provisional": { "type": "boolean" }
@@ -9602,13 +9602,31 @@
@@ -9602,13 +9602,31 @@
},
},
{
{
"id": "bench.rating",
"id": "bench.rating",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "bench",
"owner": "bench",
"schema": "bench/rating.v1.json",
"schema": "bench/rating.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "bench.entrant",
+ "version": "1.0.0",
+ "owner": "bench",
+ "schema": "bench/entrant.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "bench.match",
+ "version": "1.0.0",
+ "owner": "bench",
+ "schema": "bench/match.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "bench.round.finished",
"id": "bench.round.finished",
"version": "1.0.0",
"version": "1.0.0",
@@ -9627,6 +9645,15 @@
@@ -9627,6 +9645,15 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "bench.match.recorded",
+ "version": "1.0.0",
+ "owner": "bench",
+ "schema": "events/payloads/bench.match.recorded.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "bench.rating.changed",
"id": "bench.rating.changed",
"version": "1.0.0",
"version": "1.0.0",
@@ -11858,7 +11885,7 @@
@@ -11858,7 +11885,7 @@
},
},
{
{
"id": "agents.play",
"id": "agents.play",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "network",
"owner": "network",
"schema": "agents/play.v1.json",
"schema": "agents/play.v1.json",
"visibility": "public",
"visibility": "public",
new file mode 100644
new file mode 100644
@@ -0,0 +1,84 @@
@@ -0,0 +1,84 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/bench.match.recorded.v1.json",
+ "title": "BenchMatchRecordedPayload",
+ "description": "bench.match.recorded v1 (OpenVibe.Bench, 2026-11-13): a match was recorded or gained a judgement. Envelope: source bench, subject { type: match, id: <match id> }. The payload names the match, its source, its task kind and category, its entrants and the judges so far; the match itself (bench.match@1) is read from Bench. Report keeps the open ledger from these; the AI router and Run's Dispatcher refresh their priors from bench.rating.changed.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "match_id",
+ "source",
+ "task_kind",
+ "entrants",
+ "judges",
+ "at"
+ ],
+ "properties": {
+ "match_id": {
+ "type": "string",
+ "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "source": {
+ "enum": [
+ "arena",
+ "chat",
+ "codes",
+ "live",
+ "games",
+ "exchange",
+ "space",
+ "bench",
+ "check"
+ ]
+ },
+ "task_kind": {
+ "enum": [
+ "chat",
+ "code",
+ "design",
+ "image",
+ "speech",
+ "search",
+ "computer",
+ "game"
+ ]
+ },
+ "category": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "entrants": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 8,
+ "items": {
+ "type": "string"
+ }
+ },
+ "judges": {
+ "type": "array",
+ "items": {
+ "enum": [
+ "human_pairwise",
+ "audience_poll",
+ "implicit",
+ "test_suite",
+ "rubric",
+ "game_outcome"
+ ]
+ }
+ },
+ "winner_entrant": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "id": "model:x",
+ "kind": "robot",
+ "label": "x"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
+{
+ "id": "agent:codex+gpt-5-mini#3f9a1c22",
+ "kind": "agent",
+ "label": "Codex with GPT-5 mini",
+ "model": {
+ "id": "gpt-5-mini"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "id": "harness:[email protected]",
+ "kind": "harness",
+ "label": "OpenCode",
+ "harness": {
+ "id": "opencode",
+ "version": "1.4.2"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "id": "model:deepseek-flash",
+ "kind": "model",
+ "label": "DeepSeek Flash",
+ "model": {
+ "id": "deepseek-flash",
+ "provider": "deepseek",
+ "family": "deepseek"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
+{
+ "id": "agent:codex+gpt-5-mini#3f9a1c22",
+ "kind": "agent",
+ "label": "Codex with GPT-5 mini",
+ "model": {
+ "id": "gpt-5-mini",
+ "provider": "openai",
+ "maker": "OpenAI",
+ "family": "gpt"
+ },
+ "harness": {
+ "id": "codex",
+ "version": "0.98.0"
+ },
+ "config_hash": "3f9a1c22"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"match_id": "mat_01KA0000000000000000000000", "source": "arena", "task_kind": "chat", "entrants": ["model:deepseek-flash"], "judges": ["human_pairwise"], "at": "2026-11-13T02:00:00Z"}
new file mode 100644
new file mode 100644
@@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
+{
+ "match_id": "mat_01KA0000000000000000000000",
+ "source": "arena",
+ "task_kind": "chat",
+ "category": "writing.email",
+ "entrants": [
+ "model:deepseek-flash",
+ "model:gpt-5-mini"
+ ],
+ "judges": [
+ "human_pairwise"
+ ],
+ "winner_entrant": "model:deepseek-flash",
+ "at": "2026-11-13T02:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
+{
+ "id": "mat_01KA0000000000000000000000",
+ "source": "arena",
+ "task": {
+ "kind": "chat",
+ "category": "writing.email",
+ "prompt_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "public": false
+ },
+ "slots": [
+ {
+ "slot": "a",
+ "entrant": "model:deepseek-flash",
+ "run_id": "run_01KA0000000000000000000001",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.0004,
+ "tokens_in": 120,
+ "tokens_out": 300,
+ "ttft_ms": 540,
+ "tps": 86,
+ "wall_ms": 4100,
+ "length_chars": 1210,
+ "markdown_items": 3
+ }
+ },
+ {
+ "slot": "b",
+ "entrant": "model:gpt-5-mini",
+ "run_id": "run_01KA0000000000000000000002",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.0011,
+ "tokens_in": 120,
+ "tokens_out": 280,
+ "ttft_ms": 820,
+ "tps": 61,
+ "wall_ms": 5300,
+ "length_chars": 980,
+ "markdown_items": 0
+ }
+ }
+ ],
+ "shown": [
+ "b",
+ "a"
+ ],
+ "blind": true,
+ "budget": {
+ "usd": 0.01,
+ "ms": 60000,
+ "machine_class": null
+ },
+ "judgements": [
+ {
+ "judge": "vibes",
+ "winner": "a",
+ "by": {
+ "type": "person",
+ "id_hash": "0123456789abcdef"
+ },
+ "weight": 0.9,
+ "at": "2026-11-13T02:00:00Z"
+ }
+ ],
+ "play": {
+ "id": "race",
+ "run_id": "run_01KA0000000000000000000000"
+ },
+ "at": "2026-11-13T01:59:30Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
+{
+ "id": "mat_01KA0000000000000000000000",
+ "source": "arena",
+ "task": {
+ "kind": "chat",
+ "category": "writing.email",
+ "prompt_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "public": false
+ },
+ "slots": [
+ {
+ "slot": "a",
+ "entrant": "model:deepseek-flash",
+ "run_id": "run_01KA0000000000000000000001",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.0004,
+ "tokens_in": 120,
+ "tokens_out": 300,
+ "ttft_ms": 540,
+ "tps": 86,
+ "wall_ms": 4100,
+ "length_chars": 1210,
+ "markdown_items": 3
+ }
+ }
+ ],
+ "shown": [
+ "b",
+ "a"
+ ],
+ "blind": true,
+ "budget": {
+ "usd": 0.01,
+ "ms": 60000,
+ "machine_class": null
+ },
+ "judgements": [
+ {
+ "judge": "human_pairwise",
+ "winner": "a",
+ "by": {
+ "type": "person",
+ "id_hash": "0123456789abcdef"
+ },
+ "weight": 0.9,
+ "at": "2026-11-13T02:00:00Z"
+ }
+ ],
+ "play": {
+ "id": "race",
+ "run_id": "run_01KA0000000000000000000000"
+ },
+ "at": "2026-11-13T01:59:30Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
+{
+ "id": "mat_01KA0000000000000000000003",
+ "source": "codes",
+ "task": {
+ "kind": "code",
+ "category": "code.bugfix",
+ "repo": "https://github.com/OpenVibers/OpenVibe.Compare",
+ "sha": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+ },
+ "slots": [
+ {
+ "slot": "a",
+ "entrant": "agent:codex+gpt-5-mini#3f9a1c22",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.21,
+ "wall_ms": 312000,
+ "tool_calls": 41
+ }
+ },
+ {
+ "slot": "b",
+ "entrant": "agent:opencode+glm-5.3#9b7e2d10",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.09,
+ "wall_ms": 401000,
+ "tool_calls": 57
+ }
+ }
+ ],
+ "blind": false,
+ "judgements": [
+ {
+ "judge": "test_suite",
+ "scores": {
+ "a": 1,
+ "b": 0.8
+ },
+ "by": {
+ "type": "suite"
+ },
+ "at": "2026-11-13T02:10:00Z"
+ },
+ {
+ "judge": "implicit",
+ "winner": "a",
+ "signal": "merged",
+ "by": {
+ "type": "person",
+ "id_hash": "fedcba9876543210"
+ },
+ "at": "2026-11-13T02:30:00Z"
+ }
+ ],
+ "at": "2026-11-13T02:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
+{
+ "id": "mat_01KA0000000000000000000000",
+ "source": "arena",
+ "task": {
+ "kind": "chat",
+ "category": "writing.email",
+ "prompt_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "public": false
+ },
+ "slots": [
+ {
+ "slot": "a",
+ "entrant": "model:deepseek-flash",
+ "run_id": "run_01KA0000000000000000000001",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.0004,
+ "tokens_in": 120,
+ "tokens_out": 300,
+ "ttft_ms": 540,
+ "tps": 86,
+ "wall_ms": 4100,
+ "length_chars": 1210,
+ "markdown_items": 3
+ }
+ },
+ {
+ "slot": "b",
+ "entrant": "model:gpt-5-mini",
+ "run_id": "run_01KA0000000000000000000002",
+ "receipts": {
+ "outcome": "succeeded",
+ "cost_usd": 0.0011,
+ "tokens_in": 120,
+ "tokens_out": 280,
+ "ttft_ms": 820,
+ "tps": 61,
+ "wall_ms": 5300,
+ "length_chars": 980,
+ "markdown_items": 0
+ }
+ }
+ ],
+ "shown": [
+ "b",
+ "a"
+ ],
+ "blind": true,
+ "budget": {
+ "usd": 0.01,
+ "ms": 60000,
+ "machine_class": null
+ },
+ "judgements": [
+ {
+ "judge": "human_pairwise",
+ "winner": "a",
+ "by": {
+ "type": "person",
+ "id_hash": "0123456789abcdef"
+ },
+ "weight": 0.9,
+ "at": "2026-11-13T02:00:00Z"
+ }
+ ],
+ "play": {
+ "id": "race",
+ "run_id": "run_01KA0000000000000000000000"
+ },
+ "at": "2026-11-13T01:59:30Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
+{
+ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
+ "category": "model",
+ "subject": "agent:codex+gpt-5-mini#3f9a1c22",
+ "elo": 1500,
+ "games": 10,
+ "wins": 6,
+ "losses": 3,
+ "ties": 1,
+ "win_rate": 0.6,
+ "ci_lower": 1400,
+ "ci_upper": 1600,
+ "median_cost_usd": null,
+ "median_ms": null,
+ "provisional": false,
+ "entrant_kind": "agent",
+ "style_control": true,
+ "factors": {
+ "model": {
+ "score": 1062,
+ "ci_lower": 1040,
+ "ci_upper": 1084
+ },
+ "harness": {
+ "score": 31,
+ "ci_lower": 12,
+ "ci_upper": 50
+ },
+ "interaction": {
+ "score": -4,
+ "ci_lower": -21,
+ "ci_upper": 13
+ }
+ },
+ "matches": 412,
+ "cost_per_solved_usd": 0.31,
+ "tokens_per_task": 48200,
+ "ttft_ms": {
+ "p50": 540,
+ "p95": 1310,
+ "n": 412
+ },
+ "tps": {
+ "p50": 86,
+ "p95": null,
+ "n": 380
+ },
+ "reliability": {
+ "k": 3,
+ "pass_k": 0.71
+ },
+ "as_of": "2026-11-13T02:00:00Z"
+}
@@ -106591,14 +106591,14 @@
@@ -106591,14 +106591,14 @@
}
}
},
},
"bench.rating": {
"bench.rating": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "bench",
"owner": "bench",
"status": "active",
"status": "active",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/bench/rating.v1.json",
"$id": "https://openvibe.network/contracts/bench/rating.v1.json",
"title": "BenchRating",
"title": "BenchRating",
- "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.",
+ "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -106642,26 +106642,839 @@
@@ -106642,26 +106642,839 @@
"win_rate": {
"win_rate": {
"type": "number"
"type": "number"
},
},
- "ci_lower": {
- "type": "number"
+ "ci_lower": {
+ "type": "number"
+ },
+ "ci_upper": {
+ "type": "number"
+ },
+ "entrant_kind": {
+ "enum": [
+ "model",
+ "harness",
+ "agent",
+ "product"
+ ]
+ },
+ "style_control": {
+ "type": "boolean"
+ },
+ "factors": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "model": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "score"
+ ],
+ "properties": {
+ "score": {
+ "type": "number"
+ },
+ "ci_lower": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "ci_upper": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ }
+ },
+ "harness": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "score"
+ ],
+ "properties": {
+ "score": {
+ "type": "number"
+ },
+ "ci_lower": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "ci_upper": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ }
+ },
+ "interaction": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "score"
+ ],
+ "properties": {
+ "score": {
+ "type": "number"
+ },
+ "ci_lower": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "ci_upper": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ }
+ }
+ },
+ "description": "An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale."
+ },
+ "matches": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cost_per_solved_usd": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "tokens_per_task": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "ttft_ms": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "p50": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "p95": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "n": {
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "tps": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "p50": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "p95": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "n": {
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "reliability": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "k",
+ "pass_k"
+ ],
+ "properties": {
+ "k": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "pass_k": {
+ "type": "number",
+ "minimum": 0,
+ "maximum": 1
+ }
+ },
+ "description": "pass^k: the share of tasks solved on all k tries."
+ },
+ "as_of": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "median_cost_usd": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "median_ms": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "provisional": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "bench.entrant": {
+ "version": "1.0.0",
+ "owner": "bench",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/bench/entrant.v1.json",
+ "title": "BenchEntrant",
+ "description": "bench.entrant@1 (compare-arena-ecosystem.md, 2026-11-13): what competes in a match. KIND says which: a MODEL alone (on the neutral harness), a HARNESS alone (rated over a fixed model panel), an AGENT (a harness with a model and its settings, the way people run it; CONFIG_HASH or BLUEPRINT pins the settings) or a PRODUCT (a builder people use whole). ID is the entrant's stable name: model:<model>, harness:<harness>@<version>, agent:<harness>+<model>#<config hash>, product:<slug>. Every rating and every number on a page names the entrant's kind, so a model's score is never shown without its harness.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "kind",
+ "label"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^(model:[A-Za-z0-9._/:-]{1,200}|harness:[a-z0-9][a-z0-9._-]{0,60}@[A-Za-z0-9._-]{1,40}|agent:[a-z0-9][a-z0-9._-]{0,60}\\+[A-Za-z0-9._/:-]{1,200}#[a-f0-9]{8,64}|product:[a-z0-9][a-z0-9-]{0,60})$"
+ },
+ "kind": {
+ "enum": [
+ "model",
+ "harness",
+ "agent",
+ "product"
+ ]
+ },
+ "label": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 160
+ },
+ "model": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "family": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80,
+ "description": "The model family, so the matchmaker can avoid pairing two of one family."
+ }
+ }
+ },
+ "harness": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "version"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,60}$",
+ "description": "claude-code, codex, opencode, goose, gemini-cli, aider, openvibe (the engine's own loop), ov-bare (the neutral harness) …"
+ },
+ "version": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ }
+ },
+ "config_hash": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-f0-9]{8,64}$",
+ "description": "An agent's settings (tools, effort, prompts) hashed, so a change of settings is a new entrant."
+ },
+ "blueprint": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "version"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 120
+ },
+ "version": {
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "description": "An agent made as agents.blueprint@1: the blueprint and its version."
+ },
+ "owner": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "type",
+ "id"
+ ],
+ "properties": {
+ "type": {
+ "enum": [
+ "network",
+ "user",
+ "community"
+ ]
+ },
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 160
+ }
+ },
+ "description": "Who entered it: the network's own catalogue, a person's agent or a community machine."
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "kind": {
+ "const": "model"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "model"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "kind": {
+ "const": "harness"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "harness"
+ ]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "kind": {
+ "const": "agent"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "model",
+ "harness"
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "bench.match": {
+ "version": "1.0.0",
+ "owner": "bench",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/bench/match.v1.json",
+ "title": "BenchMatch",
+ "description": "bench.match@1 (compare-arena-ecosystem.md, 2026-11-13): one task given to two or more entrants under the same budget and machine class, the receipts of each side, and every judgement that came in. Every comparison on the network is one: an Arena vote, a Chat draft picked, a Codes race whose patch was merged, a check job's tests, a rubric model, a game, a Live chat's poll. SOURCE says where it came from; SLOTS are the sides (a, b, …) with the entrant, the run that answered and its receipts; SHOWN is the order the sides were shown in (position bias is modelled, never ignored); BLIND says whether the names were hidden until the first judgement. OpenVibe.Bench keeps matches and rates entrants from them (bench.rating@1).",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "source",
+ "task",
+ "slots",
+ "judgements",
+ "at"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "source": {
+ "enum": [
+ "arena",
+ "chat",
+ "codes",
+ "live",
+ "games",
+ "exchange",
+ "space",
+ "bench",
+ "check"
+ ]
+ },
+ "task": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "chat",
+ "code",
+ "design",
+ "image",
+ "speech",
+ "search",
+ "computer",
+ "game"
+ ]
+ },
+ "category": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9._-]{0,60}$",
+ "description": "What the task is about, from the classifier (code.debug, writing.email, math …), so boards are per category."
+ },
+ "prompt_hash": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-f0-9]{64}$",
+ "description": "sha256 of the prompt: dedupe and the private pool, never the prompt itself."
+ },
+ "prompt": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 20000,
+ "description": "Only when the asker opted in to share it (PUBLIC true)."
+ },
+ "public": {
+ "type": "boolean",
+ "default": false
+ },
+ "repo": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 300
+ },
+ "sha": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-f0-9]{40}$"
+ },
+ "suite": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "A Bench suite and task id, when the task came from one."
+ }
+ }
+ },
+ "slots": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 8,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "slot",
+ "entrant"
+ ],
+ "properties": {
+ "slot": {
+ "type": "string",
+ "pattern": "^[a-h]$"
+ },
+ "entrant": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 300,
+ "description": "A bench.entrant@1 id."
+ },
+ "run_id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "The agents.run@1 (or AI run) that answered, so its steps and receipts can be read."
+ },
+ "receipts": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "outcome": {
+ "enum": [
+ "succeeded",
+ "failed",
+ "timed_out",
+ "refused",
+ "cancelled"
+ ]
+ },
+ "cost_usd": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "tokens_in": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "tokens_out": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "ttft_ms": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "tps": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "wall_ms": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "tool_calls": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "length_chars": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0,
+ "description": "The answer's length, a style covariate."
+ },
+ "markdown_items": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0,
+ "description": "Headings, lists and bold spans in the answer, a style covariate."
+ }
+ }
+ }
+ }
+ }
+ },
+ "shown": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-h]$"
+ },
+ "maxItems": 8,
+ "description": "The order the sides were shown in, left to right or top to bottom."
},
},
- "ci_upper": {
- "type": "number"
+ "blind": {
+ "type": "boolean",
+ "default": true
},
},
- "median_cost_usd": {
+ "budget": {
"type": [
"type": [
- "number",
+ "object",
"null"
"null"
- ]
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "usd": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "machine_class": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 60
+ }
+ },
+ "description": "The same for every side: a match between unequal budgets is not a match."
},
},
- "median_ms": {
+ "judgements": {
+ "type": "array",
+ "maxItems": 200,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "judge",
+ "at"
+ ],
+ "properties": {
+ "judge": {
+ "enum": [
+ "human_pairwise",
+ "audience_poll",
+ "implicit",
+ "test_suite",
+ "rubric",
+ "game_outcome"
+ ]
+ },
+ "winner": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^([a-h]|tie|both_bad)$"
+ },
+ "scores": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "propertyNames": {
+ "pattern": "^[a-h]$"
+ },
+ "additionalProperties": {
+ "type": "number"
+ },
+ "description": "Per side: tests passed (0..1), a rubric score, a game's points."
+ },
+ "signal": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "enum": [
+ null,
+ "merged",
+ "accepted",
+ "copied",
+ "kept",
+ "retried",
+ "stopped",
+ "edited"
+ ],
+ "description": "An implicit judge's signal: what the person did with a side."
+ },
+ "votes": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "propertyNames": {
+ "pattern": "^([a-h]|tie)$"
+ },
+ "additionalProperties": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "description": "An audience poll's counts."
+ },
+ "by": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "enum": [
+ "person",
+ "audience",
+ "model",
+ "suite",
+ "game"
+ ]
+ },
+ "id_hash": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-f0-9]{16,64}$",
+ "description": "A keyed hash of who judged, for rate limits and voter quality; never the person's id."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 200,
+ "description": "A rubric judge's model (of another family than the sides)."
+ }
+ }
+ },
+ "weight": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0,
+ "maximum": 1,
+ "description": "The voter's quality weight when the judgement was counted (gold pairs, agreement)."
+ },
+ "style_note": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 200
+ },
+ "at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ },
+ "play": {
"type": [
"type": [
- "number",
+ "object",
"null"
"null"
- ]
+ ],
+ "additionalProperties": false,
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "run_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "description": "The race play and its parent run, when the match was run on the agent engine."
},
},
- "provisional": {
- "type": "boolean"
+ "at": {
+ "type": "string",
+ "format": "date-time"
}
}
}
}
}
}
@@ -106765,6 +107578,95 @@
@@ -106765,6 +107578,95 @@
}
}
}
}
},
},
+ "bench.match.recorded": {
+ "version": "1.0.0",
+ "owner": "bench",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/bench.match.recorded.v1.json",
+ "title": "BenchMatchRecordedPayload",
+ "description": "bench.match.recorded v1 (OpenVibe.Bench, 2026-11-13): a match was recorded or gained a judgement. Envelope: source bench, subject { type: match, id: <match id> }. The payload names the match, its source, its task kind and category, its entrants and the judges so far; the match itself (bench.match@1) is read from Bench. Report keeps the open ledger from these; the AI router and Run's Dispatcher refresh their priors from bench.rating.changed.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "match_id",
+ "source",
+ "task_kind",
+ "entrants",
+ "judges",
+ "at"
+ ],
+ "properties": {
+ "match_id": {
+ "type": "string",
+ "pattern": "^mat_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "source": {
+ "enum": [
+ "arena",
+ "chat",
+ "codes",
+ "live",
+ "games",
+ "exchange",
+ "space",
+ "bench",
+ "check"
+ ]
+ },
+ "task_kind": {
+ "enum": [
+ "chat",
+ "code",
+ "design",
+ "image",
+ "speech",
+ "search",
+ "computer",
+ "game"
+ ]
+ },
+ "category": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "entrants": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 8,
+ "items": {
+ "type": "string"
+ }
+ },
+ "judges": {
+ "type": "array",
+ "items": {
+ "enum": [
+ "human_pairwise",
+ "audience_poll",
+ "implicit",
+ "test_suite",
+ "rubric",
+ "game_outcome"
+ ]
+ }
+ },
+ "winner_entrant": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ },
"bench.rating.changed": {
"bench.rating.changed": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "bench",
"owner": "bench",
@@ -138290,7 +139192,7 @@
@@ -138290,7 +139192,7 @@
}
}
},
},
"agents.play": {
"agents.play": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "network",
"owner": "network",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -138524,6 +139426,11 @@
@@ -138524,6 +139426,11 @@
"maxLength": 160
"maxLength": 160
}
}
}
}
+ },
+ "blind": {
+ "type": "boolean",
+ "default": false,
+ "description": "1.1.0 (2026-11-13): the roles' models, harnesses and names are hidden from the person until the play's first judgement (the race play an Arena round runs: one child run per entrant, the same budget, the names after the vote)."
}
}
}
}
}
}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2175,7 +2175,7 @@
@@ -2175,7 +2175,7 @@
},
},
"bench.rating.v1": {
"bench.rating.v1": {
"title": "BenchRating",
"title": "BenchRating",
- "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.",
+ "description": "bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -2225,6 +2225,198 @@
@@ -2225,6 +2225,198 @@
"ci_upper": {
"ci_upper": {
"type": "number"
"type": "number"
},
},
+ "entrant_kind": {
+ "enum": [
+ "model",
+ "harness",
+ "agent",
+ "product"
+ ]
+ },
+ "style_control": {
+ "type": "boolean"
+ },
+ "factors": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "model": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "score"
+ ],
+ "properties": {
+ "score": {
+ "type": "number"
+ },
+ "ci_lower": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "ci_upper": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ }
+ },
+ "harness": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "score"
+ ],
+ "properties": {
+ "score": {
+ "type": "number"
+ },
+ "ci_lower": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "ci_upper": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ }
+ },
+ "interaction": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "score"
+ ],
+ "properties": {
+ "score": {
+ "type": "number"
+ },
+ "ci_lower": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "ci_upper": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ }
+ }
+ },
+ "description": "An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale."
+ },
+ "matches": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cost_per_solved_usd": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "tokens_per_task": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "ttft_ms": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "p50": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "p95": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "n": {
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "tps": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "p50": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "p95": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "n": {
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "reliability": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "k",
+ "pass_k"
+ ],
+ "properties": {
+ "k": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "pass_k": {
+ "type": "number",
+ "minimum": 0,
+ "maximum": 1
+ }
+ },
+ "description": "pass^k: the share of tasks solved on all k tries."
+ },
+ "as_of": {
+ "type": "string",
+ "format": "date-time"
+ },
"median_cost_usd": {
"median_cost_usd": {
"type": [
"type": [
"number",
"number",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe Connect API",
"title": "OpenVibe Connect API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Design API",
"title": "OpenVibe.Design API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Exchange API",
"title": "OpenVibe.Exchange API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Git API",
"title": "OpenVibe.Git API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Mail API",
"title": "OpenVibe.Mail API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.421.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Report API",
"title": "OpenVibe.Report API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Today API",
"title": "OpenVibe.Today API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.421.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.421.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.422.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.422.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -297438,9 +297438,9 @@ export interface BenchJudgement {
@@ -297438,9 +297438,9 @@ export interface BenchJudgement {
at: string;
at: string;
}
}
-/** [email protected] (owner: bench) */
+/** [email protected] (owner: bench) */
/**
/**
- * bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate.
+ * bench.rating@1: a rating on a benchmark board on OpenVibe.Bench. CATEGORY and SUBJECT identify what is rated (a model, a route or a room's own subject); ELO, GAMES, WINS, LOSSES, TIES and WIN_RATE are the score; CI_LOWER and CI_UPPER bound the estimate. 1.1.0 (2026-11-13, compare-arena-ecosystem.md): ENTRANT_KIND says what SUBJECT is (a bench.entrant@1 kind); STYLE_CONTROL says whether length and markdown were held out of the score; FACTORS split an agent's strength into its model, its harness and the two together, each with its interval; beside the score: cost and tokens per solved task, first-token and speed percentiles and reliability, from the matches' receipts.
*/
*/
export interface BenchRating {
export interface BenchRating {
kind_id: string;
kind_id: string;
@@ -297454,11 +297454,1237 @@ export interface BenchRating {
@@ -297454,11 +297454,1237 @@ export interface BenchRating {
win_rate: number;
win_rate: number;
ci_lower: number;
ci_lower: number;
ci_upper: number;
ci_upper: number;
+ entrant_kind?: "model" | "harness" | "agent" | "product";
+ style_control?: boolean;
+ /**
+ * An agent's strength split: model + harness + model×harness (partial pooling), on the score's scale.
+ */
+ factors?: {
+ model?: {
+ score: number;
+ ci_lower?: number | null;
+ ci_upper?: number | null;
+ };
+ harness?: {
+ score: number;
+ ci_lower?: number | null;
+ ci_upper?: number | null;
+ };
+ interaction?: {
+ score: number;
+ ci_lower?: number | null;
+ ci_upper?: number | null;
+ };
+ } | null;
+ matches?: number;
+ cost_per_solved_usd?: number | null;
+ tokens_per_task?: number | null;
+ ttft_ms?: {
+ p50?: number | null;
+ p95?: number | null;
+ n?: number;
+ } | null;
+ tps?: {
+ p50?: number | null;
+ p95?: number | null;
+ n?: number;
+ } | null;
+ /**
+ * pass^k: the share of tasks solved on all k tries.
+ */
+ reliability?: {
+ k: number;
+ pass_k: number;
+ } | null;
+ as_of?: string;
median_cost_usd?: number | null;
median_cost_usd?: number | null;
median_ms?: number | null;
median_ms?: number | null;
provisional?: boolean;
provisional?: boolean;
}
}
+/** [email protected] (owner: bench) */
+/**
+ * bench.entrant@1 (compare-arena-ecosystem.md, 2026-11-13): what competes in a match. KIND says which: a MODEL alone (on the neutral harness), a HARNESS alone (rated over a fixed model panel), an AGENT (a harness with a model and its settings, the way people run it; CONFIG_HASH or BLUEPRINT pins the settings) or a PRODUCT (a builder people use whole). ID is the entrant's stable name: model:<model>, harness:<harness>@<version>, agent:<harness>+<model>#<config hash>, product:<slug>. Every rating and every number on a page names the entrant's kind, so a model's score is never shown without its harness.
+ */
+export type BenchEntrant = {
+ [k: string]: unknown | undefined;
+} & {
+ id: string;
+ kind: "model" | "harness" | "agent" | "product";
+ label: string;
+ model?: {
+ id: string;
+ provider?: string | null;
+ maker?: string | null;
+ /**
+ * The model family, so the matchmaker can avoid pairing two of one family.
+ */
+ family?: string | null;
+ };
+ harness?: {
+ /**
+ * claude-code, codex, opencode, goose, gemini-cli, aider, openvibe (the engine's own loop), ov-bare (the neutral harness) …
+ */
+ id: string;
+ version: string;
+ };
+ /**
+ * An agent's settings (tools, effort, prompts) hashed, so a change of settings is a new entrant.
+ */
+ config_hash?: string | null;
+ /**
+ * An agent made as agents.blueprint@1: the blueprint and its version.
+ */
+ blueprint?: {
+ id: string;
+ version: number;
+ } | null;
+ /**
+ * Who entered it: the network's own catalogue, a person's agent or a community machine.
+ */
+ owner?: {
+ type: "network" | "user" | "community";
+ id: string;
+ } | null;
+};
+
+/** [email protected] (owner: bench) */
+/**
+ * bench.match@1 (compare-arena-ecosystem.md, 2026-11-13): one task given to two or more entrants under the same budget and machine class, the receipts of each side, and every judgement that came in. Every comparison on the network is one: an Arena vote, a Chat draft picked, a Codes race whose patch was merged, a check job's tests, a rubric model, a game, a Live chat's poll. SOURCE says where it came from; SLOTS are the sides (a, b, …) with the entrant, the run that answered and its receipts; SHOWN is the order the sides were shown in (position bias is modelled, never ignored); BLIND says whether the names were hidden until the first judgement. OpenVibe.Bench keeps matches and rates entrants from them (bench.rating@1).
+ */
+export interface BenchMatch {
+ id: string;
+ source: "arena" | "chat" | "codes" | "live" | "games" | "exchange" | "space" | "bench" | "check";
+ task: {
+ kind: "chat" | "code" | "design" | "image" | "speech" | "search" | "computer" | "game";
+ /**
+ * What the task is about, from the classifier (code.debug, writing.email, math …), so boards are per category.
+ */
+ category?: string | null;
+ /**
+ * sha256 of the prompt: dedupe and the private pool, never the prompt itself.
+ */
+ prompt_hash?: string | null;
+ /**
+ * Only when the asker opted in to share it (PUBLIC true).
+ */
+ prompt?: string | null;
+ public?: boolean;
+ repo?: string | null;
+ sha?: string | null;
+ /**
+ * A Bench suite and task id, when the task came from one.
+ */
+ suite?: string | null;
+ };
+ /**
+ * @minItems 2
+ * @maxItems 8
+ */
+ slots:
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ]
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ]
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ]
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ]
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ]
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ]
+ | [
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ },
+ {
+ slot: string;
+ /**
+ * A bench.entrant@1 id.
+ */
+ entrant: string;
+ /**
+ * The agents.run@1 (or AI run) that answered, so its steps and receipts can be read.
+ */
+ run_id?: string | null;
+ receipts?: {
+ outcome?: "succeeded" | "failed" | "timed_out" | "refused" | "cancelled";
+ cost_usd?: number | null;
+ tokens_in?: number | null;
+ tokens_out?: number | null;
+ ttft_ms?: number | null;
+ tps?: number | null;
+ wall_ms?: number | null;
+ tool_calls?: number | null;
+ /**
+ * The answer's length, a style covariate.
+ */
+ length_chars?: number | null;
+ /**
+ * Headings, lists and bold spans in the answer, a style covariate.
+ */
+ markdown_items?: number | null;
+ };
+ }
+ ];
+ /**
+ * The order the sides were shown in, left to right or top to bottom.
+ *
+ * @maxItems 8
+ */
+ shown?:
+ | []
+ | [string]
+ | [string, string]
+ | [string, string, string]
+ | [string, string, string, string]
+ | [string, string, string, string, string]
+ | [string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string];
+ blind?: boolean;
+ /**
+ * The same for every side: a match between unequal budgets is not a match.
+ */
+ budget?: {
+ usd?: number | null;
+ ms?: number | null;
+ machine_class?: string | null;
+ } | null;
+ /**
+ * @maxItems 200
+ */
+ judgements: {
+ judge: "human_pairwise" | "audience_poll" | "implicit" | "test_suite" | "rubric" | "game_outcome";
+ winner?: string | null;
+ /**
+ * Per side: tests passed (0..1), a rubric score, a game's points.
+ */
+ scores?: {
+ [k: string]: number | undefined;
+ } | null;
+ /**
+ * An implicit judge's signal: what the person did with a side.
+ */
+ signal?: null | "merged" | "accepted" | "copied" | "kept" | "retried" | "stopped" | "edited";
+ /**
+ * An audience poll's counts.
+ */
+ votes?: {
+ [k: string]: number | undefined;
+ } | null;
+ by?: {
+ type: "person" | "audience" | "model" | "suite" | "game";
+ /**
+ * A keyed hash of who judged, for rate limits and voter quality; never the person's id.
+ */
+ id_hash?: string | null;
+ /**
+ * A rubric judge's model (of another family than the sides).
+ */
+ model?: string | null;
+ } | null;
+ /**
+ * The voter's quality weight when the judgement was counted (gold pairs, agreement).
+ */
+ weight?: number | null;
+ style_note?: string | null;
+ at: string;
+ }[];
+ /**
+ * The race play and its parent run, when the match was run on the agent engine.
+ */
+ play?: {
+ id: string;
+ run_id?: string | null;
+ } | null;
+ at: string;
+}
+
/** [email protected] (owner: bench) */
/** [email protected] (owner: bench) */
/**
/**
* bench.round.finished v1 (OpenVibe.Bench): a pinned round reached finished with at least two usable entries and is ready for judgements. Envelope: source bench, subject { type: user, id: <created_by> }, visibility first-party.
* bench.round.finished v1 (OpenVibe.Bench): a pinned round reached finished with at least two usable entries and is ready for judgements. Envelope: source bench, subject { type: user, id: <created_by> }, visibility first-party.
@@ -297487,6 +298713,32 @@ export interface BenchJudgementRecordedPayload {
@@ -297487,6 +298713,32 @@ export interface BenchJudgementRecordedPayload {
at: string;
at: string;
}
}
+/** [email protected] (owner: bench) */
+/**
+ * bench.match.recorded v1 (OpenVibe.Bench, 2026-11-13): a match was recorded or gained a judgement. Envelope: source bench, subject { type: match, id: <match id> }. The payload names the match, its source, its task kind and category, its entrants and the judges so far; the match itself (bench.match@1) is read from Bench. Report keeps the open ledger from these; the AI router and Run's Dispatcher refresh their priors from bench.rating.changed.
+ */
+export interface BenchMatchRecordedPayload {
+ match_id: string;
+ source: "arena" | "chat" | "codes" | "live" | "games" | "exchange" | "space" | "bench" | "check";
+ task_kind: "chat" | "code" | "design" | "image" | "speech" | "search" | "computer" | "game";
+ category?: string | null;
+ /**
+ * @minItems 2
+ * @maxItems 8
+ */
+ entrants:
+ | [string, string]
+ | [string, string, string]
+ | [string, string, string, string]
+ | [string, string, string, string, string]
+ | [string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string];
+ judges: ("human_pairwise" | "audience_poll" | "implicit" | "test_suite" | "rubric" | "game_outcome")[];
+ winner_entrant?: string | null;
+ at: string;
+}
+
/** [email protected] (owner: bench) */
/** [email protected] (owner: bench) */
/**
/**
* bench.rating.changed v1 (OpenVibe.Bench): a rating moved on a benchmark board. Envelope: source bench, subject { type: service, id: bench }, visibility first-party.
* bench.rating.changed v1 (OpenVibe.Bench): a rating moved on a benchmark board. Envelope: source bench, subject { type: service, id: bench }, visibility first-party.
@@ -364368,7 +365620,7 @@ export interface AgentsRunUpdatedPayload {
@@ -364368,7 +365620,7 @@ export interface AgentsRunUpdatedPayload {
};
};
}
}
-/** [email protected] (owner: network) */
+/** [email protected] (owner: network) */
/**
/**
* agents.play@1 (agent-engine.md §4, 2026-11-12): a named way for several agents to work on one ask, as data, so a person or an AI can write one and openvibe.run can list it. ROLES are the agents it uses (each with what it does, the size of model it wants, and how many may run at once); PHASES run in order, the roles in a phase together when PARALLEL; CHECKS say who checks whose work, against a written BAR; STOP says when the play is over; BUDGET.SPLIT gives each role its share of the parent's budget. The orchestrator turns a play into child runs (agents.run@1's PARENT_RUN, PLAY and ROLE). Rules every play keeps, whatever it says: a child's end never ends its parent; a person's message never waits behind new work; a child's budget is a slice of its parent's.
* agents.play@1 (agent-engine.md §4, 2026-11-12): a named way for several agents to work on one ask, as data, so a person or an AI can write one and openvibe.run can list it. ROLES are the agents it uses (each with what it does, the size of model it wants, and how many may run at once); PHASES run in order, the roles in a phase together when PARALLEL; CHECKS say who checks whose work, against a written BAR; STOP says when the play is over; BUDGET.SPLIT gives each role its share of the parent's budget. The orchestrator turns a play into child runs (agents.run@1's PARENT_RUN, PLAY and ROLE). Rules every play keeps, whatever it says: a child's end never ends its parent; a person's message never waits behind new work; a child's budget is a slice of its parent's.
*/
*/
@@ -371619,6 +372871,10 @@ export interface AgentsPlay {
@@ -371619,6 +372871,10 @@ export interface AgentsPlay {
type: "user" | "agent" | "service";
type: "user" | "agent" | "service";
id: string;
id: string;
};
};
+ /**
+ * 1.1.0 (2026-11-13): the roles' models, harnesses and names are hidden from the person until the play's first judgement (the race play an Arena round runs: one child run per entrant, the same budget, the names after the vote).
+ */
+ blind?: boolean;
}
}
/** [email protected] (owner: network) */
/** [email protected] (owner: network) */
@@ -37,6 +37,7 @@
@@ -37,6 +37,7 @@
"eventsProduced": [
"eventsProduced": [
"bench.round.finished",
"bench.round.finished",
"bench.judgement.recorded",
"bench.judgement.recorded",
+ "bench.match.recorded",
"bench.rating.changed"
"bench.rating.changed"
],
],
"eventsConsumed": [
"eventsConsumed": [
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.421.0",
+ "version": "0.422.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",