Skip to content

to-issues

to-issues

towriteshands-off

Use this when: a plan needs breaking into typed, grabbable issues

Problem it solves — A plan in your head isn't grabbable work. This breaks a plan, spec, or PRD into typed, independently-shippable tracer-bullet issues on the board, then hands off to triage and organise.

Used in workflows: Idea → shipped

To issues

Break a plan into independently-grabbable, typed issues — tracer-bullet vertical slices — and put them on the board, classified and placed.

Task class: create (issue authoring). Tools: gh (issues + native Issue Types + Projects v2), Read/codegraph for context. Runs in-thread.Artifact: filed issues typed Epic/Sprint/Task, sub-issue-linked, with native blocked-by deps — classified by triage, placed by organise, default backlog (no milestone).

Process

  1. Gather context. Work from the plan/spec already in the conversation; if a reference (issue number / URL / path) is passed, fetch and read it fully.
  2. Explore the code via codegraph — titles use the domain glossary, respect ADRs.
  3. Draft vertical slices — tracer bullets. Each slice cuts a thin but COMPLETE path through every layer (schema → API → UI → tests), demoable on its own; prefer many thin over few thick. Mark each HITL (needs a human — design call, manual testing) or AFK (an agent can finish it); prefer AFK.
    • Atomicity check: a slice whose title needs an "and" is two slices — split it. Use file-touch as a sizing smell (XS 1–2, S–M 3–5, L 5–8 files); an XL slice isn't a slice yet — break it down further before it goes on the board.

This is the skill — quiz before you file

Present the breakdown as a numbered list — Title · Issue Type (Epic/Sprint/Task) · HITL/AFK · Blocked by · Area. Ask: granularity right? deps right? split/merge any? types right? Iterate until approved — the cut is the value; a wrong slice ships wrong work hands-off.

Publish (on approval, in dependency order)

  • Create each issue with its native Issue Type (gh api -X PATCH repos/{o}/{r}/issues/{n} -f type=Epic|Sprint|Task), default no milestone → backlog. Write each issue body per docs/agents/pr-writing.md — plain lead, a > [!IMPORTANT] decision alert when the slice carries a decision, emoji-anchored ## headings, and footnote attribution (never an inline line).
  • Link the tree (Epic ⊃ Sprint ⊃ Task) via sub_issues; set native blocked-by deps (…/dependencies/blocked_by) in dependency order so real numbers resolve.
  • Call triage (set Status + the Area label — App/Harness) and organise (parent / milestone / board order). Surface-then-confirm — you approve before any write. (Until the Projects board exists, these degrade gracefully — see triage.)
  • Don't close or modify a parent issue.

Issue body template

markdown
## What to build
End-to-end behaviour of this slice (not layer-by-layer). No file paths/line numbers.
## Acceptance criteria
- [ ] … and the gate is green (`composer ci:check` / `harness:check`)
## Blocked by
- #NN (or "None — can start immediately")

An AFK slice headed for hands-off execution gets a fuller agent brief at triage — the durable contract the executor works from. Match that shape: docs/agents/agent-brief.md.

Where it sits

find-untracked-work / brainstorm feed it → to-issues createstriage classifies → organise places → build-sprint/build-epic execute. NOT organise (places) / triage (classifies one) / the build-* executors.