---
title: Store collections
description: 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.
sidebar:
  order: 5
---

A workspace's store is the database of its published Desk artifact. Every path has exactly one kind of writer. The [write contract](/reference/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](/introduction/quickstart#6-plan-a-runs-writes)):

```
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](/infrastructure/storage).

## Related

- [Write contract](/reference/write-contract)
- [Ownership](/concepts/ownership)
- [Store and write contract](/concepts/store-and-write-contract)
