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

FieldTypeRequiredDescriptionConstraints
servicestringyes
  • pattern ^[a-z][a-z0-9-]{1,39}$
namespacestringyes<service>.<name>, e.g. live.site_settings or media.storage_tier.
  • pattern ^[a-z][a-z0-9-]{1,39}(\.[a-z0-9_-]+)+$
  • maxLength 120
revisionintegeryes
  • minimum 1
previous_revisioninteger | nullyesThe revision that was active when this one was proposed; null for the namespace's first.
  • minimum 1
stateenumyes
  • one of "proposed", "active", "superseded", "rejected", "rolled_back"
valuesobjectyesThe configuration, one member per key. A secret-class key's value is a redaction marker.
classificationobjectyesEvery key of values, classified. A key the service does not classify is internal.
checksumstringyessha256 (hex) of the canonical JSON of values as they appear in this snapshot (secrets as their markers).
  • pattern ^[0-9a-f]{64}$
created_atstringyes
  • format date-time
created_byidentity.subject-refyes
activated_atstring | nullWhen it became active; null while proposed, and for a rejected revision.
  • format date-time
activated_byone of
reasonstring | null
  • maxLength 500
errorstring | nullWhy it was rejected: the validation errors, or what activation reported. Never a secret value.
  • maxLength 2000
copied_frominteger | nullA rollback's source: the revision whose values this one copies.
  • minimum 1

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 }] }