Document the claim: a "Claiming a card" section and the Assignee field

AGENTS.md gains the convention — claiming is moving, the assignee is who
launches agents on the card, hand-moves bypass the claim and should update
the line by hand, and git identities collide the way git's do — plus the
**Assignee:** header field beside Status/Priority/Type and the
BOARD_COMMIT_MOVES gate with its unpushed-main consequence.
.env.example documents the setting with its default (off).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
istos
2026-07-30 09:06:00 +02:00
co-authored by Claude Opus 5
parent 22255f2842
commit 3629116afa
2 changed files with 57 additions and 2 deletions
+47 -2
View File
@@ -168,8 +168,9 @@ failing on a port clash.
All settings live in `manager/core/.env.example` with their defaults documented —
the port, the binaries agents launch with, the commands agents may run,
the worktrees directory, the watch interval and the in-memory caps. Copy it
to `manager/local/.env` (gitignored) to override locally; real environment
the worktrees directory, whether moves claim and commit themselves, the
watch interval and the in-memory caps. Copy it to `manager/local/.env`
(gitignored) to override locally; real environment
variables beat `.env`, which beats the defaults. The hook bridge reads the
same `.env`, so changing `BOARD_PORT` moves the board, the agents and the
hooks together.
@@ -397,6 +398,39 @@ Moves are not always forward. Going back a stage is normal and expected —
verification failing, or an approach not surviving contact with the code, should
move the task backwards rather than being worked around in place.
## Claiming a card
**Claiming is moving.** Taking a card out of `backlog/` or `to-do/` towards
work is the commitment, so that is where ownership is recorded: the board
writes an `**Assignee:** <name>` line into the header, taken from this
checkout's `git config user.name` — the identity git history already shows,
no new concept. The first claim sticks: a card that already names an
assignee keeps it when someone else moves it on. Walking a card all the way
back to `backlog/` clears the line — nobody holds it again.
The assignee is who launches agents on the card and whose judgment the
review waits for. It is a convention, not a lock: the board does not (yet)
refuse anyone else's actions.
Two consequences worth knowing:
- **Hand-moves bypass the claim.** A plain `mv` between stage directories
is still a first-class move (the watcher narrates it), but nothing writes
the assignee — update the line yourself in the same edit as **Status**.
- **Identity is git's, so it collides like git's.** Two machines both
configured `user.name = ronald` are one person as far as the board is
concerned. Teams that share a git history already share that assumption.
With `BOARD_COMMIT_MOVES` on, board-made moves also **commit themselves**:
the move and the claim land in one commit touching only that task file,
messaged `board: <number> → <stage> (<name>)`, staged by pathspec so
unrelated staged work is neither committed nor unstaged (hooks are skipped —
this is bookkeeping, not code). Pushing is not part of it: those commits sit
on your local `main` until you push it, which the PR guard above will tell
you about if you forget. The setting is off by default: a single-player
board writes no assignee and makes no commits, exactly as before, and
`tasks/` is committed by hand.
## Task file format
Each task is a markdown file with a descriptive filename
@@ -435,6 +469,17 @@ Type is orthogonal to status. A discovery task — research, scoping, spiking an
approach — moves through the same five stages as everything else; "discovery"
describes the work, not where it sits on the board.
An optional **Assignee** line records who holds the card:
```markdown
**Assignee:** ronald
```
The board writes it when a move claims the card (see "Claiming a card") and
removes it when the card is walked back to `backlog/`; on `done/` cards it
stays as history. Editing it by hand is fine — it is a plain header field,
and a hand-move should update it alongside **Status**.
An optional **Depends on** line can name what must land first — task numbers
or external preconditions — so sequencing lives in the header instead of
prose asides:
+10
View File
@@ -57,6 +57,16 @@ BOARD_PR_POLL_INTERVAL=60
# means today's behaviour, never a blocked launch.
BOARD_FETCH_TIMEOUT=10
# Claim on move, and commit it. On: a board-made move out of backlog/ or
# to-do/ writes **Assignee:** <git user.name> into the task file (first
# claim only — an existing assignee is preserved), walking a card back to
# backlog/ clears it, and each move commits itself — the move and the claim
# in one commit touching only that task file, messaged
# `board: <number> → <stage> (<name>)`. Nothing is pushed. Off (the
# default) means today's behaviour exactly: no assignee, no commit, tasks/
# committed by hand. Anything but empty/0/false/no/off turns it on.
BOARD_COMMIT_MOVES=
# Seconds between disk polls of the stage directories.
BOARD_WATCH_INTERVAL=2