openvibers/openvibe.contracts Commits

Contracts 0.399.0: consolidate four contract releases (#420)

OP OpenVibers committed 3 days ago · 3221dbdfa2 · 72 files, +3523 −107

* Add Quest today response contract

* network.operator-alerts-request@1: a browser-check alert carries what its result file knows

* git.checks.write: report commit statuses on OpenVibe.Git

A first-party capability for CI services (Run first): POST
/api/v1/repos/:owner/:name/commits/:sha/statuses with {context, state,
description?, target_url?}. Reads stay on git.repo.read (public needs no
token). OpenVibe.Git's route accepts this capability once the release
grants it; the service manifest lists it and the generated OpenAPI
carries the operation.

* agent.finding@1: a confirmed finding, a lead, or a rejected claim

One contract for review, hunt and security findings. confirmed carries the
split severity (likelihood and impact, overall never above impact) and a
confidence with its reason; needs_validation is a lead with a claimed cause,
exact blockers and a local/deployment plan and no severity; rejected carries
its reason. fingerprint is the stable file+normalised-text identity. 0.397.0.

* Release Contracts feature train 0.399.0

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex a9dbcd3f..6060a677 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,12 @@
# Changelog
++## 0.399.0 — 2026-11-10
++
++- #408: add `quest.today@1`, the private Quest today response.
++- #412: extend `network.operator-alerts-request@1` with browser-check evidence and release timing details.
++- #415: add the `git.checks.write` capability for reporting commit statuses.
++- #416: add `agent.finding@1` for confirmed findings, leads that need validation and rejected claims.
++
## 0.398.0 — 2026-11-10
- `codes.task@2`'s outcome state names a goal task's honest end state: `ready` only with an accepted independent verdict, `waiting`, `blocked` at its no-progress limit, `failed`, `dropped` by the person, or `stopped_by_budget`. A task without a goal keeps `done`, `unfinished` and `stopped`.
ddiff --git a/README.md b/README.md
iindex acb578f1..769d19fa 100644
---- a/README.md
++++ b/README.md
@@@ -5,7 +5,7 @@
**Docs:** https://openvibe.services · **For AI:** https://openvibe.services/llms.txt
**Install and test:** `npm ci && npm test` (Node 20 or newer)
--**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.391.0: 1214 schemas in `contracts/catalog.json`, 65 service manifests, 512 capability manifests, 13 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).
++**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.399.0: 1219 schemas in `contracts/catalog.json`, 65 service manifests, 513 capability manifests, 13 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).
**Plan:** OpenVibe Development Roadmap, Wave 1 (implementation plan rev 3, §3.1 and §18.11).
**License:** AGPL-3.0 (same as every OpenVibe service).
ddiff --git a/STATUS.json b/STATUS.json
iindex 1f8b25b6..1a3ddeb6 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -49,5 +49,5 @@
"bench.benchmark@1 and bench.run@1 with the capabilities bench.benchmark.write, bench.run.publish and bench.run.read: the benchmark registry and the results API (spec 2026-10-30, stage B1)",
"mail.agent_inbox.received@1, mail.agent-inbox-message@1, mail.agent-reply-request@1, mail.agent-reply-result@1 and mail.inbox-answering@1, with the capabilities mail.agent.read, mail.agent.reply and mail.agent.answering (track HO6): an agent answers the mail sent to its own OpenVibe.Mail address, reads it in full text on the owner's behalf, replies from its own address in the thread, and answers only when the person's switch for that address is on"
],
-- "updated": "2026-11-07"
++ "updated": "2026-11-10"
}
ddiff --git a/contracts/agent/finding.v1.json b/contracts/agent/finding.v1.json
nnew file mode 100644
iindex 00000000..8497a6ce
---- /dev/null
++++ b/contracts/agent/finding.v1.json
@@@ -0,0 +1,231 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/finding.v1.json",
++ "title": "AgentFinding",
++ "description": "One finding of a review, a hunt or a security pass. The verdict is the evidence bar, not the severity: `confirmed` means the finding was reproduced or re-read and carries `severity` and `confidence`; `needs_validation` is an unprovable claim turned into a lead with an exact `blockers` entry and a `validation_plan`, and it has no severity by design (never noise, never a silent pass); `rejected` says why it does not stand. `fingerprint` is the stable identity — repository-relative file plus whitespace-normalised, lowercased text — so a re-wrapped finding keeps its id while a real rewording becomes a new one. `trace` and `evidence` carry repository-relative locations and the commands or answers that show the fact. A validator must also refuse `severity.overall_severity` above the demonstrated `severity.impact`; the schema cannot rank two enums, so `description` states the rule.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["verdict", "fingerprint", "title", "description", "trace", "evidence"],
++ "properties": {
++ "verdict": {
++ "type": "string",
++ "enum": ["confirmed", "needs_validation", "rejected"],
++ "description": "confirmed: reproduced or re-read by a second agent. needs_validation: a lead that could not be proven locally; it carries blockers and a plan, never a severity. rejected: the claim was refuted; it carries a reason."
++ },
++ "fingerprint": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The stable id: repository-relative file + whitespace-normalised, lowercased finding text (for example `server/x.js:the cache never expires`)."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "description": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000,
++ "description": "What is wrong, in plain words; no severity claim beyond the evidence."
++ },
++ "trace": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 50,
++ "items": { "$ref": "#/$defs/location" },
++ "description": "Where the issue lives, repository-relative, most specific first."
++ },
++ "evidence": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 50,
++ "items": { "$ref": "#/$defs/evidence" },
++ "description": "What shows the fact: the source read, the command and its output, the response, the screenshot or the test."
++ },
++ "severity": { "$ref": "#/$defs/severity" },
++ "confidence": { "$ref": "#/$defs/confidence" },
++ "remediation": { "$ref": "#/$defs/remediation" },
++ "claimed_root_cause": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "The suspected cause of a needs_validation lead, stated as a claim to test."
++ },
++ "blockers": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": { "type": "string", "minLength": 1, "maxLength": 500 },
++ "description": "The exact reason the claim could not be proven here (a credential, an environment, data, a downstream service)."
++ },
++ "validation_plan": { "$ref": "#/$defs/validation_plan" },
++ "reason": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "Why a rejected claim does not stand."
++ }
++ },
++ "allOf": [
++ {
++ "if": { "properties": { "verdict": { "const": "confirmed" } }, "required": ["verdict"] },
++ "then": { "required": ["severity", "confidence"] }
++ },
++ {
++ "if": { "properties": { "verdict": { "const": "needs_validation" } }, "required": ["verdict"] },
++ "then": {
++ "required": ["claimed_root_cause", "blockers", "validation_plan"],
++ "not": { "required": ["severity"] }
++ }
++ },
++ {
++ "if": { "properties": { "verdict": { "const": "rejected" } }, "required": ["verdict"] },
++ "then": {
++ "required": ["reason"],
++ "not": { "required": ["severity"] }
++ }
++ }
++ ],
++ "$defs": {
++ "location": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["file"],
++ "properties": {
++ "file": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "Repository-relative path; no leading slash and no `..`."
++ },
++ "line": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The line the finding is about, when it is one line."
++ },
++ "symbol": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The function, route or job the line belongs to."
++ }
++ }
++ },
++ "evidence": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["kind", "summary"],
++ "properties": {
++ "kind": {
++ "type": "string",
++ "enum": ["source", "command", "response", "screenshot", "log", "test"],
++ "description": "What kind of evidence this is."
++ },
++ "summary": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 1000,
++ "description": "What this shows, in one sentence."
++ },
++ "location": { "$ref": "#/$defs/location" },
++ "command": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000
++ },
++ "output": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000
++ }
++ }
++ },
++ "severity": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["likelihood", "impact", "overall_severity"],
++ "description": "The two axes stay separate: likelihood is how easily it is reached, impact is what it does, overall_severity may not exceed impact.",
++ "properties": {
++ "likelihood": { "$ref": "#/$defs/level" },
++ "impact": { "$ref": "#/$defs/level" },
++ "overall_severity": { "$ref": "#/$defs/level" }
++ }
++ },
++ "level": {
++ "type": "string",
++ "enum": ["informational", "low", "medium", "high", "critical"]
++ },
++ "confidence": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["level", "reason"],
++ "properties": {
++ "level": {
++ "type": "string",
++ "enum": ["low", "medium", "high"]
++ },
++ "reason": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 1000
++ }
++ }
++ },
++ "remediation": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["strategy"],
++ "properties": {
++ "strategy": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000
++ },
++ "code_changes": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["file", "change"],
++ "properties": {
++ "file": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500
++ },
++ "change": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 1000
++ }
++ }
++ }
++ }
++ }
++ },
++ "validation_plan": {
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "local": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "How to prove or refute the lead on a machine with the repository."
++ },
++ "deployment": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "How to prove or refute it where only a deployed service, its data or its credentials can."
++ }
++ },
++ "anyOf": [
++ { "required": ["local"] },
++ { "required": ["deployment"] }
++ ]
++ }
++ }
++}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 80665cb1..76345957 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -8587,6 +8587,15 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "quest.today",
++ "version": "1.0.0",
++ "owner": "quest",
++ "schema": "quest/today.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "quest.step-type",
"version": "1.0.0",
@@@ -11160,6 +11169,15 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "agent.finding",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "agent/finding.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "ai.effort",
"version": "1.0.0",
ddiff --git a/contracts/network/operator-alerts-request.v1.json b/contracts/network/operator-alerts-request.v1.json
iindex 445eedad..6a4f7053 100644
---- a/contracts/network/operator-alerts-request.v1.json
++++ b/contracts/network/operator-alerts-request.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/network/operator-alerts-request.v1.json",
"title": "NetworkOperatorAlertsRequest",
-- "description": "network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations.",
++ "description": "network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations. A browser-check alert may carry what its result file knows (details, the release and its commit link, when the check ran, since when it has been failing) so the notification can explain the problem in words and link to the page, the commit and the rule's help page. Every string is text, never markup; every URL is https.",
"type": "object",
"required": ["source", "alerts"],
"additionalProperties": false,
@@@ -23,7 +23,35 @@
"summary": { "type": "string", "minLength": 1, "maxLength": 300 },
"description": { "type": "string", "maxLength": 1000 },
"service": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,39}$" },
-- "started_at": { "type": "string", "format": "date-time" }
++ "started_at": { "type": "string", "format": "date-time" },
++ "details": {
++ "type": "array",
++ "maxItems": 5,
++ "description": "What failed, for a browser-check alert (from the check's result file), most useful first. Plain text: a notification shows it escaped, never as markup.",
++ "items": {
++ "type": "object",
++ "required": ["check"],
++ "additionalProperties": false,
++ "properties": {
++ "route": { "type": "string", "maxLength": 200, "description": "The page's path on the site, e.g. /pricing." },
++ "check": { "type": "string", "maxLength": 40, "description": "status, errors, overflow, scripts, jsonld or axe." },
++ "rule": { "type": "string", "maxLength": 100, "description": "The axe rule id when check is axe." },
++ "impact": { "enum": ["minor", "moderate", "serious", "critical"] },
++ "targets": { "type": "array", "maxItems": 5, "items": { "type": "string", "maxLength": 160 }, "description": "The elements the rule names, as axe's target selectors." },
++ "help": { "type": "string", "maxLength": 300, "description": "The rule's own help text (axe's help), for a rule the notification does not know." },
++ "help_url": { "type": "string", "format": "uri", "maxLength": 500, "description": "The rule's help page (axe's helpUrl), when the check kept it." },
++ "page_url": { "type": "string", "format": "uri", "maxLength": 500, "description": "The page that failed, on the site's own https origin." },
++ "message": { "type": "string", "maxLength": 300, "description": "A console error's text, or a JSON-LD entity's type." },
++ "width": { "type": "integer", "minimum": 0, "maximum": 10000, "description": "The viewport width the failure was seen at, when it is width-specific." },
++ "status": { "type": "integer", "minimum": 100, "maximum": 599 },
++ "offenders": { "type": "array", "maxItems": 5, "items": { "type": "string", "maxLength": 160 }, "description": "The elements that overflow the viewport." }
++ }
++ }
++ },
++ "release": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "description": "The deployed commit the browser check saw (the full sha when the host can resolve it)." },
++ "release_url": { "type": "string", "format": "uri", "maxLength": 500, "description": "The release commit's page: git.openvibe.codes when the repository is mirrored there, else github.com." },
++ "checked_at": { "type": "string", "format": "date-time", "description": "When the browser check that found this ran." },
++ "failing_since": { "type": "string", "format": "date-time", "description": "When this alert started firing; the same instant as started_at, named for the notification's Failing since fact." }
}
}
}
ddiff --git a/contracts/quest/today.v1.json b/contracts/quest/today.v1.json
nnew file mode 100644
iindex 00000000..b5c6821e
---- /dev/null
++++ b/contracts/quest/today.v1.json
@@@ -0,0 +1,7 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/quest/today.v1.json",
++ "title": "QuestToday",
++ "description": "quest.today@1: today's private quest and progress for the signed-in person. GET /api/v1/quests/today requires a person token.",
++ "$ref": "daily-progress.v1.json"
++}
ddiff --git a/fixtures/agent.finding/invalid/confirmed-without-severity.json b/fixtures/agent.finding/invalid/confirmed-without-severity.json
nnew file mode 100644
iindex 00000000..3129b8bb
---- /dev/null
++++ b/fixtures/agent.finding/invalid/confirmed-without-severity.json
@@@ -0,0 +1,9 @@
++{
++ "verdict": "confirmed",
++ "fingerprint": "server/x.js:a confirmed finding without severity",
++ "title": "A confirmed finding without a severity",
++ "description": "A confirmed finding must say how likely and how bad it is.",
++ "trace": [ { "file": "server/x.js", "line": 1 } ],
++ "evidence": [ { "kind": "test", "summary": "The failing test." } ],
++ "confidence": { "level": "high", "reason": "The test fails." }
++}
ddiff --git a/fixtures/agent.finding/invalid/lead-with-severity.json b/fixtures/agent.finding/invalid/lead-with-severity.json
nnew file mode 100644
iindex 00000000..2afc5b5e
---- /dev/null
++++ b/fixtures/agent.finding/invalid/lead-with-severity.json
@@@ -0,0 +1,12 @@
++{
++ "verdict": "needs_validation",
++ "fingerprint": "server/x.js:a lead with a severity",
++ "title": "A lead that still carries a severity",
++ "description": "A claim that could not be proven must stay a lead and carry no severity.",
++ "trace": [ { "file": "server/x.js", "line": 1 } ],
++ "evidence": [ { "kind": "source", "summary": "The source." } ],
++ "claimed_root_cause": "A guess.",
++ "blockers": [ "No credential." ],
++ "validation_plan": { "local": "Try it." },
++ "severity": { "likelihood": "low", "impact": "low", "overall_severity": "low" }
++}
ddiff --git a/fixtures/agent.finding/invalid/lead-without-blocker.json b/fixtures/agent.finding/invalid/lead-without-blocker.json
nnew file mode 100644
iindex 00000000..472dfc69
---- /dev/null
++++ b/fixtures/agent.finding/invalid/lead-without-blocker.json
@@@ -0,0 +1,10 @@
++{
++ "verdict": "needs_validation",
++ "fingerprint": "server/x.js:a lead without its blocker",
++ "title": "A lead without a blocker",
++ "description": "An unprovable claim must say exactly what blocked it.",
++ "trace": [ { "file": "server/x.js", "line": 1 } ],
++ "evidence": [ { "kind": "source", "summary": "The source." } ],
++ "claimed_root_cause": "A guess.",
++ "validation_plan": { "local": "Try it." }
++}
ddiff --git a/fixtures/agent.finding/invalid/rejected-without-reason.json b/fixtures/agent.finding/invalid/rejected-without-reason.json
nnew file mode 100644
iindex 00000000..fd198905
---- /dev/null
++++ b/fixtures/agent.finding/invalid/rejected-without-reason.json
@@@ -0,0 +1,8 @@
++{
++ "verdict": "rejected",
++ "fingerprint": "server/x.js:a rejected claim without a reason",
++ "title": "A rejected claim without a reason",
++ "description": "A rejected finding must say why it does not stand.",
++ "trace": [ { "file": "server/x.js", "line": 1 } ],
++ "evidence": [ { "kind": "source", "summary": "The source." } ]
++}
ddiff --git a/fixtures/agent.finding/valid/confirmed.json b/fixtures/agent.finding/valid/confirmed.json
nnew file mode 100644
iindex 00000000..ac19a0a0
---- /dev/null
++++ b/fixtures/agent.finding/valid/confirmed.json
@@@ -0,0 +1,28 @@
++{
++ "verdict": "confirmed",
++ "fingerprint": "server/session.js:the cookie is set without httponly",
++ "title": "Session cookie has no HttpOnly flag",
++ "description": "The sign-in response sets ov_session without HttpOnly, so a script on the page can read it.",
++ "trace": [
++ { "file": "server/session.js", "line": 42, "symbol": "setSessionCookie" }
++ ],
++ "evidence": [
++ {
++ "kind": "source",
++ "summary": "The cookie options omit httpOnly.",
++ "location": { "file": "server/session.js", "line": 42 }
++ },
++ {
++ "kind": "command",
++ "summary": "The sign-in response shows the cookie without HttpOnly.",
++ "command": "curl -si -X POST localhost:4900/signin -d '{}' | grep set-cookie",
++ "output": "set-cookie: ov_session=…; Path=/; SameSite=Lax"
++ }
++ ],
++ "severity": { "likelihood": "medium", "impact": "high", "overall_severity": "high" },
++ "confidence": { "level": "high", "reason": "Reproduced against the local server and the source shows the same." },
++ "remediation": {
++ "strategy": "Add HttpOnly to the cookie options.",
++ "code_changes": [ { "file": "server/session.js", "change": "Add httpOnly: true to the cookie options." } ]
++ }
++}
ddiff --git a/fixtures/agent.finding/valid/needs-validation.json b/fixtures/agent.finding/valid/needs-validation.json
nnew file mode 100644
iindex 00000000..a687ae5c
---- /dev/null
++++ b/fixtures/agent.finding/valid/needs-validation.json
@@@ -0,0 +1,25 @@
++{
++ "verdict": "needs_validation",
++ "fingerprint": "server/billing.js:the retry may debit twice",
++ "title": "A retried debit may charge twice",
++ "description": "The retry path calls the debit again without reading the receipt; on a real card this could charge twice.",
++ "trace": [
++ { "file": "server/billing.js", "line": 118, "symbol": "debitRetry" }
++ ],
++ "evidence": [
++ {
++ "kind": "source",
++ "summary": "The retry calls debit() before the receipt is read.",
++ "location": { "file": "server/billing.js", "line": 118 }
++ }
++ ],
++ "claimed_root_cause": "The retry does not look up the first attempt's idempotency key.",
++ "blockers": [
++ "A test charge needs the live payment provider's sandbox credential, which is not on this machine."
++ ],
++ "validation_plan": {
++ "local": "Point the provider client at the sandbox and post one retried payment; the provider's ledger shows one or two charges.",
++ "deployment": "Replay a failed billing retry with a test account and read the provider's ledger."
++ },
++ "remediation": { "strategy": "Reuse the first attempt's idempotency key on the retry." }
++}
ddiff --git a/fixtures/agent.finding/valid/rejected.json b/fixtures/agent.finding/valid/rejected.json
nnew file mode 100644
iindex 00000000..0ddc3c9c
---- /dev/null
++++ b/fixtures/agent.finding/valid/rejected.json
@@@ -0,0 +1,17 @@
++{
++ "verdict": "rejected",
++ "fingerprint": "server/cache.js:the cache never expires",
++ "title": "The cache never expires",
++ "description": "The review said the cache has no expiry; the entry it named has a TTL two lines down.",
++ "trace": [
++ { "file": "server/cache.js", "line": 31, "symbol": "put" }
++ ],
++ "evidence": [
++ {
++ "kind": "source",
++ "summary": "The named call passes ttlMs.",
++ "location": { "file": "server/cache.js", "line": 31 }
++ }
++ ],
++ "reason": "The TTL is set by the options object on line 34, which the review did not read."
++}
ddiff --git a/fixtures/network.operator-alerts-request/invalid/detail-without-check.json b/fixtures/network.operator-alerts-request/invalid/detail-without-check.json
nnew file mode 100644
iindex 00000000..9428a982
---- /dev/null
++++ b/fixtures/network.operator-alerts-request/invalid/detail-without-check.json
@@@ -0,0 +1 @@
++{ "source": "prometheus", "alerts": [ { "fingerprint": "3f1c2a9b7d4e6f80", "name": "OpenVibeBrowserCheckFailed", "severity": "critical", "summary": "domains: the browser check failed", "started_at": "2026-09-26T05:35:00Z", "details": [ { "route": "/", "rule": "summary-name" } ] } ] }
ddiff --git a/fixtures/network.operator-alerts-request/valid/browser-check.json b/fixtures/network.operator-alerts-request/valid/browser-check.json
nnew file mode 100644
iindex 00000000..e877b691
---- /dev/null
++++ b/fixtures/network.operator-alerts-request/valid/browser-check.json
@@@ -0,0 +1,45 @@
++{
++ "source": "prometheus",
++ "sent_at": "2026-11-10T09:20:00Z",
++ "alerts": [
++ {
++ "fingerprint": "4c1f8a2d9e7b6c50",
++ "name": "OpenVibeBrowserCheckFailed",
++ "severity": "critical",
++ "summary": "domains: the browser check of release 74bdff4 failed (1 failing check(s)); run: sudo ovhost browser-watch --sites domains --force",
++ "description": "The automatic check of openvibe.domains found a problem after release 74bdff4.",
++ "service": "domains",
++ "started_at": "2026-11-10T09:12:30Z",
++ "failing_since": "2026-11-10T09:12:30Z",
++ "release": "74bdff4c0a1e9d2b7f3c5a8e6b4d2f1a0c9e8d7b",
++ "release_url": "https://git.openvibe.codes/OpenVibers/OpenVibe.Domains/commit/74bdff4c0a1e9d2b7f3c5a8e6b4d2f1a0c9e8d7b",
++ "checked_at": "2026-11-10T09:12:00Z",
++ "details": [
++ {
++ "route": "/",
++ "check": "axe",
++ "rule": "summary-name",
++ "impact": "serious",
++ "targets": ["#dev-fold > summary", "#faq-fold > summary"],
++ "help": "Ensures the summary element has a non-empty accessible name",
++ "help_url": "https://dequeuniversity.com/rules/axe/4.13/summary-name?application=axeAPI",
++ "page_url": "https://openvibe.domains/"
++ }
++ ]
++ },
++ {
++ "fingerprint": "9a8b7c6d5e4f3a2b1c0d",
++ "name": "OpenVibeBrowserCheckFailed",
++ "severity": "warning",
++ "summary": "live: the browser check of release 8caa540 failed (2 failing check(s))",
++ "service": "live",
++ "started_at": "2026-09-26T14:05:00Z",
++ "release": "8caa540",
++ "checked_at": "2026-09-26T14:04:00Z",
++ "details": [
++ { "route": "/", "check": "errors", "message": "WebSocket closed", "width": 390, "page_url": "https://openvibe.live/" },
++ { "route": "/", "check": "overflow", "width": 390, "offenders": [".wide"], "page_url": "https://openvibe.live/" }
++ ]
++ }
++ ]
++}
ddiff --git a/fixtures/quest.today/invalid/too-much.json b/fixtures/quest.today/invalid/too-much.json
nnew file mode 100644
iindex 00000000..fabc825a
---- /dev/null
++++ b/fixtures/quest.today/invalid/too-much.json
@@@ -0,0 +1,56 @@
++{
++ "date": "2026-11-08",
++ "title": "Around the network",
++ "story": "Visit three places today.",
++ "steps": [
++ {
++ "id": "stream",
++ "event_type": "live.stream.started",
++ "site": "openvibe.live",
++ "sentence": "Do something on openvibe.live",
++ "href": "https://openvibe.live/",
++ "weight": 1,
++ "count": 1,
++ "verification": "event subject, count within the person's local day",
++ "status": "approved",
++ "source": "quest",
++ "progress": 1,
++ "done": true
++ },
++ {
++ "id": "chat",
++ "event_type": "chat.room.message.created",
++ "site": "openvibe.chat",
++ "sentence": "Do something on openvibe.chat",
++ "href": "https://openvibe.chat/",
++ "weight": 1,
++ "count": 1,
++ "verification": "event subject, count within the person's local day",
++ "status": "approved",
++ "source": "quest",
++ "progress": 1,
++ "done": true
++ },
++ {
++ "id": "wiki",
++ "event_type": "wiki.revision.created",
++ "site": "openvibe.wiki",
++ "sentence": "Do something on openvibe.wiki",
++ "href": "https://openvibe.wiki/",
++ "weight": 1,
++ "count": 1,
++ "verification": "event subject, count within the person's local day",
++ "status": "approved",
++ "source": "quest",
++ "progress": 1,
++ "done": true
++ }
++ ],
++ "source": "rotation",
++ "finished_today": 3,
++ "progress": 4,
++ "completed": true,
++ "completed_at": "2026-11-08T22:00:00Z",
++ "streak": 1,
++ "time_zone": "UTC"
++}
ddiff --git a/fixtures/quest.today/valid/mine.json b/fixtures/quest.today/valid/mine.json
nnew file mode 100644
iindex 00000000..8fe8b654
---- /dev/null
++++ b/fixtures/quest.today/valid/mine.json
@@@ -0,0 +1,56 @@
++{
++ "date": "2026-11-08",
++ "title": "Around the network",
++ "story": "Visit three places today.",
++ "steps": [
++ {
++ "id": "stream",
++ "event_type": "live.stream.started",
++ "site": "openvibe.live",
++ "sentence": "Do something on openvibe.live",
++ "href": "https://openvibe.live/",
++ "weight": 1,
++ "count": 1,
++ "verification": "event subject, count within the person's local day",
++ "status": "approved",
++ "source": "quest",
++ "progress": 1,
++ "done": true
++ },
++ {
++ "id": "chat",
++ "event_type": "chat.room.message.created",
++ "site": "openvibe.chat",
++ "sentence": "Do something on openvibe.chat",
++ "href": "https://openvibe.chat/",
++ "weight": 1,
++ "count": 1,
++ "verification": "event subject, count within the person's local day",
++ "status": "approved",
++ "source": "quest",
++ "progress": 0,
++ "done": false
++ },
++ {
++ "id": "wiki",
++ "event_type": "wiki.revision.created",
++ "site": "openvibe.wiki",
++ "sentence": "Do something on openvibe.wiki",
++ "href": "https://openvibe.wiki/",
++ "weight": 1,
++ "count": 1,
++ "verification": "event subject, count within the person's local day",
++ "status": "approved",
++ "source": "quest",
++ "progress": 0,
++ "done": false
++ }
++ ],
++ "source": "rotation",
++ "finished_today": 3,
++ "progress": 1,
++ "completed": false,
++ "completed_at": null,
++ "streak": 0,
++ "time_zone": "America/Los_Angeles"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 18a362f7..43407d4b 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -36239,7 +36239,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/network/operator-alerts-request.v1.json",
"title": "NetworkOperatorAlertsRequest",
-- "description": "network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations.",
++ "description": "network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations. A browser-check alert may carry what its result file knows (details, the release and its commit link, when the check ran, since when it has been failing) so the notification can explain the problem in words and link to the page, the commit and the rule's help page. Every string is text, never markup; every URL is https.",
"type": "object",
"required": [
"source",
@@@ -36302,6 +36302,115 @@
"started_at": {
"type": "string",
"format": "date-time"
++ },
++ "details": {
++ "type": "array",
++ "maxItems": 5,
++ "description": "What failed, for a browser-check alert (from the check's result file), most useful first. Plain text: a notification shows it escaped, never as markup.",
++ "items": {
++ "type": "object",
++ "required": [
++ "check"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "route": {
++ "type": "string",
++ "maxLength": 200,
++ "description": "The page's path on the site, e.g. /pricing."
++ },
++ "check": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "status, errors, overflow, scripts, jsonld or axe."
++ },
++ "rule": {
++ "type": "string",
++ "maxLength": 100,
++ "description": "The axe rule id when check is axe."
++ },
++ "impact": {
++ "enum": [
++ "minor",
++ "moderate",
++ "serious",
++ "critical"
++ ]
++ },
++ "targets": {
++ "type": "array",
++ "maxItems": 5,
++ "items": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "description": "The elements the rule names, as axe's target selectors."
++ },
++ "help": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The rule's own help text (axe's help), for a rule the notification does not know."
++ },
++ "help_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 500,
++ "description": "The rule's help page (axe's helpUrl), when the check kept it."
++ },
++ "page_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 500,
++ "description": "The page that failed, on the site's own https origin."
++ },
++ "message": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "A console error's text, or a JSON-LD entity's type."
++ },
++ "width": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 10000,
++ "description": "The viewport width the failure was seen at, when it is width-specific."
++ },
++ "status": {
++ "type": "integer",
++ "minimum": 100,
++ "maximum": 599
++ },
++ "offenders": {
++ "type": "array",
++ "maxItems": 5,
++ "items": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "description": "The elements that overflow the viewport."
++ }
++ }
++ }
++ },
++ "release": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{7,40}$",
++ "description": "The deployed commit the browser check saw (the full sha when the host can resolve it)."
++ },
++ "release_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 500,
++ "description": "The release commit's page: git.openvibe.codes when the repository is mirrored there, else github.com."
++ },
++ "checked_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the browser check that found this ran."
++ },
++ "failing_since": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When this alert started firing; the same instant as started_at, named for the notification's Failing since fact."
}
}
}
@@@ -95584,6 +95693,18 @@
}
}
},
++ "quest.today": {
++ "version": "1.0.0",
++ "owner": "quest",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/quest/today.v1.json",
++ "title": "QuestToday",
++ "description": "quest.today@1: today's private quest and progress for the signed-in person. GET /api/v1/quests/today requires a person token.",
++ "$ref": "daily-progress.v1.json"
++ }
++ },
"quest.step-type": {
"version": "1.0.0",
"owner": "quest",
@@@ -123314,6 +123435,365 @@
]
}
},
++ "agent.finding": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/finding.v1.json",
++ "title": "AgentFinding",
++ "description": "One finding of a review, a hunt or a security pass. The verdict is the evidence bar, not the severity: `confirmed` means the finding was reproduced or re-read and carries `severity` and `confidence`; `needs_validation` is an unprovable claim turned into a lead with an exact `blockers` entry and a `validation_plan`, and it has no severity by design (never noise, never a silent pass); `rejected` says why it does not stand. `fingerprint` is the stable identity — repository-relative file plus whitespace-normalised, lowercased text — so a re-wrapped finding keeps its id while a real rewording becomes a new one. `trace` and `evidence` carry repository-relative locations and the commands or answers that show the fact. A validator must also refuse `severity.overall_severity` above the demonstrated `severity.impact`; the schema cannot rank two enums, so `description` states the rule.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "verdict",
++ "fingerprint",
++ "title",
++ "description",
++ "trace",
++ "evidence"
++ ],
++ "properties": {
++ "verdict": {
++ "type": "string",
++ "enum": [
++ "confirmed",
++ "needs_validation",
++ "rejected"
++ ],
++ "description": "confirmed: reproduced or re-read by a second agent. needs_validation: a lead that could not be proven locally; it carries blockers and a plan, never a severity. rejected: the claim was refuted; it carries a reason."
++ },
++ "fingerprint": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The stable id: repository-relative file + whitespace-normalised, lowercased finding text (for example `server/x.js:the cache never expires`)."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "description": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000,
++ "description": "What is wrong, in plain words; no severity claim beyond the evidence."
++ },
++ "trace": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 50,
++ "items": {
++ "$ref": "#/$defs/location"
++ },
++ "description": "Where the issue lives, repository-relative, most specific first."
++ },
++ "evidence": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 50,
++ "items": {
++ "$ref": "#/$defs/evidence"
++ },
++ "description": "What shows the fact: the source read, the command and its output, the response, the screenshot or the test."
++ },
++ "severity": {
++ "$ref": "#/$defs/severity"
++ },
++ "confidence": {
++ "$ref": "#/$defs/confidence"
++ },
++ "remediation": {
++ "$ref": "#/$defs/remediation"
++ },
++ "claimed_root_cause": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "The suspected cause of a needs_validation lead, stated as a claim to test."
++ },
++ "blockers": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500
++ },
++ "description": "The exact reason the claim could not be proven here (a credential, an environment, data, a downstream service)."
++ },
++ "validation_plan": {
++ "$ref": "#/$defs/validation_plan"
++ },
++ "reason": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "Why a rejected claim does not stand."
++ }
++ },
++ "allOf": [
++ {
++ "if": {
++ "properties": {
++ "verdict": {
++ "const": "confirmed"
++ }
++ },
++ "required": [
++ "verdict"
++ ]
++ },
++ "then": {
++ "required": [
++ "severity",
++ "confidence"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "verdict": {
++ "const": "needs_validation"
++ }
++ },
++ "required": [
++ "verdict"
++ ]
++ },
++ "then": {
++ "required": [
++ "claimed_root_cause",
++ "blockers",
++ "validation_plan"
++ ],
++ "not": {
++ "required": [
++ "severity"
++ ]
++ }
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "verdict": {
++ "const": "rejected"
++ }
++ },
++ "required": [
++ "verdict"
++ ]
++ },
++ "then": {
++ "required": [
++ "reason"
++ ],
++ "not": {
++ "required": [
++ "severity"
++ ]
++ }
++ }
++ }
++ ],
++ "$defs": {
++ "location": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "file"
++ ],
++ "properties": {
++ "file": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "Repository-relative path; no leading slash and no `..`."
++ },
++ "line": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The line the finding is about, when it is one line."
++ },
++ "symbol": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The function, route or job the line belongs to."
++ }
++ }
++ },
++ "evidence": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "summary"
++ ],
++ "properties": {
++ "kind": {
++ "type": "string",
++ "enum": [
++ "source",
++ "command",
++ "response",
++ "screenshot",
++ "log",
++ "test"
++ ],
++ "description": "What kind of evidence this is."
++ },
++ "summary": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 1000,
++ "description": "What this shows, in one sentence."
++ },
++ "location": {
++ "$ref": "#/$defs/location"
++ },
++ "command": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000
++ },
++ "output": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000
++ }
++ }
++ },
++ "severity": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "likelihood",
++ "impact",
++ "overall_severity"
++ ],
++ "description": "The two axes stay separate: likelihood is how easily it is reached, impact is what it does, overall_severity may not exceed impact.",
++ "properties": {
++ "likelihood": {
++ "$ref": "#/$defs/level"
++ },
++ "impact": {
++ "$ref": "#/$defs/level"
++ },
++ "overall_severity": {
++ "$ref": "#/$defs/level"
++ }
++ }
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "informational",
++ "low",
++ "medium",
++ "high",
++ "critical"
++ ]
++ },
++ "confidence": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "level",
++ "reason"
++ ],
++ "properties": {
++ "level": {
++ "type": "string",
++ "enum": [
++ "low",
++ "medium",
++ "high"
++ ]
++ },
++ "reason": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 1000
++ }
++ }
++ },
++ "remediation": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "strategy"
++ ],
++ "properties": {
++ "strategy": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000
++ },
++ "code_changes": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "file",
++ "change"
++ ],
++ "properties": {
++ "file": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500
++ },
++ "change": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 1000
++ }
++ }
++ }
++ }
++ }
++ },
++ "validation_plan": {
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "local": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "How to prove or refute the lead on a machine with the repository."
++ },
++ "deployment": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "How to prove or refute it where only a deployed service, its data or its credentials can."
++ }
++ },
++ "anyOf": [
++ {
++ "required": [
++ "local"
++ ]
++ },
++ {
++ "required": [
++ "deployment"
++ ]
++ }
++ ]
++ }
++ }
++ }
++ },
"ai.effort": {
"version": "1.0.0",
"owner": "ai",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex fe4f6a9c..03f128ec 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.398.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 8179db2f..6aceff07 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.398.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 8b9d7c9c..8575e3c4 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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/billing.json b/generated/openapi/billing.json
iindex 334f6978..091cf136 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.398.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 01e71498..6d7b059d 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.398.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 13526220..7d8b7b37 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.398.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 df28ccfb..28a6bf28 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.398.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 8269daff..f71b0f41 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.398.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 0d853b2d..336c96ff 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.398.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex 55d8e616..13ce3aa5 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 14801974..e8d4cc60 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.398.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 e00eebb5..05c56258 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.398.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 9055530c..09c8016f 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 fa990f5c..98e1a0ae 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.398.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 ad8b3cf7..22594e4b 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.398.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/exchange.json b/generated/openapi/exchange.json
iindex 758087ff..14977636 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Exchange API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 8f253207..1e6cec92 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.398.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 aa9ac707..102554d0 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.398.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/git.json b/generated/openapi/git.json
iindex 38ee418c..958fc2ad 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Git API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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"
@@@ -2050,6 +2050,88 @@
}
}
},
++ "/api/v1/repos/{owner}/{name}/commits/{sha}/statuses": {
++ "post": {
++ "operationId": "post_api_v1_repos_owner_name_commits_sha_statuses",
++ "summary": "Report commit statuses (checks) on OpenVibe.Git (git.openvibe.codes): POST /api/v1/repos/:owner/:name/commits/:sha/statuses with {context, state: pending|success|failure|error, description?, target_ur",
++ "description": "**git.checks.write** (first-party): Report commit statuses (checks) on OpenVibe.Git (git.openvibe.codes): POST /api/v1/repos/:owner/:name/commits/:sha/statuses with {context, state: pending|success|failure|error, description?, target_url?}. A first-party CI service (Run first) holds this capability for the audience openvibe.git and reports any repository it builds; the owner may report their own. Reads (GET, the latest per context) need no capability on a public repository and git.repo.read on a private one. A change is mergeable only when its required contexts are green.",
++ "tags": [
++ "git.checks"
++ ],
++ "x-openvibe-capabilities": [
++ "git.checks.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "git.checks.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/git.access-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "owner",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "sha",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/git.access-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/repos/{owner}/{name}/compare/{base}...{head}": {
"get": {
"operationId": "get_api_v1_repos_owner_name_compare_base_head",
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 29599603..0e298787 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.398.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 4e11a24f..6c76aa97 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -131,8 +131,8 @@
"service": "git",
"name": "OpenVibe.Git",
"origin": "https://git.openvibe.codes",
-- "operations": 35,
-- "capabilities": 2
++ "operations": 36,
++ "capabilities": 3
},
{
"service": "host",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 0e47049b..fee5aa1e 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.398.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 3628b248..c5b788c7 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.398.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/mail.json b/generated/openapi/mail.json
iindex 5242f208..00122ba7 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Mail API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 d5f04b0a..9a3b9d83 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.398.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 94b811be..f1be9bfa 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.398.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 73ae70dc..659a822e 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.398.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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"
@@@ -8159,7 +8159,7 @@
},
"network.operator-alerts-request.v1": {
"title": "NetworkOperatorAlertsRequest",
-- "description": "network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations.",
++ "description": "network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations. A browser-check alert may carry what its result file knows (details, the release and its commit link, when the check ran, since when it has been failing) so the notification can explain the problem in words and link to the page, the commit and the rule's help page. Every string is text, never markup; every URL is https.",
"type": "object",
"required": [
"source",
@@@ -8222,6 +8222,115 @@
"started_at": {
"type": "string",
"format": "date-time"
++ },
++ "details": {
++ "type": "array",
++ "maxItems": 5,
++ "description": "What failed, for a browser-check alert (from the check's result file), most useful first. Plain text: a notification shows it escaped, never as markup.",
++ "items": {
++ "type": "object",
++ "required": [
++ "check"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "route": {
++ "type": "string",
++ "maxLength": 200,
++ "description": "The page's path on the site, e.g. /pricing."
++ },
++ "check": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "status, errors, overflow, scripts, jsonld or axe."
++ },
++ "rule": {
++ "type": "string",
++ "maxLength": 100,
++ "description": "The axe rule id when check is axe."
++ },
++ "impact": {
++ "enum": [
++ "minor",
++ "moderate",
++ "serious",
++ "critical"
++ ]
++ },
++ "targets": {
++ "type": "array",
++ "maxItems": 5,
++ "items": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "description": "The elements the rule names, as axe's target selectors."
++ },
++ "help": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The rule's own help text (axe's help), for a rule the notification does not know."
++ },
++ "help_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 500,
++ "description": "The rule's help page (axe's helpUrl), when the check kept it."
++ },
++ "page_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 500,
++ "description": "The page that failed, on the site's own https origin."
++ },
++ "message": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "A console error's text, or a JSON-LD entity's type."
++ },
++ "width": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 10000,
++ "description": "The viewport width the failure was seen at, when it is width-specific."
++ },
++ "status": {
++ "type": "integer",
++ "minimum": 100,
++ "maximum": 599
++ },
++ "offenders": {
++ "type": "array",
++ "maxItems": 5,
++ "items": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "description": "The elements that overflow the viewport."
++ }
++ }
++ }
++ },
++ "release": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{7,40}$",
++ "description": "The deployed commit the browser check saw (the full sha when the host can resolve it)."
++ },
++ "release_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 500,
++ "description": "The release commit's page: git.openvibe.codes when the repository is mirrored there, else github.com."
++ },
++ "checked_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the browser check that found this ran."
++ },
++ "failing_since": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When this alert started firing; the same instant as started_at, named for the notification's Failing since fact."
}
}
}
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 0d0e550e..6e17ac6f 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.398.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 2417423d..2a8c6e42 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.398.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 c43374d9..d6b41c84 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.398.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 0f3ba0c9..ea3966b6 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.398.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex b54dbac7..7a9925f8 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 dfeefb58..83508d6b 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.398.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 dd3fef91..935f1438 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.398.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 e5084044..4d72269e 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.398.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 210d7aa8..64092179 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.398.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 a5bffade..a01a8dce 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.398.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 49602c30..8270be4d 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.398.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 060a578c..85aa5d73 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.398.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex f31a76e9..7a52d740 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.398.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 1fc13fbb..1c91f477 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.398.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 3c2d088d..2a608ec8 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.398.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 4e4ce7aa..72091222 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.398.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 95abf840..ff7c08c9 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.398.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 e66d157b..78358b28 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.398.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 279a8f7a..9d2d55d6 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.398.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 ccf57045..add45d75 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.398.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 9ba0ac0f..3d931b4b 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.398.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.398.0): each operation lists the capabilities it performs; a token for 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.399.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.399.0): each operation lists the capabilities it performs; a token for 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 e36418b4..4476c21f 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -180590,7 +180590,7 @@ export interface NetworkFollowStatusResult {
/** [email protected] (owner: network) */
/**
-- * network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations.
++ * network.operator-alerts-request@1: POST /internal/operator/alerts on OpenVibe.Network (capability network.operator.alert, held by the Host principal). The complete set of alerts firing now at one source: an alert Network has not seen firing opens and pages the operator; one still firing is reminded once a day; one that was firing and is absent from the set is resolved and says so. An empty list resolves everything from that source. Fingerprints are stable per alert (name and labels), never secrets; summaries and descriptions are the alert rule's annotations. A browser-check alert may carry what its result file knows (details, the release and its commit link, when the check ran, since when it has been failing) so the notification can explain the problem in words and link to the page, the commit and the rule's help page. Every string is text, never markup; every URL is https.
*/
export interface NetworkOperatorAlertsRequest {
/**
@@@ -180609,6 +180609,939 @@ export interface NetworkOperatorAlertsRequest {
description?: string;
service?: string;
started_at: string;
++ /**
++ * What failed, for a browser-check alert (from the check's result file), most useful first. Plain text: a notification shows it escaped, never as markup.
++ *
++ * @maxItems 5
++ */
++ details?:
++ | []
++ | [
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ }
++ ]
++ | [
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ }
++ ]
++ | [
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ }
++ ]
++ | [
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ }
++ ]
++ | [
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ },
++ {
++ /**
++ * The page's path on the site, e.g. /pricing.
++ */
++ route?: string;
++ /**
++ * status, errors, overflow, scripts, jsonld or axe.
++ */
++ check: string;
++ /**
++ * The axe rule id when check is axe.
++ */
++ rule?: string;
++ impact?: "minor" | "moderate" | "serious" | "critical";
++ /**
++ * The elements the rule names, as axe's target selectors.
++ *
++ * @maxItems 5
++ */
++ targets?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ /**
++ * The rule's own help text (axe's help), for a rule the notification does not know.
++ */
++ help?: string;
++ /**
++ * The rule's help page (axe's helpUrl), when the check kept it.
++ */
++ help_url?: string;
++ /**
++ * The page that failed, on the site's own https origin.
++ */
++ page_url?: string;
++ /**
++ * A console error's text, or a JSON-LD entity's type.
++ */
++ message?: string;
++ /**
++ * The viewport width the failure was seen at, when it is width-specific.
++ */
++ width?: number;
++ status?: number;
++ /**
++ * The elements that overflow the viewport.
++ *
++ * @maxItems 5
++ */
++ offenders?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string];
++ }
++ ];
++ /**
++ * The deployed commit the browser check saw (the full sha when the host can resolve it).
++ */
++ release?: string;
++ /**
++ * The release commit's page: git.openvibe.codes when the repository is mirrored there, else github.com.
++ */
++ release_url?: string;
++ /**
++ * When the browser check that found this ran.
++ */
++ checked_at?: string;
++ /**
++ * When this alert started firing; the same instant as started_at, named for the notification's Failing since fact.
++ */
++ failing_since?: string;
}[];
}
@@@ -279574,6 +280507,71 @@ export interface QuestDailyProgress {
time_zone: string;
}
++/** [email protected] (owner: quest) */
++/**
++ * quest.today@1: today's private quest and progress for the signed-in person. GET /api/v1/quests/today requires a person token.
++ */
++export interface QuestToday {
++ date: string;
++ title: string;
++ story: string;
++ /**
++ * @minItems 3
++ * @maxItems 3
++ */
++ steps: [
++ {
++ id: string;
++ event_type: string;
++ site: string;
++ sentence: string;
++ href: string;
++ weight: number;
++ count: 1;
++ verification: string;
++ status: "approved";
++ source: string;
++ progress: number;
++ done: boolean;
++ },
++ {
++ id: string;
++ event_type: string;
++ site: string;
++ sentence: string;
++ href: string;
++ weight: number;
++ count: 1;
++ verification: string;
++ status: "approved";
++ source: string;
++ progress: number;
++ done: boolean;
++ },
++ {
++ id: string;
++ event_type: string;
++ site: string;
++ sentence: string;
++ href: string;
++ weight: number;
++ count: 1;
++ verification: string;
++ status: "approved";
++ source: string;
++ progress: number;
++ done: boolean;
++ }
++ ];
++ source: "ai" | "rotation";
++ finished_today: number;
++ progress: number;
++ completed: boolean;
++ completed_at?: string | null;
++ streak: number;
++ time_zone: string;
++}
++
/** [email protected] (owner: quest) */
/**
* quest.step-type@1: a verified Events action that may be selected for a daily quest. A contributed type stays pending until staff review.
@@@ -329807,6 +330805,1173 @@ export type AgentStage =
| "idle"
| "working";
++/** [email protected] (owner: actor) */
++/**
++ * One finding of a review, a hunt or a security pass. The verdict is the evidence bar, not the severity: `confirmed` means the finding was reproduced or re-read and carries `severity` and `confidence`; `needs_validation` is an unprovable claim turned into a lead with an exact `blockers` entry and a `validation_plan`, and it has no severity by design (never noise, never a silent pass); `rejected` says why it does not stand. `fingerprint` is the stable identity — repository-relative file plus whitespace-normalised, lowercased text — so a re-wrapped finding keeps its id while a real rewording becomes a new one. `trace` and `evidence` carry repository-relative locations and the commands or answers that show the fact. A validator must also refuse `severity.overall_severity` above the demonstrated `severity.impact`; the schema cannot rank two enums, so `description` states the rule.
++ */
++export type AgentFinding = {
++ [k: string]: unknown | undefined;
++} & {
++ /**
++ * confirmed: reproduced or re-read by a second agent. needs_validation: a lead that could not be proven locally; it carries blockers and a plan, never a severity. rejected: the claim was refuted; it carries a reason.
++ */
++ verdict: "confirmed" | "needs_validation" | "rejected";
++ /**
++ * The stable id: repository-relative file + whitespace-normalised, lowercased finding text (for example `server/x.js:the cache never expires`).
++ */
++ fingerprint: string;
++ title: string;
++ /**
++ * What is wrong, in plain words; no severity claim beyond the evidence.
++ */
++ description: string;
++ /**
++ * Where the issue lives, repository-relative, most specific first.
++ *
++ * @minItems 1
++ * @maxItems 50
++ */
++ trace: [
++ {
++ /**
++ * Repository-relative path; no leading slash and no `..`.
++ */
++ file: string;
++ /**
++ * The line the finding is about, when it is one line.
++ */
++ line?: number;
++ /**
++ * The function, route or job the line belongs to.
++ */
++ symbol?: string;
++ },
++ ...{
++ /**
++ * Repository-relative path; no leading slash and no `..`.
++ */
++ file: string;
++ /**
++ * The line the finding is about, when it is one line.
++ */
++ line?: number;
++ /**
++ * The function, route or job the line belongs to.
++ */
++ symbol?: string;
++ }[]
++ ];
++ /**
++ * What shows the fact: the source read, the command and its output, the response, the screenshot or the test.
++ *
++ * @minItems 1
++ * @maxItems 50
++ */
++ evidence: [
++ {
++ /**
++ * What kind of evidence this is.
++ */
++ kind: "source" | "command" | "response" | "screenshot" | "log" | "test";
++ /**
++ * What this shows, in one sentence.
++ */
++ summary: string;
++ location?: {
++ /**
++ * Repository-relative path; no leading slash and no `..`.
++ */
++ file: string;
++ /**
++ * The line the finding is about, when it is one line.
++ */
++ line?: number;
++ /**
++ * The function, route or job the line belongs to.
++ */
++ symbol?: string;
++ };
++ command?: string;
++ output?: string;
++ },
++ ...{
++ /**
++ * What kind of evidence this is.
++ */
++ kind: "source" | "command" | "response" | "screenshot" | "log" | "test";
++ /**
++ * What this shows, in one sentence.
++ */
++ summary: string;
++ location?: {
++ /**
++ * Repository-relative path; no leading slash and no `..`.
++ */
++ file: string;
++ /**
++ * The line the finding is about, when it is one line.
++ */
++ line?: number;
++ /**
++ * The function, route or job the line belongs to.
++ */
++ symbol?: string;
++ };
++ command?: string;
++ output?: string;
++ }[]
++ ];
++ /**
++ * The two axes stay separate: likelihood is how easily it is reached, impact is what it does, overall_severity may not exceed impact.
++ */
++ severity?: {
++ likelihood: "informational" | "low" | "medium" | "high" | "critical";
++ impact: "informational" | "low" | "medium" | "high" | "critical";
++ overall_severity: "informational" | "low" | "medium" | "high" | "critical";
++ };
++ confidence?: {
++ level: "low" | "medium" | "high";
++ reason: string;
++ };
++ remediation?: {
++ strategy: string;
++ /**
++ * @maxItems 20
++ */
++ code_changes?:
++ | []
++ | [
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ]
++ | [
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ },
++ {
++ file: string;
++ change: string;
++ }
++ ];
++ };
++ /**
++ * The suspected cause of a needs_validation lead, stated as a claim to test.
++ */
++ claimed_root_cause?: string;
++ /**
++ * The exact reason the claim could not be proven here (a credential, an environment, data, a downstream service).
++ *
++ * @minItems 1
++ * @maxItems 20
++ */
++ blockers?:
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string]
++ | [string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string, string, string, string]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ];
++ validation_plan?: {
++ [k: string]: unknown | undefined;
++ };
++ /**
++ * Why a rejected claim does not stand.
++ */
++ reason?: string;
++};
++
/** [email protected] (owner: ai) */
/**
* Portable reasoning effort. auto resolves to the task default; unsupported model controls are ignored and receipt effort_applied is null.
ddiff --git a/manifests/capabilities/git.checks.write.json b/manifests/capabilities/git.checks.write.json
nnew file mode 100644
iindex 00000000..dafd54e2
---- /dev/null
++++ b/manifests/capabilities/git.checks.write.json
@@@ -0,0 +1,21 @@
++{
++ "id": "git.checks.write",
++ "version": "1.0",
++ "owner": "git",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Report commit statuses (checks) on OpenVibe.Git (git.openvibe.codes): POST /api/v1/repos/:owner/:name/commits/:sha/statuses with {context, state: pending|success|failure|error, description?, target_url?}. A first-party CI service (Run first) holds this capability for the audience openvibe.git and reports any repository it builds; the owner may report their own. Reads (GET, the latest per context) need no capability on a public repository and git.repo.read on a private one. A change is mergeable only when its required contexts are green.",
++ "inputSchema": "git.access-request@1",
++ "outputSchema": "git.access-result@1",
++ "permissions": [
++ "git:checks-write"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/repos/:owner/:name/commits/:sha/statuses"
++ ]
++}
ddiff --git a/manifests/services/git.json b/manifests/services/git.json
iindex f704465f..20fed2a6 100644
---- a/manifests/services/git.json
++++ b/manifests/services/git.json
@@@ -17,7 +17,8 @@
},
"capabilities": [
"git.repo.read",
-- "git.repo.write"
++ "git.repo.write",
++ "git.checks.write"
],
"eventsProduced": [],
"eventsConsumed": [],
ddiff --git a/package-lock.json b/package-lock.json
iindex d8e8cca0..aa345db8 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.398.0",
++ "version": "0.399.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.398.0",
++ "version": "0.399.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex feece6b8..cc5db401 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.398.0",
++ "version": "0.399.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",