Store collections
Every document path in a Desk workspace's store, who writes it, and what it holds. Producers, people, the seed step and the prompt header each own their own paths.
A workspace’s store is the database of its published Desk artifact. Every path has exactly one kind of writer. The write contract refuses a producer write to a path people own.
Paths
| Path | Holds | Written by |
|---|---|---|
meta/workspace |
Name, producers, template, template version, lint result, createdAt, createdBy, schema |
Seed step |
meta/definition |
The compiled definition: producers, types, views, version hash | Seed step, or compile alone |
entities/<type>--<slug> |
One record, with every producer’s bySource slice and its sightings |
Producers |
runs/<runId> |
A run’s phases, counts, drops and settings used | Producers |
inbox/<runId>--<n> |
An Inbox message | Producers |
pending/<runId>--g<n> |
A gate waiting for a decision | Producers (create only) |
state/learning |
Learning tallies | Producers, via learn |
state/budget |
Runs counted against the daily cap | Producers, via lib/budget.py record |
state/health |
runAt, outcome, itemsHandled, alert, overrides |
Producers, with set |
state/verified |
Present once a person has accepted a run. Until then every run is report-only | A person’s word, written during deploy |
settings/<producerId> |
Setting values | People. Seed writes defaults once, only if absent |
settings/workspace |
Merge policy per type, notifications, quiet hours, learning |
People. Seed writes defaults once |
views/<id> |
A view | The agent creates it as proposed; people own every later edit |
columns/<id> |
An agent column | As views |
userstate/<entityId> |
A record’s star, notes and other per-record marks people set | People |
merges/<entityId> |
A hand merge | People |
decisions/<pendingId or inboxId> |
A person’s answer to a gate or message | People |
decisions/<entityId> |
{decision: "keep", at, by} |
People |
data/users/<viewer>/state/read/<inboxId> |
Read | That viewer |
data/users/<viewer>/state/done/<inboxId> |
Done | That viewer |
data/users/<viewer>/state/ack/<runId> |
Run acknowledged | That viewer |
The state/budget, state/health and state/verified paths come from the fixed prompt header (routineos.py prompt app-header), not from the write contract’s planner. A run writes state/budget and state/health directly. state/verified is written once, during deploy, on the person’s word, and never by a run.
data/users/<id>/ is private to that viewer, even from the owner. The page gets <id> from await user.id() with the user capability declared. A null id turns per-viewer state off; nothing moves to a shared path or to browser storage.
Hiring Signals after one run
After seeding and one run that found one company and two roles (see the Quickstart):
meta/workspace
meta/definition
settings/hiring-signals
settings/workspace
runs/2026-11-02-2200
entities/company--northwind-example
entities/role--https-jobs-example-au-1001
entities/role--https-jobs-example-au-1002
inbox/2026-11-02-2200--1
state/learning
state/learning is there once the run applies learning.json from its learn step.
state/budget and state/health follow once the run’s prompt steps write them.
Limits
25,000 documents per artifact and 256 KiB per document, per the registry, which also records a conflict with other published figures. See Storage.