grooming-backlog
Roll a sprawling task list back up into a lean, honest backlog. The inverse of
decomposing-tickets (which slices work down into tracer-bullet tickets); this
consolidates up — completing what's done, merging clusters into umbrellas, and
cutting what's dead — so the backlog reflects reality at a glance.
When to use
- The task list is noisy — many micro-tasks, superseded items, stale
in_progress entries nobody is actually working.
- The user asks to "get pending under N", "trim the backlog", or "consolidate the
todos".
- Triaging an
in_progress list where items were left mid-flight by prior
sessions.
Run in the MAIN session
Do the grooming inline in the main loop. The task tracker (TaskList /
TaskGet / TaskUpdate) is unreachable from forked or Workflow subagents
(see workflow-agent-task-tools-nudge / the workflow-agents-no-task-tools
memory) — a delegated groomer goes blind. Read status with the tracker here,
verify against the repo, and apply the tracker mutations here.
Procedure
- Inventory.
TaskList; split by status (pending / in_progress /
completed).
- Verify status — claims are leads, not facts. For each open task,
establish its ACTUAL state from code / git / the repo, not from the label or
a stale "DONE" note. A task's own progress note or a subagent report is a
lead — confirm the file exists, the commit landed, the test is green before
completing it.
- Bucket each open task:
- COMPLETE — verifiably done (mark completed, with the receipt in mind).
- FOLD — part of a larger effort → absorb into an umbrella survivor.
- DELETE — superseded, duplicate, stale, or parked-indefinitely with
nothing left to preserve.
- KEEP — genuinely distinct and still-wanted → leave pending.
- Define umbrellas by theme, not by force. Group only tasks that truly
belong to one program. Common fleet themes: fleet-wide propagation waves; a
release/publish campaign; a big pipeline/infra spec; a docs/ops program; an
extension-polish umbrella; a code-as-law tooling backlog.
- Fold BEFORE you delete — deletion is PERMANENT. First
TaskUpdate the
umbrella's description to absorb each child's scope (id + one-line intent);
then delete the child. Never delete a task whose detail isn't captured in a
survivor (or the session record). The umbrella is the durable record.
in_progress must mean actively-being-worked. Anything not being touched
right now → complete (if done), fold (if gated or part of an umbrella), or
delete (if stale). A gated-but-real item folds into its umbrella; it does not
linger as "in progress".
- Narrate the full fold-map. Report
absorbed-id → survivor for every merge
and every delete so the operator can split anything back out. Because deletes
are permanent, this map is the reversibility guarantee.
Guardrails
- Completion needs a receipt. Never mark a task completed to hide unfinished
work — the same bar as
stop-claim-verify.
- Honest beats small. Don't force-merge unrelated tasks just to hit a number;
a lean-but-accurate backlog beats a small-but-lossy one.
- Prefer FOLD over DELETE when a task carries specific detail (wire
contracts, version handshakes, file lists) — capture it in the umbrella.
- Complements
codifying-disciplines (turns recurring lessons into enforcers)
and inverts decomposing-tickets (which fans a plan out into tickets).
1---2name: grooming-backlog3description: Collapse noisy backlogs: verify done work, fold duplicates, delete stale tasks.4---56# grooming-backlog78Roll a sprawling task list back up into a lean, honest backlog. The inverse of9`decomposing-tickets` (which slices work *down* into tracer-bullet tickets); this10consolidates *up* — completing what's done, merging clusters into umbrellas, and11cutting what's dead — so the backlog reflects reality at a glance.1213## When to use1415- The task list is noisy — many micro-tasks, superseded items, stale16 `in_progress` entries nobody is actually working.17- The user asks to "get pending under N", "trim the backlog", or "consolidate the18 todos".19- Triaging an `in_progress` list where items were left mid-flight by prior20 sessions.2122## Run in the MAIN session2324Do the grooming inline in the main loop. The task tracker (`TaskList` /25`TaskGet` / `TaskUpdate`) is **unreachable from forked or Workflow subagents**26(see `workflow-agent-task-tools-nudge` / the workflow-agents-no-task-tools27memory) — a delegated groomer goes blind. Read status with the tracker here,28verify against the repo, and apply the tracker mutations here.2930## Procedure31321. **Inventory.** `TaskList`; split by status (pending / in_progress /33 completed).342. **Verify status — claims are leads, not facts.** For each open task,35 establish its ACTUAL state from code / git / the repo, not from the label or36 a stale "DONE" note. A task's own progress note or a subagent report is a37 lead — confirm the file exists, the commit landed, the test is green before38 completing it.393. **Bucket each open task:**40 - **COMPLETE** — verifiably done (mark completed, with the receipt in mind).41 - **FOLD** — part of a larger effort → absorb into an umbrella survivor.42 - **DELETE** — superseded, duplicate, stale, or parked-indefinitely with43 nothing left to preserve.44 - **KEEP** — genuinely distinct and still-wanted → leave pending.454. **Define umbrellas by theme, not by force.** Group only tasks that truly46 belong to one program. Common fleet themes: fleet-wide propagation waves; a47 release/publish campaign; a big pipeline/infra spec; a docs/ops program; an48 extension-polish umbrella; a code-as-law tooling backlog.495. **Fold BEFORE you delete — deletion is PERMANENT.** First `TaskUpdate` the50 umbrella's description to absorb each child's scope (id + one-line intent);51 *then* delete the child. Never delete a task whose detail isn't captured in a52 survivor (or the session record). The umbrella is the durable record.536. **`in_progress` must mean actively-being-worked.** Anything not being touched54 right now → complete (if done), fold (if gated or part of an umbrella), or55 delete (if stale). A gated-but-real item folds into its umbrella; it does not56 linger as "in progress".577. **Narrate the full fold-map.** Report `absorbed-id → survivor` for every merge58 and every delete so the operator can split anything back out. Because deletes59 are permanent, this map is the reversibility guarantee.6061## Guardrails6263- **Completion needs a receipt.** Never mark a task completed to hide unfinished64 work — the same bar as `stop-claim-verify`.65- **Honest beats small.** Don't force-merge unrelated tasks just to hit a number;66 a lean-but-accurate backlog beats a small-but-lossy one.67- **Prefer FOLD over DELETE** when a task carries specific detail (wire68 contracts, version handshakes, file lists) — capture it in the umbrella.69- Complements `codifying-disciplines` (turns recurring lessons into enforcers)70 and inverts `decomposing-tickets` (which fans a plan out into tickets).