openvibers/openvibe.contracts Commits

v0.9.0: registry.release-manifest@1 (GET /release.json, ADR-016)

OP OpenVibers committed 23 Sept 2026 · ab0a426a2f · 8 files, +157 −1


Changes

ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 05ae5fb3..2e77bb70 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -107,6 +107,16 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "registry.release-manifest",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "registry/release-manifest.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-016"
}
]
}
ddiff --git a/contracts/registry/release-manifest.v1.json b/contracts/registry/release-manifest.v1.json
nnew file mode 100644
iindex 00000000..94eb2522
---- /dev/null
++++ b/contracts/registry/release-manifest.v1.json
@@@ -0,0 +1,23 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/registry/release-manifest.v1.json",
++ "title": "ReleaseManifest",
++ "description": "What a running web surface is serving (GET /release.json, ADR-016). Open clients compare it on focus and reconnect; a client outside the supported window is prompted and reloads only when that is safe.",
++ "type": "object",
++ "required": ["service", "release", "released_at", "contracts_version", "min_client_release", "mixed_version_window_hours"],
++ "additionalProperties": false,
++ "properties": {
++ "service": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,39}$" },
++ "release": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "description": "The deployed commit (short sha)." },
++ "released_at": { "type": "string", "format": "date-time", "description": "Commit time of the release." },
++ "booted_at": { "type": "string", "format": "date-time" },
++ "contracts_version": { "type": ["string", "null"], "description": "openvibe-contracts version the service runs against." },
++ "packages": {
++ "type": "object",
++ "description": "Versions of the platform packages the page loads (openvibe-shared, openvibe-sdk, ...).",
++ "additionalProperties": { "type": "string" }
++ },
++ "min_client_release": { "type": ["string", "null"], "description": "Oldest client release still supported; null while every client in the window is." },
++ "mixed_version_window_hours": { "type": "integer", "minimum": 0 }
++ }
++}
ddiff --git a/fixtures/registry.release-manifest/invalid/bad-release.json b/fixtures/registry.release-manifest/invalid/bad-release.json
nnew file mode 100644
iindex 00000000..9fcf21be
---- /dev/null
++++ b/fixtures/registry.release-manifest/invalid/bad-release.json
@@@ -0,0 +1,8 @@
++{
++ "service": "live",
++ "release": "main",
++ "released_at": "2026-09-23T01:28:10Z",
++ "contracts_version": "0.8.0",
++ "min_client_release": null,
++ "mixed_version_window_hours": 24
++}
ddiff --git a/fixtures/registry.release-manifest/invalid/no-window.json b/fixtures/registry.release-manifest/invalid/no-window.json
nnew file mode 100644
iindex 00000000..54ff5d34
---- /dev/null
++++ b/fixtures/registry.release-manifest/invalid/no-window.json
@@@ -0,0 +1,7 @@
++{
++ "service": "live",
++ "release": "8a678c8",
++ "released_at": "2026-09-23T01:28:10Z",
++ "contracts_version": "0.8.0",
++ "min_client_release": null
++}
ddiff --git a/fixtures/registry.release-manifest/valid/live.json b/fixtures/registry.release-manifest/valid/live.json
nnew file mode 100644
iindex 00000000..a1a3a5f7
---- /dev/null
++++ b/fixtures/registry.release-manifest/valid/live.json
@@@ -0,0 +1,10 @@
++{
++ "service": "live",
++ "release": "8a678c8",
++ "released_at": "2026-09-23T01:28:10Z",
++ "booted_at": "2026-09-23T01:31:52Z",
++ "contracts_version": "0.8.0",
++ "packages": { "openvibe-shared": "1.0.0", "openvibe-sdk": "0.2.2" },
++ "min_client_release": null,
++ "mixed_version_window_hours": 24
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex fa6a1e0d..073780ba 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -800,6 +800,72 @@
}
}
}
++ },
++ "registry.release-manifest": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/registry/release-manifest.v1.json",
++ "title": "ReleaseManifest",
++ "description": "What a running web surface is serving (GET /release.json, ADR-016). Open clients compare it on focus and reconnect; a client outside the supported window is prompted and reloads only when that is safe.",
++ "type": "object",
++ "required": [
++ "service",
++ "release",
++ "released_at",
++ "contracts_version",
++ "min_client_release",
++ "mixed_version_window_hours"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "service": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$"
++ },
++ "release": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{7,40}$",
++ "description": "The deployed commit (short sha)."
++ },
++ "released_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "Commit time of the release."
++ },
++ "booted_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "contracts_version": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "openvibe-contracts version the service runs against."
++ },
++ "packages": {
++ "type": "object",
++ "description": "Versions of the platform packages the page loads (openvibe-shared, openvibe-sdk, ...).",
++ "additionalProperties": {
++ "type": "string"
++ }
++ },
++ "min_client_release": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Oldest client release still supported; null while every client in the window is."
++ },
++ "mixed_version_window_hours": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 360d6995..42a9c934 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -251,3 +251,35 @@ export interface ModuleRecord {
*/
updated_by?: string;
}
++
++/** [email protected] (owner: network) */
++/**
++ * What a running web surface is serving (GET /release.json, ADR-016). Open clients compare it on focus and reconnect; a client outside the supported window is prompted and reloads only when that is safe.
++ */
++export interface ReleaseManifest {
++ service: string;
++ /**
++ * The deployed commit (short sha).
++ */
++ release: string;
++ /**
++ * Commit time of the release.
++ */
++ released_at: string;
++ booted_at?: string;
++ /**
++ * openvibe-contracts version the service runs against.
++ */
++ contracts_version: string | null;
++ /**
++ * Versions of the platform packages the page loads (openvibe-shared, openvibe-sdk, ...).
++ */
++ packages?: {
++ [k: string]: string | undefined;
++ };
++ /**
++ * Oldest client release still supported; null while every client in the window is.
++ */
++ min_client_release: string | null;
++ mixed_version_window_hours: number;
++}
ddiff --git a/package.json b/package.json
iindex 0719350c..2736a95c 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.8.0",
++ "version": "0.9.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",