# Vocabulary

The nouns that show up on every surface, each pointed at its canonical TypeScript shape in `@arbe/core/schemas/` (`Arbe` prefix: `ArbeThread`, `ArbeStreamEntry<P>`). This page is the glossary and how the nouns relate; how each one is stored and synced is [storage](/system/storage/)'s job.

```
house
 ├─ members          an agent + role (owner | member)
 ├─ threads          each with one stream at arbe-thread-{id}
 │   └─ entries      chat | llm | signal payloads, authored by an agent
 ├─ environments
 ├─ configs
 └─ secrets · invites · api_keys
```

## Organization

*House* is the top-level container — it owns threads, members, and everything scoped beneath it; its creator becomes `owner`. *Agent* (`kind: human|bot`) is the identity/persona that can author entries — humans authenticate via OAuth, bots via API key. *Member* is an agent's role in a house — `owner` or `member` — inherited by every thread/environment/config under it. *Team* is a packaged house layout — JSON + markdown prompts in `packages/teams/<slug>/`.

## Data

*Row* = typed Postgres row in its own table. *Stream* = append-only JSON log outside Postgres ([durable streams](/system/durable-streams/), hosted by Electric). *Entry* = one append to a stream, `{ id, ts, authorId, seq, payload }`. `authorId` always points at an `agents` row — humans for their turns, bots for theirs. *Payload* = an entry's body; `ArbeThreadPayload` unions `ArbeChatPayload`, `ArbeLLMPayload`, and `ArbeSignalPayload` (signals typed `signal.<entity>.<verb>`). *Narrated entity* gets a primary thread + stream at creation and announces its lifecycle as `signal.<entity>.{created,renamed,deleted}` on it. Today only houses do this; agents and environments don't.

## Runtime

*Thread* is one `threads` row + one stream — where conversation and bot work entries land, observed through `arbe thread`; [threads](/system/threads/) covers parent, status, and env binding. *Pinned thread* = `name` + `pinnedAt`, a place you land in (house sidebar). *Tag* = a free-form label in `thread.tags`, a set over threads — pins are places, tags are sets. Thread agents (`/api/threads/:id/agents`) are the house's agents viewed with thread-specific dispatch config; there is no per-thread agent table. *Environment* binds sandbox + repo policy + secrets at house scope; dispatch resolves it and snapshots config onto the thread. *Sandbox* is a remote daytona machine + working tree; local is not a sandbox. *Workflow* is a recipe — an agent plus ordered steps, a house-owned row with an optional cron `schedule`; each *run* of it is a fresh thread ([workflows](/workflows/)).

## Planning

*Task* is durable planned work — `.arbe/tasks/` markdown committed alongside code, the one concept that's repo-native rather than substrate-stored. Statuses: `open`, `in_progress`, `blocked`, `closed`, `deferred` (only `closed` is treated as terminal in readiness checks). `@arbe/task` owns CRUD, dep cycle detection, ready/blocked computation.

See [threads](/system/threads/), [system/streams](/system/streams/), [system/permissions](/system/permissions/), [system/storage](/system/storage/), [system/durable-streams](/system/durable-streams/), [teams](/teams/).
