HostReleasePublishedPayload host.release.published@1

Generated at from openvibe-contracts v0.76.0 and openvibe-sdk v0.20.1.

Version
1.0.0
Owner
host
Visibility
public
Status
active
Compatibility
backward
Decision
ADR-016
Schema
https://openvibe.network/contracts/events/payloads/host.release.published.v1.json

host.release.published v1 (roadmap WS-P task 9, ADR-016 amendment 1). A network service's release went live. OpenVibe.Host's operator plane (lib/announce.js) publishes it after `ovhost deploy|rollback <service>` went live and for `ovhost announce <service>` (services deployed by their own scripts: Live, Tools, Sites, OpenRe, Games). Envelope: subject { type: release, id: <service>:<release> }, visibility public (signed-out browsers get it over Events realtime), priority low, actor service:host. Open tabs whose /release.json names `service` (openvibe-shared release-watch 1.17.0, topics=host.release.published) check it when `release` is not the one they run. It carries identifiers only, never what changed. At most one per service and release unless an operator forces it; a retry reuses the event_id. Tenant sites' activations are host.deploy.activated, not this.

Fields

FieldTypeRequiredDescriptionConstraints
servicestringyesThe service id the pages' /release.json names (registry.release-manifest@1 `service`): live, tools, or a Sites placeholder's id such as news.
  • pattern ^[a-z][a-z0-9-]{1,39}$
releasestringyesThe release id that service's /release.json reports now (registry.release-manifest@1 `release`). A client compares it with the release it runs, treating a hex prefix of the other as the same release.
  • pattern ^[0-9a-f]{7,40}$
commitstring | nullyesThe deployed commit when it is known and `release` is its prefix, or what the operator passed; null otherwise (a Sites placeholder's release is a page hash).
  • pattern ^[0-9a-f]{7,40}$
originstring | nullyesThe public origin the release serves (https://openvibe.live): the inventory's origin or the service manifest's publicOrigin; null when neither is known.
  • pattern ^https?://[^/?#]+$
  • format uri
deployed_atstringyesWhen Host announced it (UTC); after `ovhost deploy`, just after the service answered ready.
  • format date-time
componentsobjectOptional. The component versions /release.json reported (registry.release-manifest 1.1.0 `components`, kind and version only).
rollbackconstPresent after `ovhost rollback`: the release is an older one.
  • = true

Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

Valid: live-release
{
  "service": "live",
  "release": "d4e849f2",
  "commit": "d4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9",
  "origin": "https://openvibe.live",
  "deployed_at": "2026-09-26T08:00:05.000Z",
  "components": {
    "shell": {
      "kind": "script",
      "version": "3f2a9c1b7d4e"
    },
    "server": {
      "kind": "server",
      "version": "a1b2c3d4e5f6"
    }
  }
}
Valid: rollback-no-origin
{
  "service": "tools",
  "release": "858845c0e1d2",
  "commit": "858845c0e1d2f3a4b5c6d7e8f9a0b1c2d3e4f5a6",
  "origin": null,
  "deployed_at": "2026-09-26T08:02:00.000Z",
  "rollback": true
}
Valid: sites-placeholder
{
  "service": "news",
  "release": "56eb30198d36",
  "commit": null,
  "origin": "https://openvibe.news",
  "deployed_at": "2026-09-26T08:01:00.000Z"
}
Rejected: a-tenant-activation
{
  "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "site_id": "site_01JAB2C3D4E5F6G7H8J9K0MNPR",
  "site": "my-site",
  "deploy_id": "dpl_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "previous_deploy_id": null,
  "rollback": false
}
Rejected: carries-a-tenant-field
{
  "service": "live",
  "release": "d4e849f2",
  "commit": null,
  "origin": "https://openvibe.live",
  "deployed_at": "2026-09-26T08:00:05.000Z",
  "site_id": "site_01JAB2C3D4E5F6G7H8J9K0MNPR"
}
Rejected: component-bad-kind
{
  "service": "live",
  "release": "d4e849f2",
  "commit": null,
  "origin": null,
  "deployed_at": "2026-09-26T08:00:05.000Z",
  "components": {
    "shell": {
      "kind": "binary",
      "version": "1"
    }
  }
}
Rejected: origin-with-path
{
  "service": "live",
  "release": "d4e849f2",
  "commit": null,
  "origin": "https://openvibe.live/updates",
  "deployed_at": "2026-09-26T08:00:05.000Z"
}
Rejected: release-not-hex
{
  "service": "live",
  "release": "v1.2.3",
  "commit": null,
  "origin": "https://openvibe.live",
  "deployed_at": "2026-09-26T08:00:05.000Z"
}
Rejected: release-rollback-false
{
  "service": "live",
  "release": "d4e849f2",
  "commit": null,
  "origin": null,
  "deployed_at": "2026-09-26T08:00:05.000Z",
  "rollback": false
}

Validate

const contracts = require('openvibe-contracts');
contracts.validate('host.release.published@1', value);   // { valid, errors: [{ path, message }] }