IDs and Ownership
Evolutionary Neural Memory (ENM) is the next-generation database Actor at the core of Pod-OS. Each Evolutionary Neural Memory Actor is its own, stand-alone, instance. Nothing is shared between ENM instances the way tables are shared inside a single SQL server.
That isolation is powerful, but it creates two questions we need to understand:
- How do I name things so I can find them again? (IDs)
- Who created or owns a piece of data? (Ownership)
This page explains both, in plain language.
Two Different Kinds of Identity
Pod-OS uses two identity layers. They answer different questions and must not be confused.
| Layer | What it identifies | Example | Changes when… |
|---|---|---|---|
| Connection identity | The client currently talking on the network | my-app-7f3a@zeroth.pod-os.com |
Each new TCP connection (or each new SDK session) may get a new name |
| Data ownership | Who created or is responsible for an Event Object | user:acme.com:alice |
Never, unless you deliberately rename a principal |
When you deploy an Actor through the dashboard, log in, or manage data with an SDK, ownership is what records who did it. Your login maps to a stable account ID like user:your-domain.com:yourname. That ID is stored on each Event Object you create.
The connection name (ClientName / From address) is only for routing messages on the wire. A sensor or mobile app may reconnect with a different connection name every time — that is normal. Ownership should always use a durable principal ID, not the connection name.
Event Object IDs: Two Forms
Every Event Object in an ENM has:
Unique ID — your stable name
A Unique ID is a string you choose (or your application chooses) before the data is stored. You use it to find the same record again later, link to it, and update it.
Examples:
| What | Example Unique ID |
|---|---|
| Your user account | user:acme.com:alice |
| A gateway in the registry | acme.com:zeroth:zeroth |
| An actor in the registry | acme.com:zeroth:my-kb |
| A document in your ENM | article:quarterly-report-2025 |
| A sensor | device:acme.com:warehouse-temp-07 |
Unique IDs are defined by you. Prefer them in application code and in the dashboard.
Event ID — assigned at storage time
When an Event Object is first stored, the ENM also assigns an internal Event ID derived from timestamp and location (for example +1783092980.946966…TERRA47.614…-122.335…). You rarely set this yourself; however, setting it yourself defines a powerful context tool for you.
The Event ID primitive enables powerful and novel retrieval capabilities. Succinctly, the Event ID allows you to search and collect events using time and/or location. The use of time and location is one key method of collecting context (we support multiple implicit and explicit contextual relations) without explicitly defining relationships. Imagine you manage a network of manufacturing sensors across large area. Sensor events are hierarchically aggregated in a network of ENM instances.
For day-to-day work: use Unique ID. Treat Event ID as an internal address the system gives you back in responses.
Ownership: Who Created or Owns the Data?
Every Event Object carries an owner — the entity responsible for creating it. Ownership answers who, not what.
There are two wire fields (you set one or the other):
owner— references an internal Event ID, or the special platform value$sysowner_unique_id— references another Event Object by Unique ID
Three classes of owner
In practice, ownership falls into three classes:
1. Platform (Class 1) — $sys
Used for bootstrap data, system configuration, and first-time creation of a record when no user context exists yet. The platform administrator is represented by $sys. It always resolves inside every database.
2. User-driven (Class 2) — user:<domain>:<username>
Used when a person (or their account) initiates an action: deploying an Actor, updating registry tags, adding data through the dashboard, changing roles, and so on.
Your dashboard login resolves to a Unique ID like user:acme.com:alice. That ID is your canonical account record in the Account Actor (account@zeroth.<platform-domain>).
3. Experiential / locational (Class 3) — another Event Object in the same database
Used when data logically belongs to something already in the graph:
- A sensor reading owned by the sensor's Event Object (
device:…) - A link owned by its source entity
- A payload update owned by the target event itself (self-ownership)
This is the natural model for IoT, provenance chains, and graph-native data.
Service and device principals
For long-running services and hardware, Pod-OS reserves typed prefixes:
| Prefix | Meaning | Example |
|---|---|---|
user: |
Human account | user:acme.com:alice |
service: |
Software service | service:acme.com:ingest-pipeline |
device: |
Sensor, gateway, or edge device | device:acme.com:temp-sensor-07 |
Use a stable service: or device: Unique ID as the owner when writing from SDKs or edge clients, even if the network connection rotates.
The Golden Rule: Owners Must Be Local
Because each Actor has its own database, an owner reference must point to an Event Object that exists in the same database as the data being written.
There are no cross-database foreign keys. If you store an actor registration in actor_registry@zeroth and set owner_unique_id=user:acme.com:alice, the ENM must be able to find user:acme.com:alice inside actor_registry — not just in the Account Actor.
Your canonical user record always lives in Account. Other databases learn about you through an owner reference record: a lightweight Event Object with the same Unique ID (user:acme.com:alice), type owner reference record, and tags pointing back to Account (memory_of_record=account@zeroth…).
The Pod-OS dashboard materializes these reference records automatically when you deploy gateways, add actors, ingest data, or perform other writes — so ownership resolves correctly without manual setup.
Account Actor (canonical) actor_registry ENM (local copy)
┌─────────────────────────┐ ┌─────────────────────────────┐
│ user:acme.com:alice │ │ user:acme.com:alice │
│ (full profile, roles) │ ─────► │ (owner reference record) │
└─────────────────────────┘ └─────────────────────────────┘
│
▼
acme.com:zeroth:my-enm
owner_unique_id=user:acme.com:alice ✓
If the local reference is missing, updates that attach tags or payload to an existing Event Object (for example marking an actor status=deployed) will fail with an error like Missing owner ID in tag_store_batch.
Common Unique ID Formats (Platform Services)
These formats appear across the Pod-OS platform. You do not need to memorize them all — but recognizing the pattern helps when reading logs or the registry.
| Service | Address | Unique ID pattern |
|---|---|---|
| Account | account@zeroth.<domain> |
user:<domain>:<username> |
| Actor registry | actor_registry@zeroth.<domain> |
<domain>:<gateway>:<actor> |
| Compute config | compute@zeroth.<domain> |
compute:actor:<actor>@<gateway> |
| Your ENM | <actor>@<gateway>.<domain> |
Any string you define |
Gateway registry entries use <domain>:<gateway>:<gateway> (gateway name repeated). Actor entries use <domain>:<gateway>:<actor>.
Create vs Update: Different Owner Rules
Ownership rules depend on the operation:
| Operation | Purpose | Owner rule |
|---|---|---|
| StoreEvent (create) | First write of a new Unique ID | owner=$sys or owner_unique_id=<principal> is allowed |
| StoreBatchTags / StoreData (update) | Tags or payload on an existing event | Owner must be a real, local Event Object — $sys is not allowed as owner |
| StoreBatchLinks (link) | Connect two existing events | Link owner must resolve locally (often the source endpoint) |
That is why actor deployment succeeds in two steps: first the registry creates the actor event (with $sys), then it updates tags (with your user as owner). The dashboard ensures your user reference exists locally before the update.
What You Should Do in Practice
Dashboard users
- Your ownership is handled automatically from your login session.
- Deploy actors, add data, and manage accounts without setting owner fields manually.
- If you see an ownership error during deployment, it usually means a local owner reference was not created yet — retry after gateway init completes, or contact support if it persists.
SDK and integration developers
- Pick stable Unique IDs for entities you create (
article:…,device:…,user:…). - Set
owner_unique_idto a durable principal (user:,service:, ordevice:) on creates — not to the connection client name. - On updates (tags, payload, links), ensure the owner Unique ID already exists in the target ENM, or materialize an owner reference record first.
- Use self-ownership when updating an event's own payload: set
owner_unique_idequal to the target event's Unique ID. - Use endpoint ownership for links: own the link with the source entity's Unique ID (the
unique_id_aendpoint).
IoT and edge devices
- Register each device once with a Unique ID like
device:your-domain.com:sensor-12. - Use that same ID as
owner_unique_idon every reading you store. - Connection identity may change on every reconnect; device ownership must not.
Lifecycle and Account Changes
When the platform materializes your user into a new database, it records a materialized_in tag on your account event. That ledger drives operations like disabling an account across every database where your reference exists — without blindly scanning the entire platform.
If you rename or deprovision principals in custom integrations, plan to update or mark reference records in each ENM that holds them.
Quick Reference
| Concept | Remember |
|---|---|
| Unique ID | Your stable name for an event — use this in code |
| Event ID | System-assigned at storage — use for time/location queries |
| Connection identity | Ephemeral network client name — not ownership |
$sys |
Platform owner — valid on create, not on tag/payload update |
user:domain:name |
Human account — canonical record in Account Actor |
| Owner reference | Local copy of a principal so ownership resolves in each ENM |
| Golden rule | Owner must exist in the same database as the data |
Previous: How do I structure data in my ENM? — entities, tags, and relationships.
Next: How do I query data in my ENM? — retrieving and traversing your graph.