ObjectZone zone.object-zone@1

Generated at from openvibe-contracts v0.97.0 and openvibe-sdk v0.26.0.

Version
1.0.0
Owner
zone
Visibility
public
Status
planned
Compatibility
backward
Decision
ADR-031
Schema
https://openvibe.network/contracts/zone/object-zone.v1.json

zone.object-zone@1 (PLANNED; ADR-031 amendment 2026-10-02): one named object zone, as OpenVibe.Zone's control API returns it (GET /api/v1/zones/{zone_id}, the list under /api/v1/projects/{project_id}/zones, and the 201 of a create). Zone owns this record: its name, environment, state, access policy and per-zone quota setting. Media owns everything inside it: the objects (ordinary med_ objects in the namespace media_namespace), their keys, bytes and replicas, quota enforcement, usage counting and the one deletion path. Zone never lists keys or holds bytes. The S3 bucket name is `name`, resolved within the project and environment of the access key that signs the request, at https://s3.openvibe.media/<name>/<key>. `ovrn` is ovrn:zone:<project_id>:object-zone/<id>, with the same project_id and id as this record. The id is never reused, and neither is a name: within one project environment a name belongs to one zone for ever, deleted or not, so a signed request names exactly one zone id. Name and env are immutable. Every environment has exactly one `default` zone, whose media_namespace is the environment root. Zone creates it with the environment, and it cannot be deleted on its own. Its access is per-object, and every other zone's is private. JSON Schema cannot compare fields: contracts.zones.checkObjectZone also requires that ovrn names this project_id and id, and that media_namespace is the environment root of project_id and env, followed by .<id> unless the zone is the default. More fields may be added.

Fields

FieldTypeRequiredDescriptionConstraints
idstringyes
  • pattern ^zon_[0-9A-HJKMNP-TV-Z]{26}$
ovrnstringyesThe resource name used in grants, audit, events, usage records and bills (ADR-034 section 2).
  • pattern ^ovrn:zone:prj_[0-9A-HJKMNP-TV-Z]{26}:object-zone/zon_[0-9A-HJKMNP-TV-Z]{26}$
project_idstringyes
  • pattern ^prj_[0-9A-HJKMNP-TV-Z]{26}$
envenumyesFixed at creation. A sandbox key never resolves a production zone.
  • one of "sandbox", "production"
namestringyesThe S3 bucket name. It is unique among all the zones of one project environment, deleted ones included: a deleted zone's name is retired, never given to another zone. It is valid as an S3 bucket name.
  • pattern ^[a-z0-9]+(-[a-z0-9]+)*$
  • minLength 3
  • maxLength 63
defaultbooleanyesThe environment's default zone, named `default`. Its media_namespace is the environment root.
descriptionstring | null
  • maxLength 200
accessenumyesprivate: every named zone in v1. Its objects never have a public_url and never enter a public cache. per-object: only the default zone, whose existing objects keep their own visibility (public, unlisted or private), public URLs and cached copies, as media.object@1 allows. The S3 surface never serves an object without a signature, in either kind of zone. Publication of a named zone would add a value in a later minor version.
  • one of "private", "per-object"
stateenumyesprovisioning: Media has not yet acknowledged the zone. active: it serves requests. deleting: requests answer NoSuchBucket while Media tombstones the objects and erases every copy. deleted: no object or copy remains. The record is kept, and its name stays retired.
  • one of "provisioning", "active", "deleting", "deleted"
media_namespacestringyesWhere Media keeps the zone's objects. It is the environment root for the default zone, and <root>.<id> for every other zone.
  • pattern ^app\.prj_[0-9A-HJKMNP-TV-Z]{26}(\.sandbox)?(\.zon_[0-9A-HJKMNP-TV-Z]{26})?$
quota_bytesinteger | nullyesAn optional byte ceiling for this zone. Media enforces it together with the project environment's byte quota, and a write over either is refused with QuotaExceeded. null means only the environment quota applies.
  • minimum 1
usageobjectA snapshot of the live objects, as Media reports it. Zone never counts. Billed usage comes from Media's hourly media.usage.recorded rollups, whose dimension is this id in lowercase.
  • no other fields
usage.stored_bytesintegeryes
  • minimum 0
usage.objectsintegeryes
  • minimum 0
usage.as_ofstringyes
  • format date-time
deletionobjectProgress of a zone deletion, as Media reports it.
  • no other fields
deletion.requested_atstringyes
  • format date-time
deletion.objects_remainingintegeryesObjects not yet tombstoned, plus tombstoned objects with a copy not yet confirmed erased.
  • minimum 0
deletion.held_objectsintegeryesObjects whose erasure waits for a retention hold (ADR-006). They are already unreadable.
  • minimum 0
deletion.completed_atstring | nullyes
  • format date-time
revisionintegeryesRaised by every change. Zone sends it when it provisions the change in Media, and Media applies only a higher revision.
  • minimum 1
created_atstringyes
  • format date-time
updated_atstring | null
  • format date-time

Examples

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

Valid: active-production
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "agent-artifacts",
  "default": false,
  "description": "Run outputs",
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": 5368709120,
  "usage": {
    "stored_bytes": 1048576,
    "objects": 12,
    "as_of": "2026-10-02T10:00:00Z"
  },
  "revision": 2,
  "created_at": "2026-10-02T09:00:00Z",
  "updated_at": "2026-10-02T09:30:00Z"
}
Valid: default-sandbox
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N2",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N2",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "sandbox",
  "name": "default",
  "default": true,
  "access": "per-object",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.sandbox",
  "quota_bytes": null,
  "revision": 1,
  "created_at": "2026-10-02T09:00:00Z"
}
Valid: deleted
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "old-backups",
  "default": false,
  "access": "private",
  "state": "deleted",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "deletion": {
    "requested_at": "2026-10-02T11:00:00Z",
    "objects_remaining": 0,
    "held_objects": 0,
    "completed_at": "2026-10-02T12:10:00Z"
  },
  "revision": 5,
  "created_at": "2026-10-01T09:00:00Z",
  "updated_at": "2026-10-02T12:10:00Z"
}
Valid: deleting-held
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "sandbox",
  "name": "scratch",
  "default": false,
  "access": "private",
  "state": "deleting",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.sandbox.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "deletion": {
    "requested_at": "2026-10-02T11:00:00Z",
    "objects_remaining": 3,
    "held_objects": 1,
    "completed_at": null
  },
  "revision": 4,
  "created_at": "2026-10-01T09:00:00Z",
  "updated_at": "2026-10-02T11:00:00Z"
}
Rejected: default-zone-private
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N2",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N2",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "sandbox",
  "name": "default",
  "default": true,
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.sandbox",
  "quota_bytes": null,
  "revision": 1,
  "created_at": "2026-10-02T09:00:00Z"
}
Rejected: deleted-with-copies-left
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "scratch",
  "default": false,
  "access": "private",
  "state": "deleted",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "deletion": {
    "requested_at": "2026-10-02T11:00:00Z",
    "objects_remaining": 2,
    "held_objects": 0,
    "completed_at": "2026-10-02T12:00:00Z"
  },
  "revision": 5,
  "created_at": "2026-10-02T09:00:00Z"
}
Rejected: deleting-without-progress
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "scratch",
  "default": false,
  "access": "private",
  "state": "deleting",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "revision": 3,
  "created_at": "2026-10-02T09:00:00Z"
}
Rejected: named-default-not-default
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "default",
  "default": false,
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "revision": 1,
  "created_at": "2026-10-02T09:00:00Z"
}
Rejected: named-zone-per-object
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "agent-artifacts",
  "default": false,
  "description": "Run outputs",
  "access": "per-object",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": 5368709120,
  "usage": {
    "stored_bytes": 1048576,
    "objects": 12,
    "as_of": "2026-10-02T10:00:00Z"
  },
  "revision": 2,
  "created_at": "2026-10-02T09:00:00Z",
  "updated_at": "2026-10-02T09:30:00Z"
}
Rejected: namespace-names-other-project
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "agent-artifacts",
  "default": false,
  "description": "Run outputs",
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y5.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": 5368709120,
  "usage": {
    "stored_bytes": 1048576,
    "objects": 12,
    "as_of": "2026-10-02T10:00:00Z"
  },
  "revision": 2,
  "created_at": "2026-10-02T09:00:00Z",
  "updated_at": "2026-10-02T09:30:00Z"
}
Rejected: namespace-names-other-zone
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "agent-artifacts",
  "default": false,
  "description": "Run outputs",
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N3",
  "quota_bytes": 5368709120,
  "usage": {
    "stored_bytes": 1048576,
    "objects": 12,
    "as_of": "2026-10-02T10:00:00Z"
  },
  "revision": 2,
  "created_at": "2026-10-02T09:00:00Z",
  "updated_at": "2026-10-02T09:30:00Z"
}
Rejected: ovrn-names-other-project
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y5:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "agent-artifacts",
  "default": false,
  "description": "Run outputs",
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": 5368709120,
  "usage": {
    "stored_bytes": 1048576,
    "objects": 12,
    "as_of": "2026-10-02T10:00:00Z"
  },
  "revision": 2,
  "created_at": "2026-10-02T09:00:00Z",
  "updated_at": "2026-10-02T09:30:00Z"
}
Rejected: ovrn-names-other-zone
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N3",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "agent-artifacts",
  "default": false,
  "description": "Run outputs",
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": 5368709120,
  "usage": {
    "stored_bytes": 1048576,
    "objects": 12,
    "as_of": "2026-10-02T10:00:00Z"
  },
  "revision": 2,
  "created_at": "2026-10-02T09:00:00Z",
  "updated_at": "2026-10-02T09:30:00Z"
}
Rejected: public-access
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "site-assets",
  "default": false,
  "access": "public",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "revision": 1,
  "created_at": "2026-10-02T09:00:00Z"
}
Rejected: sandbox-zone-in-production-namespace
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "sandbox",
  "name": "scratch",
  "default": false,
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "revision": 1,
  "created_at": "2026-10-02T09:00:00Z"
}
Rejected: uppercase-name
{
  "id": "zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "ovrn": "ovrn:zone:prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4:object-zone/zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "project_id": "prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4",
  "env": "production",
  "name": "Agent_Artifacts",
  "default": false,
  "access": "private",
  "state": "active",
  "media_namespace": "app.prj_01JZQ3V8X5N7K2M4P6R8T0W2Y4.zon_01K2A9C3D5E7F9G1H3J5K7M9N1",
  "quota_bytes": null,
  "revision": 1,
  "created_at": "2026-10-02T09:00:00Z"
}

Validate

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