DWSD.md

Board DSL — Lanes

Lanes are the horizontal swimlanes a work item flows in. This page covers a lane’s fields, modifiers, and lane-local structure. See the reference index for the board header and the other constructs.

Lane fields (each entry of lanes)

A lane entry is either a bare string (a name-only named lane — - Thomas Krause) or an object with a name, an explicit type:, and modifiers.

FieldValues / shapeDefaultDiagnostic on misuse
namestring (required in object form)—board.invalid-lane (entry skipped when missing/empty)
typenamed | assignee | expeditenamedboard.unknown-lane-type (warning; defaults to named)
wipa number → binds BOTH min and max; OR [min, max](none)board.invalid-wip
status-categorysingle value, closed set to-do | in-progress | done | waiting | assess (lane tint)(none)board.invalid-status-category
tagsstring list (descriptive category chips, rendered visibly)(none)tolerant
agreementsstring OR string list — lane working agreements(none)tolerant
interactionsstring OR string list — lane meeting / interaction pointers(none)tolerant
columnslist of lane-local column entries(none)per-entry board.invalid-column
groupslist of lane-local group blocks(none)per-entry board.invalid-group

Lane type: is an explicit field. Default is named when absent; the other values are assignee and expedite. (There is no bare-vs-quoted convention — the type is always spelled out.)

Lane wip: differs from columns: a single number binds both wipMin and wipMax (wip: 3 → { wipMin: 3, wipMax: 3 }); a pair is a range.

A lane’s children are authored via separate columns: and groups: keys. The parser merges them into the lane’s single internal children array (columns first, then groups). A lane-local groups: block whose content is columns-only flattens into columns carrying a group: back-reference; a group that hosts nested lanes stays a first-class group.

Lane status-category: is a header tint. A lane’s status-category: value tints the lane header from the same closed 5-value palette as a column (the 5-color status palette above) — a colored header band, not a separate lozenge.

Example

A focused board exercising the lane fields — a bare named lane, an assignee lane with a single wip: (binds both min and max) and a header tint, and an expedite lane:

title: Team Board
columns:
  - ToDo
  - Doing
  - Done
lanes:
  - Alice
  - name: Bob
    type: assignee
    wip: 3
    status-category: in-progress
  - name: Hotfix
    type: expedite

Like what you see? → Start — build your own org folder in ~2 min

lanes.md
# Board DSL — Lanes
Lanes are the horizontal swimlanes a work item flows in. This page covers a
lane's fields, modifiers, and lane-local structure. See the
[reference index](./index.md) for the board header and the other constructs.
## Lane fields (each entry of `lanes`)
A lane entry is either a **bare string** (a name-only `named` lane — `- Thomas
Krause`) or an **object** with a `name`, an explicit `type:`, and modifiers.
| Field | Values / shape | Default | Diagnostic on misuse |
|-------|----------------|---------|----------------------|
| `name` | string (**required** in object form) | — | `board.invalid-lane` (entry skipped when missing/empty) |
| `type` | `named` \| `assignee` \| `expedite` | `named` | `board.unknown-lane-type` (warning; defaults to `named`) |
| `wip` | a number → binds BOTH min and max; OR `[min, max]` | (none) | `board.invalid-wip` |
| `status-category` | single value, closed set `to-do` \| `in-progress` \| `done` \| `waiting` \| `assess` (lane tint) | (none) | `board.invalid-status-category` |
| `tags` | string list (descriptive category chips, rendered visibly) | (none) | tolerant |
| `agreements` | string OR string list — lane working agreements | (none) | tolerant |
| `interactions` | string OR string list — lane meeting / interaction pointers | (none) | tolerant |
| `columns` | list of lane-local column entries | (none) | per-entry `board.invalid-column` |
| `groups` | list of lane-local group blocks | (none) | per-entry `board.invalid-group` |
**Lane `type:` is an explicit field.** Default is `named` when absent; the other
values are `assignee` and `expedite`. (There is no bare-vs-quoted convention —
the type is always spelled out.)
**Lane `wip:` differs from columns:** a single number binds **both** `wipMin`
and `wipMax` (`wip: 3` → `{ wipMin: 3, wipMax: 3 }`); a pair is a range.
**A lane's children are authored via separate `columns:` and `groups:` keys.**
The parser merges them into the lane's single internal `children` array
(columns first, then groups). A lane-local `groups:` block whose content is
columns-only flattens into columns carrying a `group:` back-reference; a group
that hosts nested lanes stays a first-class group.
**Lane `status-category:` is a header tint.** A lane's `status-category:` value
tints the **lane header** from the same closed 5-value palette as a column (the
[5-color status palette](./columns.md#status-tint) above) — a colored header band, not a
separate lozenge.
![Lane with children](../../images/lane.png)
![Lane status-category header tint](../../images/lane-tint.png)
## Example
A focused board exercising the lane fields — a bare `named` lane, an `assignee`
lane with a single `wip:` (binds both min and max) and a header tint, and an
`expedite` lane:
```dwsd-board
title: Team Board
columns:
- ToDo
- Doing
- Done
lanes:
- Alice
- name: Bob
type: assignee
wip: 3
status-category: in-progress
- name: Hotfix
type: expedite
```