Skip to content

Work items

Work items

Per ADR-0012, a work item has two artefacts:

ArtefactHoldsWhy there
GitHub IssueStatus, dependencies, running logCheap conflict-free state changes; queryable by gh
docs/work/WI-###-slug.mdThe specVersion history, reviewable in the PR, rendered on the subsite

Creating a work item means creating both. The issue links to the spec; the spec’s frontmatter carries the issue number.

Numbering

WI-###, allocated from the milestone’s block:

BlockMilestone
001–009M0 Foundation
010–019M1 Domain core
020–029M2 Catalogue & clients
030–039M3 Product
040–049M4 Social & discovery
050+Later
H01+Human-gated (see agent-boundaries.md)

Numbers are never reused, including for deleted items.

Labels

The vocabulary is closed. Materialised in .github/labels.yml.

GroupLabelsMeaning
Statusstatus:ready status:in-progress status:in-review status:blockedExactly one at all times
Needsneeds:human needs:adr needs:spec-reviewAgent must not pick these up
Sizesize:S size:M size:LSee sizing below
Areaarea:api area:web area:mobile area:db area:docs area:infraMay have several
Gatemigration:destructive docs:n-aUnlocks a gate step that otherwise fails

status:ready means dependencies are closed and a human is not needed. It is the agent’s work queue:

Terminal window
gh issue list --label status:ready --json number,title,labels

Label hygiene is load-bearing, not cosmetic — a mislabelled issue is picked up out of order.

Sizing

Sizing is about reviewability, not effort. Per ADR-0015 a human reviews every PR, so a work item must be small enough to review in one sitting.

SizeMeaning
size:SOne surface, obvious diff
size:MOne vertical slice across a couple of packages
size:LNeeds needs:spec-review before code. Consider splitting first

If you cannot state a Definition of Done as a checklist of independently checkable lines, the item is too big. Split it.

Human-gated items (WI-H##)

Some work cannot be done by an agent at all — spending money, creating accounts, contacting an external party. These are tracked as work items so they stay visible in the backlog, but they differ from agent items in three ways:

Agent itemHuman-gated item
Labelsstatus:* + size:* + area:*status:blocked + needs:human + area:*no size:
Frontmattersize:owner: human, no size:
Closed byA merged PREvidence recorded on the issue

No size label. Sizing measures how reviewable a diff is, and these produce no diff. Applying size:S to “enrol in the Apple Developer Program” would be meaningless precision.

Status is always status:blocked + needs:human. Never status:ready — that label means “an agent may pick this up”, which is the opposite of what these are. An agent that sees needs:human skips the item regardless of dependency state.

Definition of done is evidence, not a diff. A written reply quoted on the issue, a dashboard showing an active account, a measured cost figure. The same rule applies as everywhere else: adjectives are not evidence.

The current set is listed in ../work/README.md and enumerated in agent-boundaries.md.

Dependencies

Declared in both places:

  • Issue body: Depends on #12, #14 — GitHub renders the link and shows closure
  • Spec frontmatter: depends_on: [WI-012, WI-014]

The dependency graph in ../work/README.md is the human-readable view. Keep it current — it is what stops two agents editing the same schema.

Spec template

---
title: "WI-###: Short imperative title"
description: One line, shown on the subsite index.
issue: 42
milestone: M1
size: M
area: [api, db]
depends_on: [WI-011]
---
# WI-###: Short imperative title
## Problem
One sentence. Why this exists.
## In scope
- Bullet per deliverable.
## Out of scope
- Bullet per thing deliberately excluded.
- This section is as important as the one above — it is what stops scope drift
mid-loop, and what a reviewer checks the diff against.
## Definition of done
- [ ] Each line independently checkable.
- [ ] Each line has an obvious piece of evidence — a test name, a command, an output.
- [ ] No line reading "works correctly" or similar. That is not checkable.
## Verification
Exact commands a reviewer runs to confirm this, copy-pasteable.
## Notes
Relevant ADRs, traps, prior art.

Lifecycle

created (status:blocked or status:ready)
→ agent picks up status:in-progress
→ PR opened status:in-review
→ human merges closed

An item returning to status:ready after being in-progress means the agent hit a stop condition. The issue comment must say which one.