openvibers/openvibe.contracts Commits

openvibe-contracts 0.422.0: one evaluation loop (entrants, matches, model/harness factors, blind plays) (#476)

OP OpenVibers committed 10 h ago · 30cb0acb82 · 70 files, +3167 −117

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 36ad2996..1f12e7f9 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -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).
ddiff --git a/contracts/agents/play.v1.json b/contracts/agents/play.v1.json
iindex 8c629549..1728bac1 100644
---- a/contracts/agents/play.v1.json
++++ b/contracts/agents/play.v1.json
@@@ -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)."
}
}
}
ddiff --git a/contracts/bench/entrant.v1.json b/contracts/bench/entrant.v1.json
nnew file mode 100644
iindex 00000000..73278c9e
---- /dev/null
++++ b/contracts/bench/entrant.v1.json
@@@ -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"] } }
++ ]
++}
ddiff --git a/contracts/bench/match.v1.json b/contracts/bench/match.v1.json
nnew file mode 100644
iindex 00000000..2ff9206f
---- /dev/null
++++ b/contracts/bench/match.v1.json
@@@ -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" }
++ }
++}
ddiff --git a/contracts/bench/rating.v1.json b/contracts/bench/rating.v1.json
iindex bd7a11a2..d8ba37ea 100644
---- a/contracts/bench/rating.v1.json
++++ b/contracts/bench/rating.v1.json
@@@ -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" }
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 18cc4597..04aca211 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -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",
ddiff --git a/contracts/events/payloads/bench.match.recorded.v1.json b/contracts/events/payloads/bench.match.recorded.v1.json
nnew file mode 100644
iindex 00000000..8704334b
---- /dev/null
++++ b/contracts/events/payloads/bench.match.recorded.v1.json
@@@ -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"
++ }
++ }
++}
ddiff --git a/fixtures/bench.entrant/invalid/a-kind-nobody-has.json b/fixtures/bench.entrant/invalid/a-kind-nobody-has.json
nnew file mode 100644
iindex 00000000..3ec9e396
---- /dev/null
++++ b/fixtures/bench.entrant/invalid/a-kind-nobody-has.json
@@@ -0,0 +1,5 @@
++{
++ "id": "model:x",
++ "kind": "robot",
++ "label": "x"
++}
ddiff --git a/fixtures/bench.entrant/invalid/an-agent-without-its-harness.json b/fixtures/bench.entrant/invalid/an-agent-without-its-harness.json
nnew file mode 100644
iindex 00000000..9872ca0a
---- /dev/null
++++ b/fixtures/bench.entrant/invalid/an-agent-without-its-harness.json
@@@ -0,0 +1,8 @@
++{
++ "id": "agent:codex+gpt-5-mini#3f9a1c22",
++ "kind": "agent",
++ "label": "Codex with GPT-5 mini",
++ "model": {
++ "id": "gpt-5-mini"
++ }
++}
ddiff --git a/fixtures/bench.entrant/valid/a-harness.json b/fixtures/bench.entrant/valid/a-harness.json
nnew file mode 100644
iindex 00000000..7e0b2a09
---- /dev/null
++++ b/fixtures/bench.entrant/valid/a-harness.json
@@@ -0,0 +1,9 @@
++{
++ "id": "harness:[email protected]",
++ "kind": "harness",
++ "label": "OpenCode",
++ "harness": {
++ "id": "opencode",
++ "version": "1.4.2"
++ }
++}
ddiff --git a/fixtures/bench.entrant/valid/a-model.json b/fixtures/bench.entrant/valid/a-model.json
nnew file mode 100644
iindex 00000000..db5f8c8e
---- /dev/null
++++ b/fixtures/bench.entrant/valid/a-model.json
@@@ -0,0 +1,10 @@
++{
++ "id": "model:deepseek-flash",
++ "kind": "model",
++ "label": "DeepSeek Flash",
++ "model": {
++ "id": "deepseek-flash",
++ "provider": "deepseek",
++ "family": "deepseek"
++ }
++}
ddiff --git a/fixtures/bench.entrant/valid/an-agent.json b/fixtures/bench.entrant/valid/an-agent.json
nnew file mode 100644
iindex 00000000..f8bdf307
---- /dev/null
++++ b/fixtures/bench.entrant/valid/an-agent.json
@@@ -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"
++}
ddiff --git a/fixtures/bench.match.recorded/invalid/one-entrant.json b/fixtures/bench.match.recorded/invalid/one-entrant.json
nnew file mode 100644
iindex 00000000..ac6eb8d6
---- /dev/null
++++ b/fixtures/bench.match.recorded/invalid/one-entrant.json
@@@ -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"}
ddiff --git a/fixtures/bench.match.recorded/valid/a-vote.json b/fixtures/bench.match.recorded/valid/a-vote.json
nnew file mode 100644
iindex 00000000..4f7ba773
---- /dev/null
++++ b/fixtures/bench.match.recorded/valid/a-vote.json
@@@ -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"
++}
ddiff --git a/fixtures/bench.match/invalid/a-judge-nobody-has.json b/fixtures/bench.match/invalid/a-judge-nobody-has.json
nnew file mode 100644
iindex 00000000..b84ab2fe
---- /dev/null
++++ b/fixtures/bench.match/invalid/a-judge-nobody-has.json
@@@ -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"
++}
ddiff --git a/fixtures/bench.match/invalid/one-side-is-not-a-match.json b/fixtures/bench.match/invalid/one-side-is-not-a-match.json
nnew file mode 100644
iindex 00000000..376963c8
---- /dev/null
++++ b/fixtures/bench.match/invalid/one-side-is-not-a-match.json
@@@ -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"
++}
ddiff --git a/fixtures/bench.match/valid/a-codes-race-merged.json b/fixtures/bench.match/valid/a-codes-race-merged.json
nnew file mode 100644
iindex 00000000..a37c3293
---- /dev/null
++++ b/fixtures/bench.match/valid/a-codes-race-merged.json
@@@ -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"
++}
ddiff --git a/fixtures/bench.match/valid/an-arena-vote.json b/fixtures/bench.match/valid/an-arena-vote.json
nnew file mode 100644
iindex 00000000..c1113013
---- /dev/null
++++ b/fixtures/bench.match/valid/an-arena-vote.json
@@@ -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"
++}
ddiff --git a/fixtures/bench.rating/valid/an-agent-with-its-factors.json b/fixtures/bench.rating/valid/an-agent-with-its-factors.json
nnew file mode 100644
iindex 00000000..fd168817
---- /dev/null
++++ b/fixtures/bench.rating/valid/an-agent-with-its-factors.json
@@@ -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"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 63ceb3a8..f25d7e00 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -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)."
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 93ad6cd8..851afa8a 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -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"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex cfd0b933..e19cc97f 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -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"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 482dc674..31be2334 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -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",
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 7da944f9..1dcde93d 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -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"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex d6084f6e..d30b86cd 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -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"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 95376f64..021d2dda 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -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"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 0b4941e0..ee13d6f0 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -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"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 1384e080..fee965d6 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -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"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex e1d3ab34..4d4b9994 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -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"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex 2003873d..325d71dd 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -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"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 36c07f14..c78d25ae 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -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"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 95802cb5..709d0b93 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -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"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 1509131f..74517bcd 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -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"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex d90fbf42..a8bb676b 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -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"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 0ea8bea5..535272ca 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -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"
ddiff --git a/generated/openapi/exchange.json b/generated/openapi/exchange.json
iindex 37550aa2..c21a4285 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -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"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex c260f433..48a97065 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -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"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 219d0996..9325e361 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -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"
ddiff --git a/generated/openapi/git.json b/generated/openapi/git.json
iindex 3fe1affe..03536803 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -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"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 456af27a..ab5ef361 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -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"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex c142d562..6875f05f 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -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"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex ad9e3ecb..e57aab31 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -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"
ddiff --git a/generated/openapi/mail.json b/generated/openapi/mail.json
iindex e9cb3ef7..d9424025 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -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"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex a78c0132..14676c07 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -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"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 291084bc..511edf96 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -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"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex cf63c57f..f17d8f84 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -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"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex ca3acd29..04aad548 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -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"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex cd4501c1..f70ec0c2 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -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"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 9c3313b2..30a363f8 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -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"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 8c4e4fd8..6e185db8 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -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"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex c89f7c75..b9140daa 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -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"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 1640fe11..436e238c 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -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"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex d6d9f340..75cb5b0f 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -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"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 9168b715..cfcc9096 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -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"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 3452018f..64c95fde 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -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"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 735aff91..2c2aab0b 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -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"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex eb53ce11..6ce16a8a 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -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"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 4d89dac8..704822ab 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -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"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex 476c248a..25156b35 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -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"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex ea7c07fc..7509634c 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -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"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 0a033abb..7ee31ef4 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -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"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 5536120b..a4d5f869 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -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"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 9d5e673e..d3449d3b 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -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"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 0d273089..554192db 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -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"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 5135ac0a..93e907c0 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -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"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 98baf33c..407b81dc 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -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"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 80133f99..4ecfac1a 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -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"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 83d490b3..f40ce3ec 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -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) */
ddiff --git a/manifests/services/bench.json b/manifests/services/bench.json
iindex 1d67cffb..1f2e622b 100644
---- a/manifests/services/bench.json
++++ b/manifests/services/bench.json
@@@ -37,6 +37,7 @@
"eventsProduced": [
"bench.round.finished",
"bench.judgement.recorded",
++ "bench.match.recorded",
"bench.rating.changed"
],
"eventsConsumed": [
ddiff --git a/package.json b/package.json
iindex 0aba7f45..a4be6d3e 100644
---- a/package.json
++++ b/package.json
@@@ -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",