Repository navigation
Board Governance
governance/TASKS.md is the monorepo's task board and the single source
of truth for cross-agent task state. Read it FIRST every session, before
any task. Package-scoped work keeps its own board (e.g.
packages/llm-entity-extraction/governance/MESSAGE_BOARD.md).
| Lane | Meaning |
|---|---|
unassigned |
Queued and unclaimed — free for the next agent or team to claim; Owner is unclaimed
|
assigned |
Claimed (or queued with an owner), nothing underway — no draft, no diff, no branch |
in_progress |
ANY work exists and an owner holds it — label the card before the code, never after |
needs_attention |
Blocked / review / decision — the Evidence note says which (needs: / review: / decision:) |
done |
Finished, verified, evidenced — moved to the Archive (append-only; reopen instead of delete) |
- Claim before edit — one owner per card; claim = lane + Owner name + date.
-
Unclaimed = unassigned — a card with Owner
unclaimedlives in theunassignedlane, free for the next agent or team; claiming moves it toassignedand sets Owner + date. - Update, don't duplicate — work touching an existing card's scope updates that card; discovered-but-undelivered work spawns its own card before the parent closes.
-
No silent completion —
donerequires green suites for touched packages, cleangit statusfor the card's scope, Evidence naming the commit(s), and (for synced cards) the GitHub issue closed in the same commit. An agent is NOT done until its card says so. -
Commit discipline — reference cards:
DMR-0NN: <summary>(orDMR-0NN claimed/reopenedin the body). Targeted staging (HUB-029):git add <explicit paths>only — nevergit add ./-A/ a bare directory; this is a shared checkout, so re-checkgit status --porcelainbefore every commit and unstage anything you don't own (HUB-024/HUB-027 sweep incidents). - Issues vs board — small/single-session/low-risk cards are board-only; critical or cross-package cards get an issue via the Board card (DMR-0NN) template, linked both ways, lane moves mirrored as issue comments, closed in the same commit that archives the card.
scripts/board_state.py parses the live board into JSON, validates the
board's own laws, and mirrors lane state onto GitHub:
python scripts/board_state.py status # snapshot (--json for machines)
python scripts/board_state.py card DMR-009 # one card + commits referencing it
python scripts/board_state.py check # invariants; exit 1 on structural errors
python scripts/board_state.py check --with-issues # + verify synced issues/labels via gh
python scripts/board_state.py sync-issues --apply # push board-derived labels onto issues
python scripts/board_state.py pull-issues --apply # reverse-sync served-board lane moves into TASKS.md
python scripts/board_state.py project-init # one-time Projects v2 mirror setup
python scripts/board_state.py project-sync --apply # mirror the open table into the projectFull operational doc: Served-Board (layout, API contract, env secrets, redeploy workflow).
Since HUB-055 the board also runs as a live, issue-backed web site — a
dispatch board any agent can view and edit in a browser at
https://digital-mailroom-theta.vercel.app, deployed from the monorepo to Vercel
(project digital-mailroom; deploy root = board-site/). The GitHub issues
are the store, which makes the site auto-updating + shared:
-
Read:
GET /api/boardlists every open + closed issue labeledkanbanand normalizes each to a board card (id from title/body, lane fromstage/*, priority frompriority/*, desc/evidence from the### Task/### Evidence planbody sections, archived = closed). -
Write: the UI PATCHes
/api/board/DMR-0NNon every move/save. Lane moves swap thestage/*label and post a dated "Board lane move" comment (the mirror law); priority swaps, body-section rewrites, and assignee changes PATCH the issue; archive = close, restore = reopen. -
Config (Vercel env secrets):
GITHUB_TOKEN(orMAILROOM_GH_TOKEN) with Issues read/write onLLM-Mailroom-Services/Digital-Mailroom;MAILROOM_GITHUB_REPOto override. Never commit these. -
Reconciliation: TASKS.md stays canonical. After served-site edits
(which write issues, not TASKS.md), run
board_state.py pull-issuesto see issue-side lane moves that haven't landed, then--applyto rewrite the Lane cells + append a dated Evidence note.sync-issuesis the board → labels leg;pull-issuesis the reverse. -
Card↔issue law is now the norm: the site only shows
kanbanissues, so every board card needs a synced issue (one card = one issue,kanban-
stage/*+priority/*+domain/*labels) opened from thehub_card.ymltemplate, or it won't appear on the served board.
-
-
Cross-board tabs (DMR-005): both served boards carry a
board-tabsswitcher — this board links out to the HUB board (https://mailroom-dev.vercel.app), and the HUB board links back to https://digital-mailroom-theta.vercel.app. -
Project hygiene (DMR-007): only two Vercel projects back the boards —
digital-mailroom(this repo) andmailroom-dev(the predecessor); the duplicateboard-siteproject was deleted. New cards can be created throughPOST /api/board(write-path proven by DMR-007).
check errors are structural contradictions (duplicate IDs, invalid
lanes, malformed issue links, missing attention tags, phantom commit
references); warnings are hygiene drift (pending-archive rows,
unclaimed cards with commits, stale in_progress). --strict fails on
warnings too. The CI gate
.github/workflows/board-governance.yml
runs check + the label audit + the doc-class taxonomy parity gate
(scripts/taxonomy_parity.py, HUB-019 §65A — fails when the canonical
five-class surfaces disagree; also triggered by changes to the taxonomy
surfaces themselves) on every change to governance/, scripts/, or
.github/.
The Projects v2 mirror (the mailroom-hub board project with
Lane/Owner/Card fields) needs a one-time interactive scope grant:
gh auth refresh -s read:project, then project-init + project-sync.
.github/labels.json is the declarative source of truth —
scripts/github_labels.py sync creates/updates repo labels, audit
reports drift (CI-gated). Groups:
| Group | Labels |
|---|---|
| Stage (lane mirrors) |
stage/assigned · stage/in-progress · stage/needs-attention · stage/done
|
| Attention tags |
attention/blocked · attention/review · attention/decision
|
| Type |
type/bug · type/feature · type/task · type/docs · type/governance · type/release · type/sync
|
| Priority |
priority/critical · priority/high · priority/medium · priority/low
|
| Domain |
domain/hub · domain/governance · domain/tooling · domain/<package> × 10 |
| Sync marker |
kanban (this issue mirrors a DMR-0NN card) |
Issue forms live in .github/ISSUE_TEMPLATE/ (board card, bug, feature,
task/TODO); the PR form (.github/PULL_REQUEST_TEMPLATE/pull_request.yml)
enforces the board discipline.