Workboard Plugin: Kanban Board for Agent Cards and Session Handoff
This page explains the optional Workboard plugin for OpenClaw Gateway, which adds a Kanban-style board to the Control UI for managing agent-owned cards and session handoffs. It is intended for operators who need a lightweight local task board without replacing full project management tools.
Read this when
- You want a Kanban-style workboard in the Control UI
- You are enabling or disabling the bundled Workboard plugin
- You want to track planned agent work without an external project manager
The Workboard plugin introduces an optional Kanban-style board to the Control UI, featuring agent-sized work cards, agent assignment capabilities, and a return link to the card's associated task, run, and dashboard session.
Workboard keeps its scope deliberately narrow: it monitors local operational work for a single OpenClaw Gateway. It does not substitute for GitHub Issues, Linear, Jira, or other team project management systems.
Enable it
Workboard ships with the product but starts disabled:
- Navigate to Plugins in the Control UI, or access
/settings/pluginsrelative to your configured Control UI base path. With a base path of/openclaw, the address becomes/openclaw/settings/plugins. - Locate Workboard and click Enable. Since Workboard ships with OpenClaw, no Install action is required.
- If the interface indicates a restart is necessary, restart the Gateway.
After the plugin runtime loads, the Workboard tab becomes visible in the dashboard navigation. While disabled, the tab remains absent from the navigation. Opening the /workboard route directly when the plugin is disabled or restricted by plugins.allow/plugins.deny displays a plugin-unavailable message instead of card data.
The equivalent CLI procedure is:
openclaw plugins enable workboard
openclaw gateway restart
openclaw dashboard
Configuration
Workboard requires no plugin-specific configuration. Use the standard plugin entry to enable or disable it:
{
plugins: {
entries: {
workboard: {
enabled: true,
config: {},
},
},
},
}
openclaw plugins disable workboard
openclaw gateway restart
Card fields
| Field | Values |
|---|---|
status | triage, backlog, todo, scheduled, ready, running, review, blocked, done |
priority | low, normal, high, urgent |
labels | free-form strings |
agentId | optional assigned agent |
| linked refs | optional task, run, session, or source URL |
execution | optional metadata for a Codex/Claude run started from the card (engine, mode, model, session, run id, status) |
Cards also carry compact metadata for attempts, comments, links, proof, artifacts, automation settings, attachments, worker logs, worker protocol state, claims, diagnostics, notifications, template id, archive state, and stale-session detection, plus a recent-events list (created, edited, moved, linked, specified, decomposed, claimed, heartbeat, execution_updated, attempt_started, attempt_updated, comment_added, link_added, proof_added, artifact_added, attachment_added, diagnostic, notification, dispatch, orchestration, protocol_violation, archived, unarchived, stale). This metadata lets an operator see how a card moved through the board without opening the linked session; it is local operating context, not a replacement for session transcripts or GitHub issue history.
A single Workboard card contract is shared between the plugin and Control UI. Dashboard refreshes therefore preserve workspace provenance and authority, claim state, diagnostic actions, and notification sequence numbers instead of projecting a smaller UI-only copy of the card. Unknown diagnostic kinds, diagnostic severities, and notification kinds are ignored until both surfaces support them; they are never rewritten into another valid state.
The open dashboard receives updates through plugin.workboard.changed invalidations. Each event contains only a store epoch and revision; the UI then rereads canonical cards via the standard operator.read RPC. Multiple revisions merge into a single follow-up read. Workboard postpones that read while a card is being dragged, edited, or written, then resumes after the local interaction completes. A reconnect always triggers a full canonical reload. No routine full-card polling occurs, and Refresh remains available as a manual recovery option.
When multiple boards exist, a Board filter appears in the toolbar. This filter relies on stored board metadata, not just the currently displayed cards. Consequently, empty and archived boards stay available for selection. Cards that lack an explicit board identifier belong to the default default board. Every board has a dedicated /workboard/<boardId> page that can be bookmarked, shared, or added to the sidebar. The older /workboard?board=<boardId> form is still functional as a compatibility alias and redirects to that page while keeping other query parameters intact. Selecting All boards returns the view to /workboard.
Card data lives in the plugin's own Gateway state and travels along with the rest of that Gateway's OpenClaw state (refer to Storage).
Starting work from a card
Unlinked cards can begin work immediately:
- Run Codex / Run Claude launches a task-tracked agent run using a specific engine, transmits the card prompt, and sets the card to
running. Codex runs employopenai/gpt-5.6-sol; Claude runs employanthropic/claude-sonnet-4-6. - Open Codex / Open Claude opens a linked dashboard session without transmitting the card prompt or changing the card's status, intended for manual work that remains connected to the board.
Autonomous starts go through the Gateway's task-tracked agent run path (the default agent and model apply unless Codex or Claude is explicitly chosen). Workboard then attaches the resulting task, run id, and session key back to the card. Each linked execution also logs an attempt summary that includes engine, mode, model, run id, timestamps, status, and a rolling failure count, so repeated failures remain visible.
The dashboard refreshes task status by consulting the Gateway task ledger, matching tasks to cards using task id, run id, or linked session key. A queued or running task keeps the card's lifecycle active. A finished, failed, timed-out, or cancelled task moves the card toward review or blocked using the same sync rule applied to linked sessions (see Session lifecycle sync).
Agent tools
| Tool | Purpose |
|---|---|
workboard_list | Display compact cards showing claim and diagnostic state; optional board filter. |
workboard_read | Retrieve a single card along with bounded worker context: notes, attempts, comments, links, proof, artifacts, parent results, recent assignee work, and active diagnostics. |
workboard_create | Create a card with optional parents, tenant, skills, board, workspace metadata, idempotency key, runtime limit, and retry budget. |
workboard_link | Connect a parent card to a child card. Children remain todo until every parent reaches done, at which point dispatch promotion moves them to ready. |
workboard_claim | Assign a card to the calling agent; transitions backlog/todo/ready into running. |
workboard_heartbeat | Update the claim heartbeat during an extended run. |
workboard_release | Drop the claim after finishing, pausing, or handing off; can advance the card to a subsequent status. |
workboard_complete / workboard_block | Structured lifecycle tools for final summaries, proof, artifacts, and created-card manifests (must reference cards linked back to the completed card) or blocker reasons. |
workboard_attachment_add / workboard_attachment_read / workboard_attachment_delete | Store small card attachments in the plugin's SQLite state, indexed on the card, and exposed in the worker context. |
workboard_worker_log / workboard_protocol_violation | Record worker log lines and block a card when an automated worker stops without calling workboard_complete/workboard_block. |
workboard_board_create / workboard_board_archive / workboard_board_delete | Manage stored board metadata: display name, description, archive state, and default workspace. |
workboard_runs | Return the stored run-attempt history for a card. |
workboard_specify | Convert a rough triage or backlog card into a clarified todo card; stores the spec summary on the card. |
workboard_decompose | Expand a parent orchestration card into linked children, inheriting board and tenant metadata; can complete the parent with a created-card manifest. |
workboard_notify_subscribe / workboard_notify_list / workboard_notify_events / workboard_notify_advance / workboard_notify_unsubscribe | Manage notification subscriptions. Event reads are replay-safe; advance advances the durable cursor so callers resume without losing or double-reading completed, failed, or stale card events. |
workboard_boards / workboard_stats | Inspect board namespaces and queue statistics. |
workboard_promote / workboard_reassign / workboard_reclaim | Recover or hand off stuck work. |
workboard_comment / workboard_proof | Add handoff notes or attach proof and artifact references. |
workboard_unblock | Return blocked work to todo. |
workboard_move | Transition a card to a different status; claimed cards require the caller's agent claim scope. |
workboard_dispatch | Trigger dependency promotion or stale-claim cleanup without starting workers; worker launch uses Gateway or slash-command dispatch. |
Proof statuses reflect what workers report, not verified outcomes. A passed entry indicates the worker reported its command or check succeeded; consumers needing an independent quality gate should examine the attached command, URL, or artifact and run their own verifier. workboard_proof returns the new record's proofId. When workboard_complete reports that same proof's terminal status, pass proofId so the pending record resolves in place without losing its identity or timestamp. A proof already holding the same terminal status is reused unchanged. Completion proof without proofId stays append-only, so a later retry cannot overwrite older history just because its command or note is identical.
Claimed cards block agent-tool mutations from other agents unless the caller possesses the claim token returned by workboard_claim. Every card returned by an agent tool or Gateway RPC call redacts metadata.claim.token to [redacted] (the token itself appears once, top-level, only from workboard_claim), so dashboard operators and other agents can inspect claim state without ever seeing a usable token. Recovery goes through workboard_promote/workboard_reassign/workboard_reclaim, which do not require the token.
Dispatch
Dispatch operates within the Gateway only; it does not launch arbitrary OS processes. Normal OpenClaw subagent sessions still own execution. One dispatch pass:
- Promotes cards whose dependencies are ready.
- Records dispatch metadata on ready cards.
- Blocks expired claims or timed-out runs.
- Marks board-configured triage cards as orchestration candidates.
- Claims a small batch of ready cards and starts worker runs through the Gateway subagent runtime.
Workers receive bounded card context plus the claim token needed to heartbeat, complete, or block the card through the Workboard tools.
Workspace paths follow the caller's existing filesystem authority. Gateway clients with operator.write can use configured agent workspaces; operator.admin clients can use other host checkouts. Sandboxed agent tools use their sandbox workspace access, while unsandboxed workspace-only tools use their configured workspace root. Workboard records that authority when a workspace is assigned and intersects it with the current caller's authority again at dispatch, so a persisted card cannot widen a later caller's access. Older cards with an explicit host workspace but no recorded authority must have that workspace re-saved before a full-host dispatch; cards without a host path adopt the current caller's authority when first dispatched.
Workspace-bound dispatch accepts a directory or Git checkout only when its repository root exactly matches the target agent workspace. A worktree request is narrowed to that directory and persisted as a directory workspace, so the host does not materialize the checkout or execute repository setup code. The target worker must use a writable, non-shared Docker sandbox for that exact workspace, without elevated execution, persisted host/node exec overrides, or unclassified plugin and MCP tools. Workboard enumerates its registered tools instead of trusting a workboard_* prefix, and dispatch refuses a hot Docker container whose live mount/config hash is stale. Dispatch reports the incompatible target policy instead of starting a less-confined worker. Full-host dispatch may target other local checkouts and keeps normal managed-worktree setup.
Workspace authority does not create a second card-lifecycle permission model. Callers that may mutate Workboard cards can manually move them through the same statuses on every surface; read-only workspace access only prevents worker dispatch that needs writes.
Worker selection
Each pass starts at most 3 workers by default. Ready cards are ordered by priority, then position, then creation time. A pass starts only one card per owner/agent and skips owners that already have running or review work on the board. Archived cards, cards with an active claim, and cards not in ready status are never selected for worker starts (they can still be affected by the data side of dispatch: stale-claim cleanup, dependency promotion, timeout cleanup).
Session keys are deterministic per board/card, so repeated dispatches route back to the same worker lane instead of creating unrelated sessions:
- Assigned cards:
agent:<agentId>:subagent:workboard-<boardId>-<cardId> - Unassigned cards:
subagent:workboard-<boardId>-<cardId>(Gateway resolves the configured default agent)
If a worker cannot be started after a card is claimed, Workboard blocks the card, clears the claim, records the run-start failure, and appends a worker log line - visible in the dashboard, CLI JSON, agent tools, and card diagnostics.
Entry points
- Dashboard dispatch action
openclaw workboard dispatch/workboard dispatchon a command-capable channel
All three use the Gateway subagent runtime when the Gateway is available. The CLI has one operator fallback: if the Gateway call fails with a connection/unavailable error (or an unknown method error for older Gateways), and no explicit --url/--token target and no configured remote Gateway (OPENCLAW_GATEWAY_URL or gateway.mode: remote) apply, the CLI runs data-only dispatch against local SQLite state - it can promote dependencies, clean stale claims, and block timed-out runs, but cannot start workers. Auth, permission, and validation failures from a reachable Gateway are not treated as unavailable; they surface as command errors, and so does any Gateway failure when an explicit --url/--token target was given.
Board metadata can set autoDecompose, autoDecomposePerDispatch, defaultAssignee, and orchestratorProfile. OpenClaw records this intent and exposes it in worker context; actual specification/decomposition still runs through the normal Workboard tools.
CLI and slash command
openclaw workboard list [--board <id>] [--status <status>] [--include-archived] [--json]
openclaw workboard create "Fix stale card lifecycle" --priority high --labels bug,workboard
openclaw workboard show <card-id> [--json]
openclaw workboard move <card-id> --status <status> [--json]
openclaw workboard dispatch [--board <id>] [--json]
list text output hides archived cards by default (--include-archived overrides); --json always includes archived cards, matching the full-card contract used by existing scripts. show and move accept an unambiguous id prefix. list, create, show, and move always read/write local plugin state directly. Only dispatch calls the running Gateway, with the fallback described above.
See Workboard CLI for full flags, JSON output, Gateway fallback behavior, id-prefix handling, dispatch selection rules, and troubleshooting.
/workboard list, /workboard show <card-id>, /workboard create <title>, /workboard move <card-id> --status <status>, and /workboard dispatch mirror the CLI. List and show are read operations for any authorized command sender. Create, move, and dispatch require owner status on chat surfaces, or a Gateway client with operator.write/operator.admin. Manual operator moves use the same claim-override behavior as dashboard drag-and-drop. Their worktree access still follows the same workspace boundary described above.
Session lifecycle sync
Cards can link to an existing dashboard session, or one created when you start work from the card. Linked cards show the session lifecycle inline: running, stale, linked idle, done, failed, or missing. You can also capture an existing session from the Sessions tab with Add to Workboard; the card links to that session, uses the session label or recent user prompt as title, and seeds notes from the recent user prompt plus the latest assistant response when available.
If the linked session goes missing, the card stays linked for context and still offers start controls to restart into a fresh session. If an active linked session stops reporting recent activity, Workboard marks the card stale and stores that as metadata until the lifecycle clears it.
While a card is in an active work state, Workboard follows the linked session:
| Linked session state | Card status |
|---|---|
| active | running |
| completed | review |
| failed, killed, timed out, or aborted | blocked |
Manual review states win. When a card is placed into review, blocked, or done, its auto-sync pauses until you return it to todo or running.
Launching a card uses standard Gateway sessions. The Workboard plugin only keeps card metadata and its links. The regular session system retains ownership of the conversation transcript, model selection, and run lifecycle. To abort an active run on a linked card, press Stop. Workboard then marks that card as blocked so it remains visible for later review.
Cards can be created from Workboard templates (bugfix, docs, release, pr_review, plugin). These templates prepopulate the title, notes, labels, and priority. The template identifier is stored as card metadata.
Dashboard workflow
- Navigate to the Workboard tab inside the Control UI.
- Build a card by providing a title, notes, priority, labels, and optionally an agent and linked session. Alternatively, open Sessions and select Add to Workboard for a session that already exists.
- Drag the card between columns, or focus its compact status control and use either the menu or ArrowLeft/ArrowRight. While dragging, the source card dims and every valid drop column gets an outline.
- Start work from the card to either create a new dashboard session or reuse an existing one.
- While the agent runs, open the linked session from the card.
- Let lifecycle sync move the running work into
review/blocked, then manually transfer the card todoneonce it is accepted.
Session-board widgets
Two native widgets for session dashboards ship with Workboard (see Dashboards). The agent pins them using its dashboard tool via content: { kind: "plugin", pluginKind, props }. They render as first-party UI with live data, no sandbox frame or capability grant required:
workboard:cardcombined withprops: { cardId }displays a single card along with its status control, priority, and assigned agent.workboard:miniwith optionalprops: { boardId, limit }shows per-status counts, the top ready and running cards, and a link to the full board page. WithoutboardIdit aggregates every board; withboardIdit restricts the view to that specific board. Cards created without an explicit board id live ondefault.
Diagnostics
Diagnostics derive from local card metadata. Built-in checks flag the following:
| Kind | Condition |
|---|---|
stranded_ready | A card assigned to todo/backlog/ready has not been updated for over 1 hour. |
running_without_heartbeat | A running card shows no claim heartbeat or execution update in more than 20 minutes. |
blocked_too_long | A blocked card has not been updated in over 24 hours. |
repeated_failures | The card's tracked failure count reaches 2 or more. |
missing_proof | A done card has no proof, artifacts, or attachments. |
orphaned_session | A running card contains a sessionKey but is missing execution metadata. |
Permissions
Gateway RPC methods are organized under workboard.*:
| Scope | Methods |
|---|---|
operator.read | cards.list, cards.export, cards.diagnostics, attachment list/get, notification event reads, boards.list, cards.stats, cards.runs |
operator.write | cards.diagnostics.refresh, create/update/move/delete/comment/link/linkDependency/proof/artifact, attachment add/delete, worker log, protocol violation, claim/heartbeat/release/promote/reassign/reclaim/complete/block/unblock, cards.dispatch, cards.bulk, archive, boards.upsert/archive/delete, cards.specify/decompose, notification subscribe/delete/advance |
No RPC method requires operator.admin. Browsers that connect with read-only operator access can view the board but cannot modify cards. An admin scope expands the set of accepted Workboard host paths, yet the available methods stay the same.
Storage
Workboard stores persistent data in its own relational SQLite database within the OpenClaw state directory. Boards, cards, labels, lifecycle events, run attempts, comments, dependency links, proof, artifact references, attachment metadata and blobs, diagnostics, notifications, worker logs, protocol state, and subscriptions all reside in Workboard tables rather than plugin key-value entries. A card export captures the board narrative but does not embed attachment blob contents.
Installations that used Workboard in the .28 release can run openclaw doctor --fix to migrate the previously shipped legacy plugin-state namespaces (workboard.cards, workboard.boards, workboard.notify, and, if present, workboard.attachments) into the relational database.
Troubleshooting
The tab says Workboard is unavailable
openclaw plugins inspect workboard --runtime --json
If plugins.allow is configured, add workboard to it. If plugins.deny contains workboard, remove it before enabling the plugin.
Cards do not save
Verify that the browser connection has operator.write access. Read-only operator sessions can list cards but cannot create, edit, move, or delete them.
Starting a card does not open the expected session
Review the card's agent id and linked session, then open Sessions or Chat to examine the actual run state.
Dispatch does not start a worker
Ensure at least one ready card exists without an active claim:
openclaw workboard list --status ready
If the CLI reports data-only dispatch, start or restart the Gateway and try again. Data-only dispatch updates local board state but cannot launch subagent worker runs. Cards may also be skipped when another card for the same owner or agent is already running or awaiting review. Complete, block, or release that active work before dispatching more for the same owner.