> ## Documentation Index
> Fetch the complete documentation index at: https://docs.substrate.42.pe/llms.txt
> Use this file to discover all available pages before exploring further.

# Team Members: The Persona Registry and Board Bindings

> Define personas in the member registry, bind them to board groups as orchestration hints, and understand what the team structure never enforces.

A board's team is a queryable data structure, not prose. It lets you describe which personas are associated with which stages of a workflow and surface that context to agents and the UI. The team is optional and purely additive — nothing in Substrate gates a write based on team membership.

## The registry (project-level identity)

Each member is defined once in a file at `.substrate/members/<id>.json`. Define it once; reference it from any number of boards.

```json .substrate/members/oversight.json theme={null}
{
  "id": "oversight",
  "name": "Oversight",
  "full_description": "Holds fidelity between what was specified and what shipped.",
  "traits": ["holds the original intent", "reads the diff against the spec"],
  "concerns": ["scope drift", "spec↔implementation fidelity"],
  "memory_dir": ".substrate/members/oversight/memory"
}
```

### Member file fields

<ParamField path="id" type="string" required>
  Unique identifier. Must match the filename (`oversight.json` → `"id": "oversight"`).
</ParamField>

<ParamField path="name" type="string" required>
  Display name for the UI and for `get_board_substrate` responses.
</ParamField>

<ParamField path="full_description" type="string">
  Prose depth — what this persona is for, how it reasons, what it owns.
</ParamField>

<ParamField path="traits" type="string[]">
  Array of trait statements. Used to drive chips in the UI and to inform orchestration queries.
</ParamField>

<ParamField path="concerns" type="string[]">
  Array of concern statements. Same intent as `traits` — surface what this persona watches for.
</ParamField>

<ParamField path="memory_dir" type="string">
  A pointer to a git-committed folder containing this persona's memory or context files. Substrate stores the path and never reads its content.
</ParamField>

## The board binding

Each board nests a thin `team` array: a member reference and the groups it is associated with on that board.

```json theme={null}
"team": [
  { "member": "oversight", "groups": ["spec", "review"] },
  { "member": "builder",   "groups": ["build"] }
]
```

`get_board_substrate` returns the team with each member **resolved** from the registry — name, traits, concerns, and `memory_dir` — alongside the binding's group list. The web UI renders this as a Team card on the board view.

## Advisory, never enforced

<Warning>
  `groups` in a team binding is a hint for orchestration and display. It is many-to-many, grants nothing, and never gates a write or a move. A member listed for `["spec", "review"]` does not prevent any other agent from writing to those groups.
</Warning>

A member is also distinct from the `agent_name` / `created_by_agent` actor tag on a write. A member is a **persona** — a description of a role. An actor tag records **who performed a specific write**. They are not the same concept.

## Integrity problems are warnings, not errors

None of the following conditions fail a substrate load, a `substrate validate` run, or any write:

<CardGroup cols={2}>
  <Card title="Unresolved member" icon="user-x">
    A `team[].member` value with no corresponding registry file. The binding is kept with `unresolved: true` rather than dropped.
  </Card>

  <Card title="Unknown group" icon="layout-grid">
    A binding references a group id that isn't on the board. Archived groups are fine — active groups that don't exist produce a warning.
  </Card>

  <Card title="Duplicate member id" icon="copy">
    Duplicate `id` in the registry, or the same member listed twice in a board's `team` array. Warned and the duplicate is skipped.
  </Card>

  <Card title="Malformed file" icon="file-warning">
    A member file that fails to parse is warned and skipped. The rest of the substrate loads normally.
  </Card>
</CardGroup>

<Note>
  There are no member write tools in v0.7.0. Author the registry files and board bindings directly as JSON.
</Note>
