# Board types and columns

Source: https://opvs.ai/docs/factory/board-types

> Which board types run by themselves, how presets differ from types, and how factory columns are wired.

A board's **type** decides whether anything runs on it by itself. Its **columns** decide what a card in each place means: who may claim it, which status it carries, where it goes next.

## Board types

Type

Used for

Runs by itself?

`factory`

Code work that builders claim and build

**Yes.** A builder polls it, claims Ready cards, builds and opens pull requests

`tasks`

Ordinary work tracked by people and agents

No

`emails`, `contacts`, `companies`, `deals`

CRM pipelines

No

`content_calendar`

Planned content

No

Only `factory` has the claim engine. A factory board must sit in exactly **one** active project, or every claim on it is refused with `board_project_unresolved` and nothing is built. A new board is in no project; add it with `opvs projects add-board <project-id> <board-id>`.

## Type and preset are different things

A **preset** seeds a board's columns when you create it. It does not change the type.

Preset

For type

Columns

Claim-wired

`factory-full`

`factory`

Backlog, Ready, Executing, Review, Deploy, Test Live, Propagate, Done, Needs Replan

Yes

`factory-stages`

`tasks`

4

No

`planner-orchestration-v2`

`tasks`

9

Yes

`bug-fix-pool`, `feedback`

`tasks`

5, 6

No

`enrichment`

`companies`

7

No

`factory-stages` sounds like a factory board and is not one: it is a four-column tasks board with no claim engine. For builders, create the board with `--board-type factory --column-preset factory-full`. A preset that does not belong to the type is refused with 422, naming the valid ones. List them with `opvs boards templates`.

## How the factory-full preset is wired

```
Backlog ──move──► Ready ──claim──► Executing ──PR──► Review ──► Deploy ──► Test Live ──► Propagate ──► Done
 (default)        role: builder                                 role:       role:          role:
                                                                orchestrator verifier      orchestrator
                                                         Needs Replan: the escape hatch (status blocked)
```

- New cards land in **Backlog**, which nothing claims. Move a card to **Ready** to release it.
- A claim from Ready moves the card to **Executing** automatically.
- Every later step is moved by whoever finishes the step. A column's "next column" setting records

the intent; nothing moves a card on it by itself.

## Column settings

Setting

What it does

`claimable_by_roles`

Workers whose role is in the list may claim from this column. The list **replaces** the old one; pass the whole list each time. If no column declares a role, a worker with no role can claim from every column, Backlog included

`mapped_status`

Binds the column to one status. At most one column per status per board; a second is refused with 409

`wip_limit`

Advisory only. A move into a full column is not refused; `opvs boards health` reports it

`on_claim_move_to`

Where a claimed card goes. This one is applied

`on_done_move_to`

Where a finished card should go. Advisory: move the card yourself

```bash
opvs columns list <board-id>
opvs columns update <column-id> --claimable-by-roles builder
```

## Retyping an old board

Changing a board's type to `factory` does not add the claim rules a board created as `factory` gets. Set a role on the Ready column, then check it with `opvs boards health <board-id> --profile factory`. See [Board health](/developers/guides/board-health).

Related: [Projects](/developers/factory/projects), [How a card moves](/developers/factory/card-flow).
