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
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | string | yes |
| |
ovrn | string | yes | The resource name used in grants, audit, events, usage records and bills (ADR-034 section 2). |
|
project_id | string | yes |
| |
env | enum | yes | Fixed at creation. A sandbox key never resolves a production zone. |
|
name | string | yes | The 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. |
|
default | boolean | yes | The environment's default zone, named `default`. Its media_namespace is the environment root. | |
description | string | null |
| ||
access | enum | yes | private: 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. |
|
state | enum | yes | provisioning: 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. |
|
media_namespace | string | yes | Where Media keeps the zone's objects. It is the environment root for the default zone, and <root>.<id> for every other zone. |
|
quota_bytes | integer | null | yes | An 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. |
|
usage | object | A 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. |
| |
usage.stored_bytes | integer | yes |
| |
usage.objects | integer | yes |
| |
usage.as_of | string | yes |
| |
deletion | object | Progress of a zone deletion, as Media reports it. |
| |
deletion.requested_at | string | yes |
| |
deletion.objects_remaining | integer | yes | Objects not yet tombstoned, plus tombstoned objects with a copy not yet confirmed erased. |
|
deletion.held_objects | integer | yes | Objects whose erasure waits for a retention hold (ADR-006). They are already unreadable. |
|
deletion.completed_at | string | null | yes |
| |
revision | integer | yes | Raised by every change. Zone sends it when it provisions the change in Media, and Media applies only a higher revision. |
|
created_at | string | yes |
| |
updated_at | string | null |
|
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 }] }