openvibers/openvibe.contracts Commits

0.238.0: OpenVibe.Bench (schemas, capabilities, events); Codes actor_ref (#246)

OP OpenVibers committed 16 days ago · 3224d9038a · 85 files, +2784 −85

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex ecb9a6b2..318d26af 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,22 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.238.0 — 2026-10-28
++
++- **OpenVibe.Bench** (`bench`, live at bench.openvibe.services, port 5230, database `ov_bench`): the shared AI
++ benchmark and comparison engine for every room (plan §4.12). It owns kinds, pinned rounds, entries, blind
++ judgements, ratings, boards, the open dataset per kind and private evals; AI stays the run authority and Report
++ the analytics authority. New `bench.kind@1`, `bench.task@1`, `bench.round@1`, `bench.entry@1`,
++ `bench.judgement@1` and `bench.rating@1` schemas, the `bench.round.finished`, `bench.judgement.recorded` and
++ `bench.rating.changed` event payloads, and nine first-party `bench.*` capabilities. The manifest is modeled on
++ OpenVibe.AI (`bench.openvibe.services`, not `openvibe.bench`) and its site block (Bench, icon `bench`, position 47,
++ legal profile `tools`) sits in For developers. Bench calls `ai.run.create` (namespace `ai.generate`) and subscribes
++ to the account events; Design moves its Arena onto Bench with `bench.task.create`, `bench.round.create`,
++ `bench.round.read`, `bench.judgement.cast` and `bench.board.read`.
++- **Codes** (`codes.task-start-request@1` 1.1.0, `codes.task@1` 1.1.0): optional `actor_task_id`/`actor_step_id`
++ request fields and the `actor_ref` back-reference, so a task started from OpenVibe.Actor can carry its Actor task
++ and step. Both are optional, so existing producers and consumers are unaffected.
++
## 0.237.0 — 2026-10-28
- **OpenVibe.Cam** (`cam`, live at openvibe.cam, port 5160, database `ov_cam`): the camera app (preview, timer,
ddiff --git a/contracts/bench/entry.v1.json b/contracts/bench/entry.v1.json
nnew file mode 100644
iindex 00000000..4fd18de8
---- /dev/null
++++ b/contracts/bench/entry.v1.json
@@@ -0,0 +1,23 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/entry.v1.json",
++ "title": "BenchEntry",
++ "description": "bench.entry@1: one submitted entry in a benchmark round on OpenVibe.Bench. PROVIDER and MODEL name the offer; ROUTE is the exact route taken; PAYLOAD is the entry's output; COST_USD, MS and TOKENS are the measured use.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "round_id", "provider", "model", "route", "payload", "cost_usd", "ms", "tokens"],
++ "properties": {
++ "id": { "type": "string" },
++ "round_id": { "type": "string" },
++ "provider": { "type": "string" },
++ "model": { "type": "string" },
++ "route": { "type": "object" },
++ "payload": { "type": "object" },
++ "cost_usd": { "type": "number" },
++ "ms": { "type": "number" },
++ "tokens": { "type": "number" },
++ "error": { "type": ["string", "null"] },
++ "ui_check": { "type": ["object", "null"] },
++ "run_id": { "type": ["string", "null"] }
++ }
++}
ddiff --git a/contracts/bench/judgement.v1.json b/contracts/bench/judgement.v1.json
nnew file mode 100644
iindex 00000000..185dae48
---- /dev/null
++++ b/contracts/bench/judgement.v1.json
@@@ -0,0 +1,22 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/judgement.v1.json",
++ "title": "BenchJudgement",
++ "description": "bench.judgement@1: a blind judgement cast on a benchmark round on OpenVibe.Bench. JUDGE names the judge (pair, rubric, automatic_grader, test_suite, game_outcome); METHOD is how the pair was decided; PAIR is the two entry ids; OUTCOME and SCORE are the result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "round_id", "kind_id", "judge", "method", "pair", "outcome", "score", "at"],
++ "properties": {
++ "id": { "type": "string" },
++ "round_id": { "type": "string" },
++ "kind_id": { "type": "string" },
++ "judge": { "type": "string" },
++ "judge_name": { "type": ["string", "null"] },
++ "judge_version": { "type": ["string", "null"] },
++ "method": { "type": "string" },
++ "pair": { "type": ["object", "null"] },
++ "outcome": { "type": ["string", "null"] },
++ "score": { "type": ["number", "null"] },
++ "at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/bench/kind.v1.json b/contracts/bench/kind.v1.json
nnew file mode 100644
iindex 00000000..242cb0c1
---- /dev/null
++++ b/contracts/bench/kind.v1.json
@@@ -0,0 +1,19 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/kind.v1.json",
++ "title": "BenchKind",
++ "description": "bench.kind@1: a benchmark kind on OpenVibe.Bench. ROOM is the room that owns the kind, ENTRY the shape a submitted entry takes, JUDGE the default judge (pair, rubric, automatic_grader, test_suite or game_outcome), NAME the display name, SCHEMA the entry JSON Schema, and METRICS the board metrics (elo, pareto, cost, or a room's own).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "room", "entry", "judge", "name", "schema", "metrics", "created_at"],
++ "properties": {
++ "id": { "type": "string" },
++ "room": { "type": "string" },
++ "entry": { "type": "string" },
++ "judge": { "type": "string" },
++ "name": { "type": "string" },
++ "schema": { "type": "object" },
++ "metrics": { "type": "array", "items": { "type": "string" } },
++ "created_at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/bench/rating.v1.json b/contracts/bench/rating.v1.json
nnew file mode 100644
iindex 00000000..bd7a11a2
---- /dev/null
++++ b/contracts/bench/rating.v1.json
@@@ -0,0 +1,25 @@
++{
++ "$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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["kind_id", "category", "subject", "elo", "games", "wins", "losses", "ties", "win_rate", "ci_lower", "ci_upper"],
++ "properties": {
++ "kind_id": { "type": "string" },
++ "category": { "type": "string" },
++ "subject": { "type": "string" },
++ "elo": { "type": "number" },
++ "games": { "type": "number" },
++ "wins": { "type": "number" },
++ "losses": { "type": "number" },
++ "ties": { "type": "number" },
++ "win_rate": { "type": "number" },
++ "ci_lower": { "type": "number" },
++ "ci_upper": { "type": "number" },
++ "median_cost_usd": { "type": ["number", "null"] },
++ "median_ms": { "type": ["number", "null"] },
++ "provisional": { "type": "boolean" }
++ }
++}
ddiff --git a/contracts/bench/round.v1.json b/contracts/bench/round.v1.json
nnew file mode 100644
iindex 00000000..397c40eb
---- /dev/null
++++ b/contracts/bench/round.v1.json
@@@ -0,0 +1,21 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/round.v1.json",
++ "title": "BenchRound",
++ "description": "bench.round@1: a pinned, reproducible benchmark round on OpenVibe.Bench. TASK_ID names the task; OFFERS are the exact offers (provider, model, route) the round runs; STATUS follows queued, running, ready, finished or failed; SEED and RECEIPT make the round reproducible.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "task_id", "kind_id", "offers", "status", "seed", "created_by", "created_at"],
++ "properties": {
++ "id": { "type": "string" },
++ "task_id": { "type": "string" },
++ "kind_id": { "type": "string" },
++ "offers": { "type": "array", "items": { "type": "object" } },
++ "status": { "type": "string", "enum": ["queued", "running", "ready", "finished", "failed"] },
++ "seed": { "type": "integer" },
++ "pool_fallback": { "type": "boolean" },
++ "receipt": { "type": ["string", "null"] },
++ "created_by": { "type": "string" },
++ "created_at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/bench/task.v1.json b/contracts/bench/task.v1.json
nnew file mode 100644
iindex 00000000..0366349c
---- /dev/null
++++ b/contracts/bench/task.v1.json
@@@ -0,0 +1,18 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/task.v1.json",
++ "title": "BenchTask",
++ "description": "bench.task@1: a benchmark task on OpenVibe.Bench. KIND_ID names the kind; PROMPT is the task; TASK_CLASS is an optional classifier for grouping; PUBLIC says whether the task may appear in the open dataset.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "kind_id", "prompt", "public", "created_by", "created_at"],
++ "properties": {
++ "id": { "type": "string" },
++ "kind_id": { "type": "string" },
++ "prompt": { "type": "string" },
++ "task_class": { "type": ["string", "null"] },
++ "public": { "type": "boolean" },
++ "created_by": { "type": "string" },
++ "created_at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex b8d37e0c..557afa2a 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7344,7 +7344,7 @@
},
{
"id": "codes.task-start-request",
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "codes",
"schema": "codes/task-start-request.v1.json",
"visibility": "first-party",
@@@ -7362,7 +7362,7 @@
},
{
"id": "codes.task",
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "codes",
"schema": "codes/task.v1.json",
"visibility": "first-party",
@@@ -7721,6 +7721,87 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "bench.kind",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "bench/kind.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.task",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "bench/task.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.round",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "bench/round.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.entry",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "bench/entry.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.judgement",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "bench/judgement.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.rating",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "bench/rating.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.round.finished",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "events/payloads/bench.round.finished.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.judgement.recorded",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "events/payloads/bench.judgement.recorded.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "bench.rating.changed",
++ "version": "1.0.0",
++ "owner": "bench",
++ "schema": "events/payloads/bench.rating.changed.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/codes/task-start-request.v1.json b/contracts/codes/task-start-request.v1.json
iindex 84a18af4..794f9768 100644
---- a/contracts/codes/task-start-request.v1.json
++++ b/contracts/codes/task-start-request.v1.json
@@@ -48,6 +48,18 @@
"minLength": 8,
"maxLength": 128,
"pattern": "^[A-Za-z0-9_.:-]+$"
++ },
++ "actor_task_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256,
++ "description": "The OpenVibe.Actor task id when this coding task was started from Actor."
++ },
++ "actor_step_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256,
++ "description": "The OpenVibe.Actor step id when this coding task was started from Actor."
}
}
}
ddiff --git a/contracts/codes/task.v1.json b/contracts/codes/task.v1.json
iindex 63194b92..9d28645f 100644
---- a/contracts/codes/task.v1.json
++++ b/contracts/codes/task.v1.json
@@@ -174,6 +174,15 @@
"maxLength": 1000
}
}
++ },
++ "actor_ref": {
++ "type": ["object", "null"],
++ "additionalProperties": false,
++ "properties": {
++ "task_id": { "type": "string", "minLength": 1, "maxLength": 256 },
++ "step_id": { "type": "string", "minLength": 1, "maxLength": 256 }
++ },
++ "description": "The OpenVibe.Actor task and step that started this coding task, when it came from Actor."
}
}
}
ddiff --git a/contracts/events/payloads/bench.judgement.recorded.v1.json b/contracts/events/payloads/bench.judgement.recorded.v1.json
nnew file mode 100644
iindex 00000000..53fec091
---- /dev/null
++++ b/contracts/events/payloads/bench.judgement.recorded.v1.json
@@@ -0,0 +1,19 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/bench.judgement.recorded.v1.json",
++ "title": "BenchJudgementRecordedPayload",
++ "description": "bench.judgement.recorded v1 (OpenVibe.Bench): a judgement was cast on a round. Envelope: source bench, subject { type: user, id: <judge> } or { type: service, id: <judge> }, visibility first-party.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["round_id", "kind_id", "judge", "method", "at"],
++ "properties": {
++ "round_id": { "type": "string" },
++ "kind_id": { "type": "string" },
++ "judge": { "type": "string" },
++ "judge_name": { "type": ["string", "null"] },
++ "method": { "type": "string" },
++ "outcome": { "type": ["string", "null"] },
++ "score": { "type": ["number", "null"] },
++ "at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/events/payloads/bench.rating.changed.v1.json b/contracts/events/payloads/bench.rating.changed.v1.json
nnew file mode 100644
iindex 00000000..1ed016d6
---- /dev/null
++++ b/contracts/events/payloads/bench.rating.changed.v1.json
@@@ -0,0 +1,26 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/bench.rating.changed.v1.json",
++ "title": "BenchRatingChangedPayload",
++ "description": "bench.rating.changed v1 (OpenVibe.Bench): a rating moved on a benchmark board. Envelope: source bench, subject { type: service, id: bench }, visibility first-party.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["kind_id", "category", "subject", "elo", "games", "win_rate", "at"],
++ "properties": {
++ "kind_id": { "type": "string" },
++ "category": { "type": "string" },
++ "subject": { "type": "string" },
++ "elo": { "type": "number" },
++ "games": { "type": "number" },
++ "wins": { "type": "number" },
++ "losses": { "type": "number" },
++ "ties": { "type": "number" },
++ "win_rate": { "type": "number" },
++ "ci_lower": { "type": "number" },
++ "ci_upper": { "type": "number" },
++ "median_cost_usd": { "type": ["number", "null"] },
++ "median_ms": { "type": ["number", "null"] },
++ "provisional": { "type": "boolean" },
++ "at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/events/payloads/bench.round.finished.v1.json b/contracts/events/payloads/bench.round.finished.v1.json
nnew file mode 100644
iindex 00000000..a35a6985
---- /dev/null
++++ b/contracts/events/payloads/bench.round.finished.v1.json
@@@ -0,0 +1,17 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/bench.round.finished.v1.json",
++ "title": "BenchRoundFinishedPayload",
++ "description": "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["round_id", "task_id", "kind_id", "status", "entries", "finished_at"],
++ "properties": {
++ "round_id": { "type": "string" },
++ "task_id": { "type": "string" },
++ "kind_id": { "type": "string" },
++ "status": { "const": "finished" },
++ "entries": { "type": "integer", "minimum": 0 },
++ "finished_at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/fixtures/bench.entry/invalid/missing-tokens.json b/fixtures/bench.entry/invalid/missing-tokens.json
nnew file mode 100644
iindex 00000000..1dc42c9e
---- /dev/null
++++ b/fixtures/bench.entry/invalid/missing-tokens.json
@@@ -0,0 +1,10 @@
++{
++ "id": "ent_01J8Z3Q4R5S6T7V8W9X0Y1Z2A7",
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "provider": "openai",
++ "model": "gpt-4o",
++ "route": { "provider": "openai", "model": "gpt-4o" },
++ "payload": { "text": "It is a page about benchmarks." },
++ "cost_usd": 0.01,
++ "ms": 1200
++}
ddiff --git a/fixtures/bench.entry/valid/answer.json b/fixtures/bench.entry/valid/answer.json
nnew file mode 100644
iindex 00000000..496d8685
---- /dev/null
++++ b/fixtures/bench.entry/valid/answer.json
@@@ -0,0 +1,14 @@
++{
++ "id": "ent_01J8Z3Q4R5S6T7V8W9X0Y1Z2A7",
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "provider": "openai",
++ "model": "gpt-4o",
++ "route": { "provider": "openai", "model": "gpt-4o" },
++ "payload": { "text": "It is a page about benchmarks." },
++ "cost_usd": 0.01,
++ "ms": 1200,
++ "tokens": 42,
++ "error": null,
++ "ui_check": null,
++ "run_id": null
++}
ddiff --git a/fixtures/bench.judgement.recorded/invalid/missing-at.json b/fixtures/bench.judgement.recorded/invalid/missing-at.json
nnew file mode 100644
iindex 00000000..cee277fa
---- /dev/null
++++ b/fixtures/bench.judgement.recorded/invalid/missing-at.json
@@@ -0,0 +1,8 @@
++{
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "judge": "pair",
++ "method": "human_vote",
++ "outcome": "a",
++ "score": null
++}
ddiff --git a/fixtures/bench.judgement.recorded/valid/recorded.json b/fixtures/bench.judgement.recorded/valid/recorded.json
nnew file mode 100644
iindex 00000000..4d90cabc
---- /dev/null
++++ b/fixtures/bench.judgement.recorded/valid/recorded.json
@@@ -0,0 +1,10 @@
++{
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "judge": "pair",
++ "judge_name": null,
++ "method": "human_vote",
++ "outcome": "a",
++ "score": null,
++ "at": "2026-10-28T18:05:00.000Z"
++}
ddiff --git a/fixtures/bench.judgement/invalid/missing-method.json b/fixtures/bench.judgement/invalid/missing-method.json
nnew file mode 100644
iindex 00000000..6ac6ad54
---- /dev/null
++++ b/fixtures/bench.judgement/invalid/missing-method.json
@@@ -0,0 +1,10 @@
++{
++ "id": "jdg_01J8Z3Q4R5S6T7V8W9X0Y1Z2A8",
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "judge": "pair",
++ "pair": { "a": "ent_01J8Z3Q4R5S6T7V8W9X0Y1Z2A7", "b": "ent_01J8Z3Q4R5S6T7V8W9X0Y1Z2A9" },
++ "outcome": "a",
++ "score": null,
++ "at": "2026-10-28T18:05:00.000Z"
++}
ddiff --git a/fixtures/bench.judgement/valid/human-vote.json b/fixtures/bench.judgement/valid/human-vote.json
nnew file mode 100644
iindex 00000000..de8e6aa7
---- /dev/null
++++ b/fixtures/bench.judgement/valid/human-vote.json
@@@ -0,0 +1,13 @@
++{
++ "id": "jdg_01J8Z3Q4R5S6T7V8W9X0Y1Z2A8",
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "judge": "pair",
++ "judge_name": null,
++ "judge_version": null,
++ "method": "human_vote",
++ "pair": { "a": "ent_01J8Z3Q4R5S6T7V8W9X0Y1Z2A7", "b": "ent_01J8Z3Q4R5S6T7V8W9X0Y1Z2A9" },
++ "outcome": "a",
++ "score": null,
++ "at": "2026-10-28T18:05:00.000Z"
++}
ddiff --git a/fixtures/bench.kind/invalid/missing-name.json b/fixtures/bench.kind/invalid/missing-name.json
nnew file mode 100644
iindex 00000000..57f0342e
---- /dev/null
++++ b/fixtures/bench.kind/invalid/missing-name.json
@@@ -0,0 +1,9 @@
++{
++ "id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "room": "design",
++ "entry": "prompt",
++ "judge": "pair",
++ "schema": { "type": "object" },
++ "metrics": ["elo"],
++ "created_at": "2026-10-28T18:00:00.000Z"
++}
ddiff --git a/fixtures/bench.kind/valid/design-ui-copy.json b/fixtures/bench.kind/valid/design-ui-copy.json
nnew file mode 100644
iindex 00000000..fb1b8c86
---- /dev/null
++++ b/fixtures/bench.kind/valid/design-ui-copy.json
@@@ -0,0 +1,10 @@
++{
++ "id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "room": "design",
++ "entry": "prompt",
++ "judge": "pair",
++ "name": "UI copy",
++ "schema": { "type": "object" },
++ "metrics": ["elo", "cost"],
++ "created_at": "2026-10-28T18:00:00.000Z"
++}
ddiff --git a/fixtures/bench.rating.changed/invalid/missing-elo.json b/fixtures/bench.rating.changed/invalid/missing-elo.json
nnew file mode 100644
iindex 00000000..659ed7ab
---- /dev/null
++++ b/fixtures/bench.rating.changed/invalid/missing-elo.json
@@@ -0,0 +1,8 @@
++{
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "category": "model",
++ "subject": "gpt-4o",
++ "games": 11,
++ "win_rate": 0.63,
++ "at": "2026-10-28T18:05:00.000Z"
++}
ddiff --git a/fixtures/bench.rating.changed/valid/changed.json b/fixtures/bench.rating.changed/valid/changed.json
nnew file mode 100644
iindex 00000000..3d201c78
---- /dev/null
++++ b/fixtures/bench.rating.changed/valid/changed.json
@@@ -0,0 +1,9 @@
++{
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "category": "model",
++ "subject": "gpt-4o",
++ "elo": 1502,
++ "games": 11,
++ "win_rate": 0.63,
++ "at": "2026-10-28T18:05:00.000Z"
++}
ddiff --git a/fixtures/bench.rating/invalid/missing-ci-upper.json b/fixtures/bench.rating/invalid/missing-ci-upper.json
nnew file mode 100644
iindex 00000000..12b5848e
---- /dev/null
++++ b/fixtures/bench.rating/invalid/missing-ci-upper.json
@@@ -0,0 +1,12 @@
++{
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "category": "model",
++ "subject": "gpt-4o",
++ "elo": 1500,
++ "games": 10,
++ "wins": 6,
++ "losses": 3,
++ "ties": 1,
++ "win_rate": 0.6,
++ "ci_lower": 1400
++}
ddiff --git a/fixtures/bench.rating/valid/model.json b/fixtures/bench.rating/valid/model.json
nnew file mode 100644
iindex 00000000..597f8c06
---- /dev/null
++++ b/fixtures/bench.rating/valid/model.json
@@@ -0,0 +1,16 @@
++{
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "category": "model",
++ "subject": "gpt-4o",
++ "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
++}
ddiff --git a/fixtures/bench.round.finished/invalid/wrong-status.json b/fixtures/bench.round.finished/invalid/wrong-status.json
nnew file mode 100644
iindex 00000000..8574f837
---- /dev/null
++++ b/fixtures/bench.round.finished/invalid/wrong-status.json
@@@ -0,0 +1,8 @@
++{
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "task_id": "tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "status": "queued",
++ "entries": 1,
++ "finished_at": "2026-10-28T18:10:00.000Z"
++}
ddiff --git a/fixtures/bench.round.finished/valid/finished.json b/fixtures/bench.round.finished/valid/finished.json
nnew file mode 100644
iindex 00000000..9cdfcf5e
---- /dev/null
++++ b/fixtures/bench.round.finished/valid/finished.json
@@@ -0,0 +1,8 @@
++{
++ "round_id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "task_id": "tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "status": "finished",
++ "entries": 2,
++ "finished_at": "2026-10-28T18:10:00.000Z"
++}
ddiff --git a/fixtures/bench.round/invalid/bad-status.json b/fixtures/bench.round/invalid/bad-status.json
nnew file mode 100644
iindex 00000000..5c860506
---- /dev/null
++++ b/fixtures/bench.round/invalid/bad-status.json
@@@ -0,0 +1,12 @@
++{
++ "id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "task_id": "tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "offers": [{ "provider": "openai", "model": "gpt-4o" }],
++ "status": "bogus",
++ "seed": 1,
++ "pool_fallback": false,
++ "receipt": null,
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z"
++}
ddiff --git a/fixtures/bench.round/valid/queued.json b/fixtures/bench.round/valid/queued.json
nnew file mode 100644
iindex 00000000..f95243ea
---- /dev/null
++++ b/fixtures/bench.round/valid/queued.json
@@@ -0,0 +1,12 @@
++{
++ "id": "rnd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6",
++ "task_id": "tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "offers": [{ "provider": "openai", "model": "gpt-4o" }],
++ "status": "queued",
++ "seed": 1,
++ "pool_fallback": false,
++ "receipt": null,
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z"
++}
ddiff --git a/fixtures/bench.task/invalid/missing-public.json b/fixtures/bench.task/invalid/missing-public.json
nnew file mode 100644
iindex 00000000..e3f10fdf
---- /dev/null
++++ b/fixtures/bench.task/invalid/missing-public.json
@@@ -0,0 +1,8 @@
++{
++ "id": "tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "prompt": "Summarize this page.",
++ "task_class": null,
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z"
++}
ddiff --git a/fixtures/bench.task/valid/summarize.json b/fixtures/bench.task/valid/summarize.json
nnew file mode 100644
iindex 00000000..776cb186
---- /dev/null
++++ b/fixtures/bench.task/valid/summarize.json
@@@ -0,0 +1,9 @@
++{
++ "id": "tsk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "kind_id": "knd_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "prompt": "Summarize this page in one sentence.",
++ "task_class": null,
++ "public": true,
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex d85088e0..8f09db2a 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -83027,7 +83027,7 @@
}
},
"codes.task-start-request": {
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "codes",
"status": "active",
"schema": {
@@@ -83080,6 +83080,18 @@
"minLength": 8,
"maxLength": 128,
"pattern": "^[A-Za-z0-9_.:-]+$"
++ },
++ "actor_task_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256,
++ "description": "The OpenVibe.Actor task id when this coding task was started from Actor."
++ },
++ "actor_step_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256,
++ "description": "The OpenVibe.Actor step id when this coding task was started from Actor."
}
}
}
@@@ -83110,7 +83122,7 @@
}
},
"codes.task": {
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "codes",
"status": "active",
"schema": {
@@@ -83289,6 +83301,26 @@
"maxLength": 1000
}
}
++ },
++ "actor_ref": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "task_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256
++ },
++ "step_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256
++ }
++ },
++ "description": "The OpenVibe.Actor task and step that started this coding task, when it came from Actor."
}
}
}
@@@ -86962,6 +86994,573 @@
}
}
}
++ },
++ "bench.kind": {
++ "version": "1.0.0",
++ "owner": "bench",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/kind.v1.json",
++ "title": "BenchKind",
++ "description": "bench.kind@1: a benchmark kind on OpenVibe.Bench. ROOM is the room that owns the kind, ENTRY the shape a submitted entry takes, JUDGE the default judge (pair, rubric, automatic_grader, test_suite or game_outcome), NAME the display name, SCHEMA the entry JSON Schema, and METRICS the board metrics (elo, pareto, cost, or a room's own).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "room",
++ "entry",
++ "judge",
++ "name",
++ "schema",
++ "metrics",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "room": {
++ "type": "string"
++ },
++ "entry": {
++ "type": "string"
++ },
++ "judge": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "schema": {
++ "type": "object"
++ },
++ "metrics": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ }
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "bench.task": {
++ "version": "1.0.0",
++ "owner": "bench",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/task.v1.json",
++ "title": "BenchTask",
++ "description": "bench.task@1: a benchmark task on OpenVibe.Bench. KIND_ID names the kind; PROMPT is the task; TASK_CLASS is an optional classifier for grouping; PUBLIC says whether the task may appear in the open dataset.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "kind_id",
++ "prompt",
++ "public",
++ "created_by",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "prompt": {
++ "type": "string"
++ },
++ "task_class": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "public": {
++ "type": "boolean"
++ },
++ "created_by": {
++ "type": "string"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "bench.round": {
++ "version": "1.0.0",
++ "owner": "bench",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/round.v1.json",
++ "title": "BenchRound",
++ "description": "bench.round@1: a pinned, reproducible benchmark round on OpenVibe.Bench. TASK_ID names the task; OFFERS are the exact offers (provider, model, route) the round runs; STATUS follows queued, running, ready, finished or failed; SEED and RECEIPT make the round reproducible.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "task_id",
++ "kind_id",
++ "offers",
++ "status",
++ "seed",
++ "created_by",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "task_id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "offers": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ },
++ "status": {
++ "type": "string",
++ "enum": [
++ "queued",
++ "running",
++ "ready",
++ "finished",
++ "failed"
++ ]
++ },
++ "seed": {
++ "type": "integer"
++ },
++ "pool_fallback": {
++ "type": "boolean"
++ },
++ "receipt": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "created_by": {
++ "type": "string"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "bench.entry": {
++ "version": "1.0.0",
++ "owner": "bench",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/entry.v1.json",
++ "title": "BenchEntry",
++ "description": "bench.entry@1: one submitted entry in a benchmark round on OpenVibe.Bench. PROVIDER and MODEL name the offer; ROUTE is the exact route taken; PAYLOAD is the entry's output; COST_USD, MS and TOKENS are the measured use.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "round_id",
++ "provider",
++ "model",
++ "route",
++ "payload",
++ "cost_usd",
++ "ms",
++ "tokens"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "round_id": {
++ "type": "string"
++ },
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": "string"
++ },
++ "route": {
++ "type": "object"
++ },
++ "payload": {
++ "type": "object"
++ },
++ "cost_usd": {
++ "type": "number"
++ },
++ "ms": {
++ "type": "number"
++ },
++ "tokens": {
++ "type": "number"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "ui_check": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "run_id": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "bench.judgement": {
++ "version": "1.0.0",
++ "owner": "bench",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/bench/judgement.v1.json",
++ "title": "BenchJudgement",
++ "description": "bench.judgement@1: a blind judgement cast on a benchmark round on OpenVibe.Bench. JUDGE names the judge (pair, rubric, automatic_grader, test_suite, game_outcome); METHOD is how the pair was decided; PAIR is the two entry ids; OUTCOME and SCORE are the result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "round_id",
++ "kind_id",
++ "judge",
++ "method",
++ "pair",
++ "outcome",
++ "score",
++ "at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "round_id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "judge": {
++ "type": "string"
++ },
++ "judge_name": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "judge_version": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "method": {
++ "type": "string"
++ },
++ "pair": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "outcome": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "score": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "bench.rating": {
++ "version": "1.0.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind_id",
++ "category",
++ "subject",
++ "elo",
++ "games",
++ "wins",
++ "losses",
++ "ties",
++ "win_rate",
++ "ci_lower",
++ "ci_upper"
++ ],
++ "properties": {
++ "kind_id": {
++ "type": "string"
++ },
++ "category": {
++ "type": "string"
++ },
++ "subject": {
++ "type": "string"
++ },
++ "elo": {
++ "type": "number"
++ },
++ "games": {
++ "type": "number"
++ },
++ "wins": {
++ "type": "number"
++ },
++ "losses": {
++ "type": "number"
++ },
++ "ties": {
++ "type": "number"
++ },
++ "win_rate": {
++ "type": "number"
++ },
++ "ci_lower": {
++ "type": "number"
++ },
++ "ci_upper": {
++ "type": "number"
++ },
++ "median_cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "median_ms": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "provisional": {
++ "type": "boolean"
++ }
++ }
++ }
++ },
++ "bench.round.finished": {
++ "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.round.finished.v1.json",
++ "title": "BenchRoundFinishedPayload",
++ "description": "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "round_id",
++ "task_id",
++ "kind_id",
++ "status",
++ "entries",
++ "finished_at"
++ ],
++ "properties": {
++ "round_id": {
++ "type": "string"
++ },
++ "task_id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "status": {
++ "const": "finished"
++ },
++ "entries": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "finished_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "bench.judgement.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.judgement.recorded.v1.json",
++ "title": "BenchJudgementRecordedPayload",
++ "description": "bench.judgement.recorded v1 (OpenVibe.Bench): a judgement was cast on a round. Envelope: source bench, subject { type: user, id: <judge> } or { type: service, id: <judge> }, visibility first-party.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "round_id",
++ "kind_id",
++ "judge",
++ "method",
++ "at"
++ ],
++ "properties": {
++ "round_id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "judge": {
++ "type": "string"
++ },
++ "judge_name": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "method": {
++ "type": "string"
++ },
++ "outcome": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "score": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "bench.rating.changed": {
++ "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.rating.changed.v1.json",
++ "title": "BenchRatingChangedPayload",
++ "description": "bench.rating.changed v1 (OpenVibe.Bench): a rating moved on a benchmark board. Envelope: source bench, subject { type: service, id: bench }, visibility first-party.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind_id",
++ "category",
++ "subject",
++ "elo",
++ "games",
++ "win_rate",
++ "at"
++ ],
++ "properties": {
++ "kind_id": {
++ "type": "string"
++ },
++ "category": {
++ "type": "string"
++ },
++ "subject": {
++ "type": "string"
++ },
++ "elo": {
++ "type": "number"
++ },
++ "games": {
++ "type": "number"
++ },
++ "wins": {
++ "type": "number"
++ },
++ "losses": {
++ "type": "number"
++ },
++ "ties": {
++ "type": "number"
++ },
++ "win_rate": {
++ "type": "number"
++ },
++ "ci_lower": {
++ "type": "number"
++ },
++ "ci_upper": {
++ "type": "number"
++ },
++ "median_cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "median_ms": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "provisional": {
++ "type": "boolean"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 10cd258d..9aa1b0fa 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.237.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 b19929b0..0701677b 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.237.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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
nnew file mode 100644
iindex 00000000..8201487f
---- /dev/null
++++ b/generated/openapi/bench.json
@@@ -0,0 +1,1101 @@
++{
++ "openapi": "3.1.0",
++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
++ "info": {
++ "title": "OpenVibe.Bench API",
++ "version": "0.238.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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"
++ }
++ },
++ "servers": [
++ {
++ "url": "https://bench.openvibe.services"
++ }
++ ],
++ "paths": {
++ "/api/v1/boards/{kindId}": {
++ "get": {
++ "operationId": "get_api_v1_boards_kindId",
++ "summary": "Read a benchmark board on OpenVibe.Bench: GET /api/v1/boards/:kindId?type=elo|pareto|cost returns the rendered board for a kind.",
++ "description": "**bench.board.read** (first-party): Read a benchmark board on OpenVibe.Bench: GET /api/v1/boards/:kindId?type=elo|pareto|cost returns the rendered board for a kind.",
++ "tags": [
++ "bench.board"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.board.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.board.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "kindId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.rating.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/datasets/{kindId}.jsonl": {
++ "get": {
++ "operationId": "get_api_v1_datasets_kindId_jsonl",
++ "summary": "Read the open dataset for a benchmark kind on OpenVibe.Bench: GET /api/v1/datasets/:kindId.jsonl returns prompts, entries, judgements without voter ids and ratings as JSON lines.",
++ "description": "**bench.dataset.read** (first-party): Read the open dataset for a benchmark kind on OpenVibe.Bench: GET /api/v1/datasets/:kindId.jsonl returns prompts, entries, judgements without voter ids and ratings as JSON lines.",
++ "tags": [
++ "bench.dataset"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.dataset.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.dataset.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "kindId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/octet-stream": {
++ "schema": {
++ "type": "string",
++ "contentEncoding": "binary"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/evals": {
++ "post": {
++ "operationId": "post_api_v1_evals",
++ "summary": "Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eva",
++ "description": "**bench.eval.manage** (first-party): Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eval and its runs. Never in the public dataset.",
++ "tags": [
++ "bench.eval"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.eval.manage"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.eval.manage"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.task.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/evals/{id}/results": {
++ "get": {
++ "operationId": "get_api_v1_evals_id_results",
++ "summary": "Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eva",
++ "description": "**bench.eval.manage** (first-party): Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eval and its runs. Never in the public dataset.",
++ "tags": [
++ "bench.eval"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.eval.manage"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.eval.manage"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.task.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/evals/{id}/run": {
++ "post": {
++ "operationId": "post_api_v1_evals_id_run",
++ "summary": "Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eva",
++ "description": "**bench.eval.manage** (first-party): Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eval and its runs. Never in the public dataset.",
++ "tags": [
++ "bench.eval"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.eval.manage"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.eval.manage"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.task.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/kinds": {
++ "get": {
++ "operationId": "get_api_v1_kinds",
++ "summary": "Read a benchmark kind on OpenVibe.Bench: GET /api/v1/kinds lists the kinds, GET /api/v1/kinds/:kindId reads one kind and its entry schema and metrics.",
++ "description": "**bench.kind.read** (first-party): Read a benchmark kind on OpenVibe.Bench: GET /api/v1/kinds lists the kinds, GET /api/v1/kinds/:kindId reads one kind and its entry schema and metrics. Granted to rooms and developer services that render a kind or its board.",
++ "tags": [
++ "bench.kind"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.kind.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.kind.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.kind.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/kinds/{kindId}": {
++ "get": {
++ "operationId": "get_api_v1_kinds_kindId",
++ "summary": "Read a benchmark kind on OpenVibe.Bench: GET /api/v1/kinds lists the kinds, GET /api/v1/kinds/:kindId reads one kind and its entry schema and metrics.",
++ "description": "**bench.kind.read** (first-party): Read a benchmark kind on OpenVibe.Bench: GET /api/v1/kinds lists the kinds, GET /api/v1/kinds/:kindId reads one kind and its entry schema and metrics. Granted to rooms and developer services that render a kind or its board.",
++ "tags": [
++ "bench.kind"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.kind.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.kind.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "kindId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.kind.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/kinds/{kindId}/tasks": {
++ "post": {
++ "operationId": "post_api_v1_kinds_kindId_tasks",
++ "summary": "Create a benchmark task in a kind on OpenVibe.Bench: POST /api/v1/kinds/:kindId/tasks with { prompt, task_class?, public?",
++ "description": "**bench.task.create** (first-party): Create a benchmark task in a kind on OpenVibe.Bench: POST /api/v1/kinds/:kindId/tasks with { prompt, task_class?, public? }. A room or a person's own token may create a task.",
++ "tags": [
++ "bench.task"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.task.create"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.task.create"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "kindId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.task.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/rounds/{id}": {
++ "get": {
++ "operationId": "get_api_v1_rounds_id",
++ "summary": "Read a benchmark round on OpenVibe.Bench: GET /api/v1/rounds/:id returns the round with entries; entries stay blind until the caller has judged or started the round.",
++ "description": "**bench.round.read** (first-party): Read a benchmark round on OpenVibe.Bench: GET /api/v1/rounds/:id returns the round with entries; entries stay blind until the caller has judged or started the round.",
++ "tags": [
++ "bench.round"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.round.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.round.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.round.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/rounds/{id}/entries": {
++ "post": {
++ "operationId": "post_api_v1_rounds_id_entries",
++ "summary": "Submit an outside entry to a benchmark round on OpenVibe.Bench: POST /api/v1/rounds/:id/entries with a service token.",
++ "description": "**bench.entry.create** (first-party): Submit an outside entry to a benchmark round on OpenVibe.Bench: POST /api/v1/rounds/:id/entries with a service token. A room submits a game match, a test-suite run or another room's result.",
++ "tags": [
++ "bench.entry"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.entry.create"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.entry.create"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.entry.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/rounds/{id}/judgements": {
++ "post": {
++ "operationId": "post_api_v1_rounds_id_judgements",
++ "summary": "Cast a blind judgement on a benchmark round on OpenVibe.Bench: POST /api/v1/rounds/:id/judgements with { judge?, pair?, outcome?, score?",
++ "description": "**bench.judgement.cast** (first-party): Cast a blind judgement on a benchmark round on OpenVibe.Bench: POST /api/v1/rounds/:id/judgements with { judge?, pair?, outcome?, score? }. Human judges are people; automatic, test-suite and game-outcome judges are services.",
++ "tags": [
++ "bench.judgement"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.judgement.cast"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.judgement.cast"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.judgement.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/tasks/{id}/rounds": {
++ "post": {
++ "operationId": "post_api_v1_tasks_id_rounds",
++ "summary": "Pin a reproducible benchmark round on OpenVibe.Bench: POST /api/v1/tasks/:id/rounds with { offers?, seed?",
++ "description": "**bench.round.create** (first-party): Pin a reproducible benchmark round on OpenVibe.Bench: POST /api/v1/tasks/:id/rounds with { offers?, seed? }. The round's job generates entries from the exact offers and seed.",
++ "tags": [
++ "bench.round"
++ ],
++ "x-openvibe-capabilities": [
++ "bench.round.create"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "bench.round.create"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/bench.round.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "components": {
++ "schemas": {
++ "bench.entry.v1": {
++ "title": "BenchEntry",
++ "description": "bench.entry@1: one submitted entry in a benchmark round on OpenVibe.Bench. PROVIDER and MODEL name the offer; ROUTE is the exact route taken; PAYLOAD is the entry's output; COST_USD, MS and TOKENS are the measured use.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "round_id",
++ "provider",
++ "model",
++ "route",
++ "payload",
++ "cost_usd",
++ "ms",
++ "tokens"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "round_id": {
++ "type": "string"
++ },
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": "string"
++ },
++ "route": {
++ "type": "object"
++ },
++ "payload": {
++ "type": "object"
++ },
++ "cost_usd": {
++ "type": "number"
++ },
++ "ms": {
++ "type": "number"
++ },
++ "tokens": {
++ "type": "number"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "ui_check": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "run_id": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ },
++ "bench.judgement.v1": {
++ "title": "BenchJudgement",
++ "description": "bench.judgement@1: a blind judgement cast on a benchmark round on OpenVibe.Bench. JUDGE names the judge (pair, rubric, automatic_grader, test_suite, game_outcome); METHOD is how the pair was decided; PAIR is the two entry ids; OUTCOME and SCORE are the result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "round_id",
++ "kind_id",
++ "judge",
++ "method",
++ "pair",
++ "outcome",
++ "score",
++ "at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "round_id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "judge": {
++ "type": "string"
++ },
++ "judge_name": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "judge_version": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "method": {
++ "type": "string"
++ },
++ "pair": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "outcome": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "score": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "bench.kind.v1": {
++ "title": "BenchKind",
++ "description": "bench.kind@1: a benchmark kind on OpenVibe.Bench. ROOM is the room that owns the kind, ENTRY the shape a submitted entry takes, JUDGE the default judge (pair, rubric, automatic_grader, test_suite or game_outcome), NAME the display name, SCHEMA the entry JSON Schema, and METRICS the board metrics (elo, pareto, cost, or a room's own).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "room",
++ "entry",
++ "judge",
++ "name",
++ "schema",
++ "metrics",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "room": {
++ "type": "string"
++ },
++ "entry": {
++ "type": "string"
++ },
++ "judge": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "schema": {
++ "type": "object"
++ },
++ "metrics": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ }
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind_id",
++ "category",
++ "subject",
++ "elo",
++ "games",
++ "wins",
++ "losses",
++ "ties",
++ "win_rate",
++ "ci_lower",
++ "ci_upper"
++ ],
++ "properties": {
++ "kind_id": {
++ "type": "string"
++ },
++ "category": {
++ "type": "string"
++ },
++ "subject": {
++ "type": "string"
++ },
++ "elo": {
++ "type": "number"
++ },
++ "games": {
++ "type": "number"
++ },
++ "wins": {
++ "type": "number"
++ },
++ "losses": {
++ "type": "number"
++ },
++ "ties": {
++ "type": "number"
++ },
++ "win_rate": {
++ "type": "number"
++ },
++ "ci_lower": {
++ "type": "number"
++ },
++ "ci_upper": {
++ "type": "number"
++ },
++ "median_cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "median_ms": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "provisional": {
++ "type": "boolean"
++ }
++ }
++ },
++ "bench.round.v1": {
++ "title": "BenchRound",
++ "description": "bench.round@1: a pinned, reproducible benchmark round on OpenVibe.Bench. TASK_ID names the task; OFFERS are the exact offers (provider, model, route) the round runs; STATUS follows queued, running, ready, finished or failed; SEED and RECEIPT make the round reproducible.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "task_id",
++ "kind_id",
++ "offers",
++ "status",
++ "seed",
++ "created_by",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "task_id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "offers": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ },
++ "status": {
++ "type": "string",
++ "enum": [
++ "queued",
++ "running",
++ "ready",
++ "finished",
++ "failed"
++ ]
++ },
++ "seed": {
++ "type": "integer"
++ },
++ "pool_fallback": {
++ "type": "boolean"
++ },
++ "receipt": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "created_by": {
++ "type": "string"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "bench.task.v1": {
++ "title": "BenchTask",
++ "description": "bench.task@1: a benchmark task on OpenVibe.Bench. KIND_ID names the kind; PROMPT is the task; TASK_CLASS is an optional classifier for grouping; PUBLIC says whether the task may appear in the open dataset.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "kind_id",
++ "prompt",
++ "public",
++ "created_by",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "kind_id": {
++ "type": "string"
++ },
++ "prompt": {
++ "type": "string"
++ },
++ "task_class": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "public": {
++ "type": "boolean"
++ },
++ "created_by": {
++ "type": "string"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "errors.problem.v1": {
++ "title": "Problem",
++ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
++ "type": "object",
++ "required": [
++ "type",
++ "title",
++ "status",
++ "code"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "type": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1
++ },
++ "status": {
++ "type": "integer",
++ "minimum": 400,
++ "maximum": 599
++ },
++ "detail": {
++ "type": "string"
++ },
++ "instance": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "code": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
++ },
++ "request_id": {
++ "type": "string"
++ },
++ "trace_id": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{32}$"
++ },
++ "errors": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "path": {
++ "type": "string"
++ },
++ "message": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "error": {
++ "type": "string",
++ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
++ }
++ }
++ }
++ },
++ "securitySchemes": {
++ "openvibeToken": {
++ "type": "http",
++ "scheme": "bearer",
++ "bearerFormat": "JWT",
++ "description": "An OpenVibe Network token for this service: a person's token, an app token (client credentials, audience of the service) or a first-party service token. Its `cap` claim must include the capability the operation names."
++ }
++ }
++ }
++}
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex ced61d19..15b394e0 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.237.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 63722b9c..4364cda1 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.237.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 8c9dd3af..d4244f05 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.237.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 1891c38d..b204a4c4 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.237.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 bc80d63c..bc9c1c4f 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.237.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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"
@@@ -281,6 +281,18 @@
"minLength": 8,
"maxLength": 128,
"pattern": "^[A-Za-z0-9_.:-]+$"
++ },
++ "actor_task_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256,
++ "description": "The OpenVibe.Actor task id when this coding task was started from Actor."
++ },
++ "actor_step_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256,
++ "description": "The OpenVibe.Actor step id when this coding task was started from Actor."
}
}
},
@@@ -476,6 +488,26 @@
"maxLength": 1000
}
}
++ },
++ "actor_ref": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "task_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256
++ },
++ "step_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 256
++ }
++ },
++ "description": "The OpenVibe.Actor task and step that started this coding task, when it came from Actor."
}
}
},
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 952d860f..01c2b802 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.237.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 0c40d8f9..353743b0 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.237.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 ef30b015..baa02df3 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.237.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 310a59bb..82fb0d64 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.237.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 64ff5a1d..ae483d7d 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.237.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 86a34db3..63b9def8 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.237.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 9be4fd57..0f1025eb 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.237.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 90dde5f2..dda78630 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.237.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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/index.json b/generated/openapi/index.json
iindex ebde0540..79f6ec30 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -15,6 +15,13 @@
"operations": 44,
"capabilities": 9
},
++ {
++ "service": "bench",
++ "name": "OpenVibe.Bench",
++ "origin": "https://bench.openvibe.services",
++ "operations": 12,
++ "capabilities": 9
++ },
{
"service": "billing",
"name": "OpenVibe.Billing",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 8eb31c6c..f16c8e84 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.237.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 7502d451..6a7d676b 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.237.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 36f45242..5500ab2a 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.237.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 3d7bfda9..35cea5e7 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.237.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 b269969a..eafe2e0f 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.237.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 a76ac890..db4f69c9 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.237.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 66cf8dab..01199130 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.237.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 0a0ecda9..10976db2 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.237.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 39c0ee6d..2924ab4c 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.237.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 169aa782..1ca2fc15 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.237.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 8f052669..af4c3e88 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.237.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 5bb0395e..b9af96c5 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.237.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 aa436096..4293723f 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.237.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 69ed03ff..b64bb36a 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.237.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 ea06c952..b9b63892 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.237.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 aa819566..85674a6d 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.237.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 d118c659..2cbee3e2 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.237.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 2180b417..2d906942 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.237.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 c7557fd7..94d1330c 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.237.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 989761ca..4e7e275d 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.237.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 d4eed272..5c149572 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.237.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 f2e49f51..c1f678ef 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.237.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 f1a780d2..7476056d 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.237.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 87188452..57ebeccb 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.237.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.237.0): each operation lists the capabilities it performs; a token for 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.238.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.238.0): each operation lists the capabilities it performs; a token for 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 775953b9..f97a2fb9 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -211214,7 +211214,7 @@ export type VideoPlaylistManageResult =
}[];
};
--/** [email protected] (owner: codes) */
++/** [email protected] (owner: codes) */
/**
* codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).
*/
@@@ -211227,6 +211227,14 @@ export interface CodesTaskStartRequest {
push?: boolean;
pull_request?: boolean;
idempotency_key?: string;
++ /**
++ * The OpenVibe.Actor task id when this coding task was started from Actor.
++ */
++ actor_task_id?: string;
++ /**
++ * The OpenVibe.Actor step id when this coding task was started from Actor.
++ */
++ actor_step_id?: string;
}
/** [email protected] (owner: codes) */
@@@ -211238,7 +211246,7 @@ export interface CodesTaskStartResult {
created: boolean;
}
--/** [email protected] (owner: codes) */
++/** [email protected] (owner: codes) */
/**
* codes.task@1: a coding task on OpenVibe.Codes, as GET /api/v1/tasks/:id answers it (capability codes.task.read) and POST /api/v1/tasks creates it. STATE follows the OpenVibe.Run job that carries it: queued (waiting for one of the person's machines), placed, running, then succeeded, failed, cancelled or expired (no machine of theirs took it in time). URL is the task's page on openvibe.codes, where its owner follows it live. RESULT is present once it has ended: OK says whether the agents finished, SUMMARY what they said, FILES and PATCH the change (the patch at most 256 KiB, PATCH_TRUNCATED when cut), PUSH where it went when asked, COST_USD the model use on the person's own keys, DURATION_MS the time on their machine. ERROR says why a task that never ran ended (Run refused it, or the job failed before a result).
*/
@@@ -211416,6 +211424,13 @@ export interface CodesTask {
duration_ms?: number;
error?: string;
};
++ /**
++ * The OpenVibe.Actor task and step that started this coding task, when it came from Actor.
++ */
++ actor_ref?: {
++ task_id?: string;
++ step_id?: string;
++ } | null;
}
/** [email protected] (owner: play) */
@@@ -213411,3 +213426,157 @@ export interface VisionUiCheckResult {
created_at: string;
};
}
++
++/** [email protected] (owner: bench) */
++/**
++ * bench.kind@1: a benchmark kind on OpenVibe.Bench. ROOM is the room that owns the kind, ENTRY the shape a submitted entry takes, JUDGE the default judge (pair, rubric, automatic_grader, test_suite or game_outcome), NAME the display name, SCHEMA the entry JSON Schema, and METRICS the board metrics (elo, pareto, cost, or a room's own).
++ */
++export interface BenchKind {
++ id: string;
++ room: string;
++ entry: string;
++ judge: string;
++ name: string;
++ schema: {};
++ metrics: string[];
++ created_at: string;
++}
++
++/** [email protected] (owner: bench) */
++/**
++ * bench.task@1: a benchmark task on OpenVibe.Bench. KIND_ID names the kind; PROMPT is the task; TASK_CLASS is an optional classifier for grouping; PUBLIC says whether the task may appear in the open dataset.
++ */
++export interface BenchTask {
++ id: string;
++ kind_id: string;
++ prompt: string;
++ task_class?: string | null;
++ public: boolean;
++ created_by: string;
++ created_at: string;
++}
++
++/** [email protected] (owner: bench) */
++/**
++ * bench.round@1: a pinned, reproducible benchmark round on OpenVibe.Bench. TASK_ID names the task; OFFERS are the exact offers (provider, model, route) the round runs; STATUS follows queued, running, ready, finished or failed; SEED and RECEIPT make the round reproducible.
++ */
++export interface BenchRound {
++ id: string;
++ task_id: string;
++ kind_id: string;
++ offers: {}[];
++ status: "queued" | "running" | "ready" | "finished" | "failed";
++ seed: number;
++ pool_fallback?: boolean;
++ receipt?: string | null;
++ created_by: string;
++ created_at: string;
++}
++
++/** [email protected] (owner: bench) */
++/**
++ * bench.entry@1: one submitted entry in a benchmark round on OpenVibe.Bench. PROVIDER and MODEL name the offer; ROUTE is the exact route taken; PAYLOAD is the entry's output; COST_USD, MS and TOKENS are the measured use.
++ */
++export interface BenchEntry {
++ id: string;
++ round_id: string;
++ provider: string;
++ model: string;
++ route: {};
++ payload: {};
++ cost_usd: number;
++ ms: number;
++ tokens: number;
++ error?: string | null;
++ ui_check?: {} | null;
++ run_id?: string | null;
++}
++
++/** [email protected] (owner: bench) */
++/**
++ * bench.judgement@1: a blind judgement cast on a benchmark round on OpenVibe.Bench. JUDGE names the judge (pair, rubric, automatic_grader, test_suite, game_outcome); METHOD is how the pair was decided; PAIR is the two entry ids; OUTCOME and SCORE are the result.
++ */
++export interface BenchJudgement {
++ id: string;
++ round_id: string;
++ kind_id: string;
++ judge: string;
++ judge_name?: string | null;
++ judge_version?: string | null;
++ method: string;
++ pair: {} | null;
++ outcome: string | null;
++ score: number | null;
++ at: string;
++}
++
++/** [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.
++ */
++export interface BenchRating {
++ kind_id: string;
++ category: string;
++ subject: string;
++ elo: number;
++ games: number;
++ wins: number;
++ losses: number;
++ ties: number;
++ win_rate: number;
++ ci_lower: number;
++ ci_upper: number;
++ median_cost_usd?: number | null;
++ median_ms?: number | null;
++ provisional?: boolean;
++}
++
++/** [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.
++ */
++export interface BenchRoundFinishedPayload {
++ round_id: string;
++ task_id: string;
++ kind_id: string;
++ status: "finished";
++ entries: number;
++ finished_at: string;
++}
++
++/** [email protected] (owner: bench) */
++/**
++ * bench.judgement.recorded v1 (OpenVibe.Bench): a judgement was cast on a round. Envelope: source bench, subject { type: user, id: <judge> } or { type: service, id: <judge> }, visibility first-party.
++ */
++export interface BenchJudgementRecordedPayload {
++ round_id: string;
++ kind_id: string;
++ judge: string;
++ judge_name?: string | null;
++ method: string;
++ outcome?: string | null;
++ score?: number | 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.
++ */
++export interface BenchRatingChangedPayload {
++ kind_id: string;
++ category: string;
++ subject: string;
++ elo: number;
++ games: number;
++ wins?: number;
++ losses?: number;
++ ties?: number;
++ win_rate: number;
++ ci_lower?: number;
++ ci_upper?: number;
++ median_cost_usd?: number | null;
++ median_ms?: number | null;
++ provisional?: boolean;
++ at: string;
++}
ddiff --git a/manifests/capabilities/bench.board.read.json b/manifests/capabilities/bench.board.read.json
nnew file mode 100644
iindex 00000000..32ed4185
---- /dev/null
++++ b/manifests/capabilities/bench.board.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.board.read",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read a benchmark board on OpenVibe.Bench: GET /api/v1/boards/:kindId?type=elo|pareto|cost returns the rendered board for a kind.",
++ "permissions": [
++ "bench:boards:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/boards/:kindId"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.rating@1"
++}
ddiff --git a/manifests/capabilities/bench.dataset.read.json b/manifests/capabilities/bench.dataset.read.json
nnew file mode 100644
iindex 00000000..793548ff
---- /dev/null
++++ b/manifests/capabilities/bench.dataset.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.dataset.read",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read the open dataset for a benchmark kind on OpenVibe.Bench: GET /api/v1/datasets/:kindId.jsonl returns prompts, entries, judgements without voter ids and ratings as JSON lines.",
++ "permissions": [
++ "bench:datasets:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/datasets/:kindId.jsonl"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.binary@1"
++}
ddiff --git a/manifests/capabilities/bench.entry.create.json b/manifests/capabilities/bench.entry.create.json
nnew file mode 100644
iindex 00000000..e832bd31
---- /dev/null
++++ b/manifests/capabilities/bench.entry.create.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.entry.create",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Submit an outside entry to a benchmark round on OpenVibe.Bench: POST /api/v1/rounds/:id/entries with a service token. A room submits a game match, a test-suite run or another room's result.",
++ "permissions": [
++ "bench:entries:create"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/rounds/:id/entries"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.entry@1"
++}
ddiff --git a/manifests/capabilities/bench.eval.manage.json b/manifests/capabilities/bench.eval.manage.json
nnew file mode 100644
iindex 00000000..cce318ae
---- /dev/null
++++ b/manifests/capabilities/bench.eval.manage.json
@@@ -0,0 +1,23 @@
++{
++ "id": "bench.eval.manage",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Manage private evals on OpenVibe.Bench: POST /api/v1/evals creates a private task suite, POST /api/v1/evals/:id/run runs it against chosen offers, and GET /api/v1/evals/:id/results reads a private eval and its runs. Never in the public dataset.",
++ "permissions": [
++ "bench:evals:manage"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/evals",
++ "POST /api/v1/evals/:id/run",
++ "GET /api/v1/evals/:id/results"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.task@1"
++}
ddiff --git a/manifests/capabilities/bench.judgement.cast.json b/manifests/capabilities/bench.judgement.cast.json
nnew file mode 100644
iindex 00000000..d6aeb7a6
---- /dev/null
++++ b/manifests/capabilities/bench.judgement.cast.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.judgement.cast",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Cast a blind judgement on a benchmark round on OpenVibe.Bench: POST /api/v1/rounds/:id/judgements with { judge?, pair?, outcome?, score? }. Human judges are people; automatic, test-suite and game-outcome judges are services.",
++ "permissions": [
++ "bench:judgements:cast"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/rounds/:id/judgements"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.judgement@1"
++}
ddiff --git a/manifests/capabilities/bench.kind.read.json b/manifests/capabilities/bench.kind.read.json
nnew file mode 100644
iindex 00000000..e8166c7f
---- /dev/null
++++ b/manifests/capabilities/bench.kind.read.json
@@@ -0,0 +1,22 @@
++{
++ "id": "bench.kind.read",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read a benchmark kind on OpenVibe.Bench: GET /api/v1/kinds lists the kinds, GET /api/v1/kinds/:kindId reads one kind and its entry schema and metrics. Granted to rooms and developer services that render a kind or its board.",
++ "permissions": [
++ "bench:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/kinds",
++ "GET /api/v1/kinds/:kindId"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.kind@1"
++}
ddiff --git a/manifests/capabilities/bench.round.create.json b/manifests/capabilities/bench.round.create.json
nnew file mode 100644
iindex 00000000..b13a9a26
---- /dev/null
++++ b/manifests/capabilities/bench.round.create.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.round.create",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Pin a reproducible benchmark round on OpenVibe.Bench: POST /api/v1/tasks/:id/rounds with { offers?, seed? }. The round's job generates entries from the exact offers and seed.",
++ "permissions": [
++ "bench:rounds:create"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/tasks/:id/rounds"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.round@1"
++}
ddiff --git a/manifests/capabilities/bench.round.read.json b/manifests/capabilities/bench.round.read.json
nnew file mode 100644
iindex 00000000..1b309eec
---- /dev/null
++++ b/manifests/capabilities/bench.round.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.round.read",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read a benchmark round on OpenVibe.Bench: GET /api/v1/rounds/:id returns the round with entries; entries stay blind until the caller has judged or started the round.",
++ "permissions": [
++ "bench:rounds:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/rounds/:id"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.round@1"
++}
ddiff --git a/manifests/capabilities/bench.task.create.json b/manifests/capabilities/bench.task.create.json
nnew file mode 100644
iindex 00000000..f6d8d84b
---- /dev/null
++++ b/manifests/capabilities/bench.task.create.json
@@@ -0,0 +1,21 @@
++{
++ "id": "bench.task.create",
++ "version": "1.0",
++ "owner": "bench",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Create a benchmark task in a kind on OpenVibe.Bench: POST /api/v1/kinds/:kindId/tasks with { prompt, task_class?, public? }. A room or a person's own token may create a task.",
++ "permissions": [
++ "bench:tasks:create"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/kinds/:kindId/tasks"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "bench.task@1"
++}
ddiff --git a/manifests/services/bench.json b/manifests/services/bench.json
nnew file mode 100644
iindex 00000000..30ce24b7
---- /dev/null
++++ b/manifests/services/bench.json
@@@ -0,0 +1,105 @@
++{
++ "version": "0.1.0",
++ "contractRanges": {
++ "openvibe-contracts": ">=0.238.0 <1.0.0"
++ },
++ "id": "bench",
++ "name": "OpenVibe.Bench",
++ "status": "alpha",
++ "repository": "OpenVibers/OpenVibe.Bench",
++ "domains": [
++ "bench.openvibe.services"
++ ],
++ "publicOrigin": "https://bench.openvibe.services",
++ "health": "/api/health",
++ "ready": "/api/ready",
++ "internalOrigin": "http://127.0.0.1:5230",
++ "exposure": {
++ "state": "live",
++ "publicSite": "service",
++ "note": "the public home, /docs and the bench.* API at bench.openvibe.services since 2026-10-28; services on the host call 127.0.0.1:5230"
++ },
++ "capabilities": [
++ "bench.kind.read",
++ "bench.task.create",
++ "bench.round.create",
++ "bench.round.read",
++ "bench.entry.create",
++ "bench.judgement.cast",
++ "bench.board.read",
++ "bench.dataset.read",
++ "bench.eval.manage"
++ ],
++ "eventsProduced": [
++ "bench.round.finished",
++ "bench.judgement.recorded",
++ "bench.rating.changed"
++ ],
++ "eventsConsumed": [
++ "network.account.export_requested",
++ "network.account.deleted"
++ ],
++ "namespacesOwned": [
++ "bench.*"
++ ],
++ "lifecycle": {
++ "liveness": {
++ "endpoint": "/api/health",
++ "means": "the process is up and answers HTTP; it checks nothing else (the database and dependencies are what ready checks)"
++ },
++ "shutdown": {
++ "signal": "SIGTERM",
++ "deadlineSeconds": 10,
++ "drains": [
++ "timers cleared",
++ "JWKS key refresher stopped",
++ "round and private-eval jobs stopped",
++ "outbox publisher stopped (its send in progress awaited; unsent rows stay for the next start)",
++ "telemetry buffer flushed and its retention timer stopped",
++ "open HTTP connections closed, then the server",
++ "database pool closed"
++ ]
++ },
++ "startupRecovery": {
++ "resumes": [
++ {
++ "kind": "jobs",
++ "what": "rounds and private eval runs left queued or running are marked failed at boot; the caller retries them"
++ },
++ {
++ "kind": "outbox",
++ "what": "unsent bench.round.finished, bench.judgement.recorded and bench.rating.changed events in the outbox go to OpenVibe.Events once the publisher starts"
++ },
++ {
++ "kind": "consumer",
++ "what": "OpenVibe.Events redelivers network.account.export_requested and network.account.deleted that were pending during the stop; account_data_events applies each once"
++ }
++ ]
++ },
++ "rollback": {
++ "conditions": [
++ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",
++ "manual: ovhost rollback <service> --to <sha>"
++ ],
++ "window": "automatic only while ovhost waits for readiness after the restart (30 s in host.example.json); manual afterwards, as long as no blocker applies",
++ "blockers": {
++ "none": "the schema code only adds (CREATE … IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"
++ }
++ },
++ "contracts": {
++ "range": ">=0.238.0 <1.0.0"
++ },
++ "leases": {
++ "none": "no claims: one process owns its PostgreSQL database (ov_bench); a round is taken with a compare-and-set on its status (queued → running)"
++ }
++ },
++ "notes": "Port 5230, unit openvibe-bench.service, database ov_bench. The shared AI benchmark and comparison engine (plan 2026-10-28 §4.12): kinds, pinned rounds, entries, blind judgements, ratings, boards, the open dataset and private evals. AI stays the run authority, Report the analytics authority. Bench answers account export and deletion (ADR-033) and subscribes to the two account Events topics. It calls AI's run API (ai.run.create, namespace ai.generate) for generation and publishes bench.* events through its outbox.",
++ "site": {
++ "name": "Bench",
++ "icon": "bench",
++ "tagline": "One AI benchmark and comparison engine for every room.",
++ "what": "The shared AI benchmark and comparison engine: kinds, pinned rounds, blind judgements, elo/pareto/cost boards, an open dataset per kind and private evals.",
++ "legalProfile": "tools",
++ "position": 47
++ }
++}
ddiff --git a/package.json b/package.json
iindex 4b55797e..1cba177b 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.237.0",
++ "version": "0.238.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",