Minimal mental model for do-work: what a brief becomes, how work is gated, and what “done” means.
do-work turns a natural-language brief into small, traceable tasks and runs them with tests and evidence—not one opaque “agent did stuff” blob. Knowing the nouns (Issue, REQ) and the two-command loop (start → go) keeps you in control of the gates.
Your brief
│
▼
UR-NNN Issue (verbatim input + side artifacts; slug still UR-NNN)
│
▼
REQ-NNN-… backlog tasks (one file each)
│
▼
working/ claimed, in flight (one worker / worktree per REQ)
│
▼
archive/ done, with proof metadata
Two-command surface
| Command | Role |
|---|---|
/do-work start … |
Define work: intake → ideate (default) → capture |
/do-work go UR-NNN |
Execute work: verify → audit → run (then optional close/log) |
Granular commands (intake, capture, verify, run, …) are the same building blocks; start and go chain them with defaults and human gates.
File-based state. Everything lives under the project’s .do-work/ (config, Issues, backlog REQs, working/, archive/, runs/, state/). There is no separate do-work server. git history is the audit trail.
Product noun for the top-level brief container (formerly “user request”). Wire/slug stay UR-NNN / ur.* (do-work-io); do not invent ISSUE-NNN or issue.create.
- Folder (markdown backend):
.do-work/user-requests/UR-NNN/ - Core file:
input.md— your brief verbatim (do-work does not “improve” the wording on intake) - May also hold
ideate.md,assets/, laterclosure.md - Numbering: sequential, zero-padded (
UR-001,UR-002, …); next id is max+1 (gaps are not filled) - Linear note: a do-work Issue is a Project Milestone; a REQ is a Linear Issue — different entities
- Backlog file:
.do-work/REQ-NNN-slug.md - One discrete unit of work with acceptance criteria, verification steps, optional dependencies, layer, and file footprint
- Lifecycle locations: backlog root →
working/(claimed) →archive/(done) - Each completed REQ normally produces one git commit on a
req/REQ-NNNbranch, then delivery perdelivery.mode(mergedefault, orpr)
- start = record + shape the backlog (does not run implementation)
- go = score the backlog against the brief, then run if the gate passes
That split is intentional: you get a human decision point before autonomous execution.
On start (unless --no-ideate), ideate ends with:
- Grill — one-at-a-time questions (
question) - Continue — capture as-is
- Stop — you revise
input.mdyourself; capture does not run
go runs verify first. Score is 0–100% coverage of the brief, plus structural checks:
- Layer coverage (declared layers represented or explicitly skipped)
- Integration block on new-surface feature REQs
- Partial-confidence acknowledgements from capture
Default threshold: verify.threshold: 90 in .do-work/config.yml.
| Outcome | Behaviour |
|---|---|
| Score ≥ threshold | Proceed to audit + run |
| Score < threshold | Halt; show gaps (unless --force or successful --auto-fix) |
Project-declared slices of the stack in config, for example:
layers: [frontend, backend]Capture tags each REQ with a layer (or none for bug-fix / pure refactor). Feature briefs that ignore a declared layer get a prompt—or halt if layers are empty and you did not pass --no-layers. See README “Layers and Integration”.
For feature REQs that add new surface (page, route, command, endpoint, …), capture writes ## Integration with codebase-checked answers:
- Reachability
- Data dependencies
- Service dependencies
Stops “compiles but unreachable” work from looking done at decomposition time.
During run, a fresh worker typically:
- Works in a dedicated git worktree on
req/REQ-NNN - Writes a failing test for an acceptance criterion
- Implements until it passes; repeats for remaining criteria
- Runs the project suite when configured
- Returns structured evidence to the orchestrator
A worker report alone does not mean archived. The orchestrator validates acceptance evidence, runs policy checks (blocked paths/commands), runs post-build review, writes closure proof fields, and only then archives. Failed review is a stopper, not a successful REQ.
From .do-work/config.yml (delivery.mode):
merge(default) — mergereq/REQ-NNNinto the base branch locally, archive, tear down worktree, delete branchpr— push and open a GitHub PR viagh; requires remote +gh. Missing credentials →missing-credsstopper (no silent merge fallback)
- Multi-terminal: several
/do-work runsessions claim different REQs via atomicgit mv - Single-session:
/do-work run --parallel N(N capped at 10)
Claim stamps, heartbeats, footprint checks, and dependency checks reduce collisions. Recovery: status, unblock, resume.
Optional drafts for X / LinkedIn / blog from completed archive work. Runs after a clean go when log.enabled is true and log.platforms is non-empty—or on demand via /do-work log.
- Getting started — install and first
start/go - Commands — when to use each command
- Troubleshooting — gate failures and stuck REQs