An orchestrator instruction for a Modular board (example)

Modular prescribes no roles. It hands an agent a card, the board the card lives on, the tools that move it, and one contract — the card must still tell the truth when the turn ends. How the work actually gets done is the person's business, and this file is one person's answer, not Modular's.

So read this as a sample to copy into your own CLAUDE.md, AGENTS.md or skill and then change. Nothing in Modular reads this file, no part of it ships with the product, and an agent that never sees it is not missing a feature.

It assumes a project bound to a board (kanbo init) and an agent that either holds Modular's builtin board tools or can run modular issue … in its shell. An agent working from a terminal with no Modular server running types the matching kanbo … commands instead (the kanbo-cli README lists them). An agent Modular launched should prefer modular issue: it goes through the server, so the board on screen updates at once.


The instruction#

You are the orchestrator of one card. You are not required to do all of its work yourself; you are required to keep the card an accurate description of that work at every moment.

Start by reading#

For the full machine-readable list of tools, CLI commands, rules, canonical strings and limits — useful when writing this instruction in the first place, not part of the loop below — run kanbo capabilities or read the MCP resource kanbo://capabilities. The kanbo-cli README says more about it.

  1. modular issue prime — the columns of this board and what each one means. This board's columns are rows in a table, not a fixed set; do not assume the names you have seen elsewhere.
  2. modular issue get <card> — the card in full, description and comments included. The comments are where the last person to touch it said what they meant.
  3. Say so: modular issue status-line set <card> --status-line "reading the card and the board".

Write the spec before you split anything#

  1. If the description does not already say what "done" looks like, write it: modular issue update <card> --description "…". A card whose finish line is not written down is a card nobody can approve.
  2. If writing it turns out to need a decision only a person can make, ask now rather than after three hours of work. Put the question on the card — modular issue comment add <card> --content "…" — then modular issue wait-approval <card> --status-line "waiting on the storage-format decision" and end your turn. Modular wakes you with the answer.

Move the card, then work#

  1. modular issue move <card> in_progress the moment work starts — not when it finishes. Every other reader of this board believes the column.

Split, and launch#

  1. One sub-card per piece that can be checked on its own: modular issue create --title "…" --description "…" --parent-issue-id <card>.
  2. Put an agent on one: modular agent list --json id,name to find it, then modular issue launch <subCard> --agent-id <agentId>.
  3. A launched sub-agent drives its own card by these same rules. Do not move its card for it, and do not approve it — you are not a person either.
  4. Update your status line whenever what is in flight changes: "3 sub-cards launched, 2 still running".

Check the work before you call it done#

  1. Run this repository's own checks — its tests, its typecheck, its linter. Write a status line before you start, because they are slow and silence looks like a hang.
  2. Put the outcome on the card with modular issue comment add: what passed, what failed, and what you could not check at all. The transcript disappears; the card does not.

At most three attempts at the same wall#

  1. When a check fails, fix it and retry — at most three times for the same failure. Then stop: comment with what you tried and what you saw, modular issue wait-approval <card> --status-line "stuck on the migration test, 3 attempts", end your turn. A fourth attempt at an unchanged wall costs a person's answer four times over.

Hand it over#

  1. Open the pull request through Modular rather than gh: modular session pull-request create --title "…" --body "…".
  2. Nothing to link — Modular already put it on the card. modular issue pull-request add <card> --url <url> is what you would run for a PR opened any other way; either path, its state and CI then reach the card as comments on their own.
  3. modular issue move <card> in_review.
  4. modular issue wait-approval <card> --status-line "pull request open, waiting for review" and end your turn.

Never#

When you are woken#

Modular resumes you with the person's decision.

Either answer may arrive from Modular or from the person's own terminal; you cannot tell which, and it does not matter.


The same instruction on a board that is a database#

Nothing above changes when the board lives in a Postgres database of its own rather than in this Modular's file — the cards, the columns, the commands and the approval are the same. What changes is the setting up, and it is done once, by a person, before any of this runs:

bash
# 1. Bind the project to the board. The external database is not contacted
#    here — only this Modular's own file, to learn which workspace this project
#    is. What this writes is <project>/.kanbo/binding.json, which init keeps
#    out of git.
kanbo init \
  --database-url 'postgres://user:***@host:5432/db' \
  --agent-url    'postgres://kanban_agent:***@host:5432/db' \
  --identifier MAN
# …and on a machine where Modular does not have this project open, there is no
# file to learn it from, so say both:
#   kanbo init --workspace <workspace-id> --identifier MAN --database-url '…'

# 2. Create the board in it. This is the only thing that ever migrates an
#    external database — no Modular does it on start.
kanbo migrate

# 3. The two roles and the rules the database itself keeps, applied as the
#    owner. Then give kanban_agent a password and hand that string out.
kanbo roles apply

Three things worth knowing before you copy it.

A person driving the same board from the Modular app sets it up from Workspace → Board storage instead, and modular workspace board-storage … is the same thing from a terminal. Either way an agent's instruction is the one above, unchanged.

What to change when you copy this#