Zooid DataView manifests
Zooid Suite 0 uses two DataView servers: Personal and Registry. They are separate from Zooid's four enclaves. The downloadable JSON manifest records each server's API surface, storage, Worker binding, runtime inputs, source revision, and implementation file hashes. Its structure is described by the JSON Schema.
Canonical manifest JSON: Open dataview-manifest.json. This is the complete JSON file consumed by the generator.
Complete manifest JSON
{
"$schema": "https://woven-docs-yl1.pages.dev/data/zooid-dataview-manifest.schema.json",
"format": "zooid-dataview-manifest",
"version": 1,
"title": "Zooid DataView workers",
"description": "The two active Zooid DataView Workers, Personal and Registry. Each entry pins the implementation modules and declares the Worker deployment contract consumed by zooid-dataview-gen.mjs.",
"views": [
{
"id": "personal",
"name": "Personal",
"source": {
"repository": "impl-zooid-personal",
"revision": "fac7c8eb4623767d9e977915e3959eb15a6db03c",
"files": [
{
"path": "index.js",
"sha256": "3ccf1f9edabb3acf2e6f030f6889f4a1ada81913d53a1daad17d3f423ebff5f3"
},
{
"path": "infra.json",
"sha256": "b4c88b4740757a0983433820d5d9fb9ce242d267a1c2b03eae50bdc2282cc430"
},
{
"path": "package.json",
"sha256": "339464c5522b38246cfb7a03c8d6e6d08d2e14a21f68e8edfc9f62b26f67281e"
}
],
"workerConfig": {
"path": "wrangler.toml",
"sha256": "b0ded35fe1925fbf2c3c72ab470940d2891feddd0ba04c5c920c7cfa2e1e4920"
}
},
"worker": {
"name": "enc-super-personal-dataview",
"entry": "index.js",
"compatibilityDate": "2024-12-01",
"durableObject": {
"binding": "DATAVIEW",
"class": "PersonalDataViewDO",
"object": "main",
"migration": {
"tag": "v1",
"newSqliteClasses": ["PersonalDataViewDO"]
}
},
"deployments": {
"production": {
"name": "enc-mvp-personal-dataview",
"durableObjectBinding": { "name": "DATAVIEW", "class": "PersonalDataViewDO" }
},
"staging": {
"name": "enc-mvp-staging-personal-dataview",
"durableObjectBinding": { "name": "DATAVIEW", "class": "PersonalDataViewDO" }
}
},
"dependencies": [
"@enc-protocol/core",
"@zooid/dataview-base"
]
},
"contract": {
"summary": "Per-account projection of Personal and Group log rows, with likes and flat comments for moments.",
"tables": ["public", "private", "notice", "social_likes", "social_comments"],
"routes": [
{ "method": "GET", "path": "/", "behavior": "base health response" },
{ "method": "GET", "path": "/tables", "behavior": "list configured tables" },
{ "method": "GET", "path": "/:table", "behavior": "query stored rows" },
{ "method": "POST", "path": "/push", "behavior": "ingest node Push events through the shared DataView base" },
{ "method": "POST", "path": "/like", "behavior": "toggle a moment like and return its count" },
{ "method": "POST", "path": "/comment", "behavior": "add a non-empty comment of at most 500 characters" },
{ "method": "GET", "path": "/comments", "behavior": "list comments for one moment, capped at 500" },
{ "method": "GET", "path": "/moment_meta", "behavior": "batch like, liked-by-me, and comment counts for at most 200 moments" }
],
"storage": [
{ "table": "social_likes", "key": ["moment_id", "from"] },
{ "table": "social_comments", "key": ["_id"], "index": ["moment_id", "_timestamp"] }
]
}
},
{
"id": "registry",
"name": "Registry",
"source": {
"repository": "impl-zooid-registry",
"revision": "0e026f544cdc7bd84eeb9928f034f7a49293faa1",
"files": [
{
"path": "index.js",
"sha256": "11e2113bf8007cb544bedaea2f1f61b5db42a42abc2fd56c0833fb2e021ce0b4"
},
{
"path": "dataview-do.js",
"sha256": "116bdb723a8d60d05e558aae1c3c73d7a8ef1cea7c7610f849e3dc6b79fe2f6d"
},
{
"path": "package.json",
"sha256": "d2c19a8a9bfd9f3bc7ad4cf4852d5c48f8548b2105cbd62178f9f2dcad9f1c45"
}
],
"workerConfig": {
"path": "wrangler.toml",
"sha256": "14b1fda2db54d5d6199218d2c70c11e40515d369ecce2c228b4f641ee9937d5b"
}
},
"worker": {
"name": "enc-registry",
"entry": "index.js",
"compatibilityDate": "2024-12-01",
"durableObject": {
"binding": "DATAVIEW",
"class": "RegistryDataViewDO",
"object": "main",
"migration": {
"tag": "v1",
"newSqliteClasses": ["RegistryDataViewDO"]
}
},
"deployments": {
"production": {
"name": "enc-mvp-registry-dataview",
"durableObjectBinding": { "name": "DATAVIEW", "class": "RegistryDataViewDO" }
},
"staging": {
"name": "enc-mvp-staging-registry-dataview",
"durableObjectBinding": { "name": "DATAVIEW", "class": "RegistryDataViewDO" }
}
},
"dependencies": [
"@enc-protocol/core",
"@zooid/dataview-base"
],
"environment": {
"required": ["REGISTRY_ENCLAVE", "PUSH_SEQUENCERS"],
"optional": ["ADMIN_TOKEN"]
}
},
"contract": {
"summary": "Public index of signed Registry identities, enclaves, and nodes, with verified Push ingestion and live subscriptions.",
"tables": ["identities", "enclaves", "nodes", "seq_marks"],
"routes": [
{ "method": "GET", "path": "/health", "behavior": "health response" },
{ "method": "GET", "path": "/identity/:id_pub", "behavior": "read a profile with its verified event" },
{ "method": "GET", "path": "/identities", "behavior": "list profiles or look up id_pub" },
{ "method": "GET", "path": "/reg_identities", "behavior": "SDK-shaped profile lookup alias" },
{ "method": "GET", "path": "/enclaves", "behavior": "list registered enclaves" },
{ "method": "GET", "path": "/enclaves/:enclave_id", "behavior": "read one registered enclave" },
{ "method": "GET", "path": "/reg_enclaves", "behavior": "SDK-shaped enclave lookup" },
{ "method": "GET", "path": "/nodes", "behavior": "list registered nodes" },
{ "method": "GET", "path": "/nodes/:seq_pub", "behavior": "read one registered node" },
{ "method": "GET", "path": "/reg_nodes", "behavior": "SDK-shaped node lookup" },
{ "method": "POST", "path": "/push", "behavior": "verify Push events and index only Registry rows" },
{ "method": "POST", "path": "/admin/rebuild", "behavior": "verify and monotonically rebuild the index from supplied events" },
{ "method": "DELETE", "path": "/identity/:id_pub", "behavior": "remove an indexed profile; preserve its sequence high-water mark" },
{ "method": "DELETE", "path": "/enclaves/:enclave_id", "behavior": "remove an indexed enclave" },
{ "method": "DELETE", "path": "/nodes/:seq_pub", "behavior": "remove an indexed node" }
],
"indexedEvents": ["reg_identity", "reg_enclave", "reg_node"],
"invariants": [
"A pushed event must verify under its signer and a configured Registry sequencer.",
"Only events for REGISTRY_ENCLAVE are indexed.",
"Identity, enclave, and node rows can be written only by their registered signer.",
"An indexed key advances only to a higher event sequence; seq_marks survive deletes.",
"An identity key-exchange version cannot decrease or change its subkey at the same version.",
"A scoped device certificate cannot publish an identity row."
]
}
}
]
}Personal
Personal projects rows from a person's Personal and Group logs. It exposes the shared DataView routes for health, tables, row reads, and node Push ingestion, plus the moment social routes:
| Route | Purpose |
|---|---|
POST /like | Toggle a moment like. |
POST /comment | Add a comment of at most 500 characters. |
GET /comments | List comments for a moment. |
GET /moment_meta | Read batched like and comment counts, including whether the caller liked each moment. |
The social tables are social_likes (keyed by moment and account) and social_comments (keyed by comment id and indexed by moment and timestamp).
Registry
Registry is the public directory for profiles, enclaves, and nodes. It accepts POST /push only after checking the event and trusted sequencer signatures, indexes only the configured Registry enclave's reg_identity, reg_enclave, and reg_node events, and serves public lookup routes. Updates must be newer than the stored sequence high-water mark; an identity's key version cannot decrease.
The Registry Worker requires REGISTRY_ENCLAVE and PUSH_SEQUENCERS to index Push events. ADMIN_TOKEN is optional for the local test Worker; a rebuild requires it to be configured and supplied.
The manifest also records the existing Wrangler production and staging Worker names for both servers. It pins the checked-in Wrangler configs by SHA-256 so a source configuration change cannot silently drift from the generated package.
Generation and regression tests
impl-zooid-native-test/tools/zooid-dataview-gen.mjs reads the JSON manifest, verifies each pinned source revision and implementation/configuration hash, copies the active DataView implementation modules byte-for-byte, and emits Wrangler Worker configuration from the manifest. Keeping the existing implementation modules unchanged preserves their current Zooid-specific behavior. The generated packages are exercised by the Tier 2/3 Zooid regression tests against local Wrangler Workers.
The generated-worker regression run passed on 2026-10-24:
| Regression tier | Passed | Failed / skipped / not run | Wall time |
|---|---|---|---|
| Tier 2 — one server | 160/160 | 0 | 119.7 s |
| Tier 3 — node and services | 26/26 | 0 | 9.6 s |
| Total | 186/186 | 0 | 129.3 s |
The available local regression inventory has 188 Tier 2/3 candidates; two refer to absent source files and were excluded. The shared test inventory was not changed. The run used Wrangler Workers on localhost and did not start an emulator service.
The generator does not change the Zooid node, ENC protocol, enclaves, or resolver. It packages the existing Personal and Registry implementations; app-specific server behavior remains in those pinned implementation modules.