ConfigSnapshot common.config-snapshot@1
Generated at from
openvibe-contracts v0.53.0 and
openvibe-sdk v0.11.0.
- Version
- 1.0.0
- Owner
- network
- Visibility
- public
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/common/config-snapshot.v1.json
One immutable revision of one service's configuration namespace (roadmap WS-C task 7; kept by openvibe-shared/config). A revision's values never change: revisions grow by one per namespace, and a rollback is a new revision that copies an older one's values. Only the state moves: proposed -> active -> superseded or rolled_back, or proposed -> rejected when validation or activation fails, in which case the previous active revision stays or is restored. A secret-class key's value never appears here: it is { redacted: true, fingerprint }, an HMAC-SHA256 of the value under a secret key the service keeps per namespace, so equal fingerprints within one namespace mean the value did not change, while the value cannot be recovered or guessed offline without that key. checksum is the sha256 of the canonical JSON (keys sorted, no whitespace) of values exactly as they appear here, secrets as their markers, so anyone can check it, and two snapshots of one namespace with the same checksum hold the same configuration.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
service | string | yes |
| |
namespace | string | yes | <service>.<name>, e.g. live.site_settings or media.storage_tier. |
|
revision | integer | yes |
| |
previous_revision | integer | null | yes | The revision that was active when this one was proposed; null for the namespace's first. |
|
state | enum | yes |
| |
values | object | yes | The configuration, one member per key. A secret-class key's value is a redaction marker. | |
classification | object | yes | Every key of values, classified. A key the service does not classify is internal. | |
checksum | string | yes | sha256 (hex) of the canonical JSON of values as they appear in this snapshot (secrets as their markers). |
|
created_at | string | yes |
| |
created_by | identity.subject-ref | yes | ||
activated_at | string | null | When it became active; null while proposed, and for a rejected revision. |
| |
activated_by | one of | |||
reason | string | null |
| ||
error | string | null | Why it was rejected: the validation errors, or what activation reported. Never a secret value. |
| |
copied_from | integer | null | A rollback's source: the revision whose values this one copies. |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: imported-first-revision
{
"service": "live",
"namespace": "live.site_settings",
"revision": 1,
"previous_revision": null,
"state": "superseded",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-20T09:00:00.000Z",
"created_by": {
"type": "service",
"id": "live"
},
"activated_at": "2026-09-20T09:00:00.000Z",
"reason": "imported from the legacy source"
}Valid: live-site-settings-active
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Valid: media-tiering-rejected
{
"service": "media",
"namespace": "media.storage_tier",
"revision": 4,
"previous_revision": 3,
"state": "rejected",
"values": {
"enabled": true,
"minAgeDays": 7,
"r2Enabled": true,
"r2MinViews": 0,
"r2MaxPerSweep": 5
},
"classification": {
"enabled": "internal",
"minAgeDays": "internal",
"r2Enabled": "internal",
"r2MinViews": "internal",
"r2MaxPerSweep": "internal"
},
"checksum": "99a04eacd9782e2154eaa457c24a0f39b54d2a032145298befaf0ba50d226682",
"created_at": "2026-09-25T19:40:00.000Z",
"created_by": {
"type": "service",
"id": "live"
},
"activated_at": null,
"reason": "Promote every VOD to R2",
"error": "onActivate: r2MinViews must be at least 1 while r2Enabled"
}Valid: network-rollback
{
"service": "network",
"namespace": "network.site_settings",
"revision": 7,
"previous_revision": 6,
"state": "active",
"values": {
"signup_enabled": true,
"support_email": "[email protected]",
"resend_api_key": {
"redacted": true,
"fingerprint": "ad8cf89568d4682f23abb9ae039530fece7b9505fdd62ae378621f1e7adbbca8"
}
},
"classification": {
"signup_enabled": "public",
"support_email": "public",
"resend_api_key": "secret"
},
"checksum": "ef5e60836ff9d9615bfa5d64a1a5a46f3b9afc8ae81de5c4c95ce2c7c367ece1",
"created_at": "2026-09-25T20:00:00.000Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T20:00:00.120Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "rollback to revision 5",
"copied_from": 5
}Valid: proposed
{
"service": "network",
"namespace": "network.site_settings",
"revision": 8,
"previous_revision": 7,
"state": "proposed",
"values": {
"signup_enabled": false,
"support_email": "[email protected]",
"resend_api_key": {
"redacted": true,
"fingerprint": "ad8cf89568d4682f23abb9ae039530fece7b9505fdd62ae378621f1e7adbbca8"
}
},
"classification": {
"signup_enabled": "public",
"support_email": "public",
"resend_api_key": "secret"
},
"checksum": "a0b6072a8d13c7361b74799474d69590083122c838073b8539a1077985d415ac",
"created_at": "2026-09-25T20:10:00.000Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": null,
"reason": "Close sign-ups for maintenance"
}Rejected: active-without-activated-at
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": null,
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: created-by-local-id
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "42"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: extra-field
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null,
"secret_values": {}
}Rejected: namespace-without-service
{
"service": "live",
"namespace": "site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: no-checksum
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: redaction-marker-with-value
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "6e113899a9774cd3fade15f437e2a20f85baa00ac45d8c1410cfcc5ca728f5dc",
"value": "AIza-example"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: rejected-without-error
{
"service": "media",
"namespace": "media.storage_tier",
"revision": 4,
"previous_revision": 3,
"state": "rejected",
"values": {
"enabled": true,
"minAgeDays": 7,
"r2Enabled": true,
"r2MinViews": 0,
"r2MaxPerSweep": 5
},
"classification": {
"enabled": "internal",
"minAgeDays": "internal",
"r2Enabled": "internal",
"r2MinViews": "internal",
"r2MaxPerSweep": "internal"
},
"checksum": "99a04eacd9782e2154eaa457c24a0f39b54d2a032145298befaf0ba50d226682",
"created_at": "2026-09-25T19:40:00.000Z",
"created_by": {
"type": "service",
"id": "live"
},
"activated_at": null,
"reason": "Promote every VOD to R2"
}Rejected: revision-zero
{
"service": "live",
"namespace": "live.site_settings",
"revision": 0,
"previous_revision": null,
"state": "superseded",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-20T09:00:00.000Z",
"created_by": {
"type": "service",
"id": "live"
},
"activated_at": "2026-09-20T09:00:00.000Z",
"reason": "imported from the legacy source"
}Rejected: secret-marker-bad-fingerprint
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "not-a-fingerprint"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: secret-marker-unkeyed-sha256
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"sha256": "e4c8b340d0125ce1b143ffcc44c002f854457ebfe0b8fa211f8fd284df92b5f0"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: secret-marker-without-fingerprint
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: unknown-classification
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "active",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "private",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Rejected: unknown-state
{
"service": "live",
"namespace": "live.site_settings",
"revision": 12,
"previous_revision": 11,
"state": "pending",
"values": {
"site_name": "OpenVibe.Live",
"registration_open": true,
"max_bitrate_kbps": 6000,
"youtube_api_key": {
"redacted": true,
"fingerprint": "c61d1b1293d59c54c56624f6d6161b8af976449db60f230ed977dcf3ba4bd31b"
},
"home_banner": {
"text": "Welcome",
"link": "/about"
}
},
"classification": {
"site_name": "public",
"registration_open": "public",
"max_bitrate_kbps": "internal",
"youtube_api_key": "secret",
"home_banner": "public"
},
"checksum": "29cd8cc21471b306491daa584d01892c05b41e5e51d5bf83aaf5fc6f4a28ca87",
"created_at": "2026-09-25T18:02:11.412Z",
"created_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"activated_at": "2026-09-25T18:02:11.530Z",
"activated_by": {
"type": "user",
"id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
},
"reason": "Raise the bitrate cap for the tournament",
"error": null,
"copied_from": null
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('common.config-snapshot@1', value); // { valid, errors: [{ path, message }] }