/backlog
Manage the rpm backlog — persisted at docs/rpm/future/tasks.org.
All operations read and write this file using org-mode format.
Project Amendments
At the start of every invocation, check whether
docs/rpm/skills/backlog.md exists in the consuming project. If it
does, read it and apply its contents as additional project-specific
instructions for this skill. Amendments may add band orderings,
extra parent groups, or custom triage rules. They cannot remove or
override plugin defaults — on conflict, this SKILL.md wins.
The backlog is sorted in execution order (top-to-bottom = the
order in which tasks need to get done). "Take from the top" is the
expected read pattern.
Within each * Parent group, keep this band order top-to-bottom:
- Actionable —
** IN-PROGRESS or ** TODO with all
:BLOCKED_BY: deps DONE
- Blocked —
** BLOCKED, or ** TODO with unresolved
:BLOCKED_BY:
- Postponed —
** TODO with a :POSTPONED: stamp
Closed entries (** DONE / ** CANCELLED) are archived to
docs/rpm/future/done.org by /session-end and do not live in
tasks.org long-term. /backlog done toggles TODO → DONE in place;
the archive sweep runs at the next session-end.
Blocked and postponed items drift to the bottom of their band
automatically whenever this file is written (during add,
postpone, review, or session-end Phase 3b). Moves are mechanical
— no user question. Preserve relative order within each band.
New add entries land at the bottom of the actionable band
(not the absolute bottom); user promotes upward explicitly if
something needs to happen sooner.
Pivot capture (automatic, no user question). When the user
redirects mid-session to new multi-step work that meets the
TaskCreate bar, the LLM must insert a ** TODO at the top of
the actionable band AND update docs/rpm/~rpm-session-start to set
the task: field to the new work. The ask IS the confirmation —
don't prompt. Skip for tactical single-step follow-ups. Rationale:
the backlog should always represent current state, so a dropped
session (without /session-end) still hands off accurately. Full
rule lives in plugin/hooks/_directives.sh.
Routing
Parse $ARGUMENTS:
add <description> → Add below
list → List below
review → Review below
postpone <task text or number> → Postpone below
done <task text or number> → Done below
empty or natural language → infer intent from context. If unclear,
show usage:
/backlog add <description> — add a backlog entry
/backlog list — show all entries with statuses
/backlog review — evaluate and reorganize
/backlog postpone <task> — defer to the bottom of its group
/backlog done <task> — mark an entry complete
Add
Do NOT call TaskCreate for backlog additions. Your rpm backlog
is long-term; native tasks (TaskCreate/TaskList) are reserved for
work actually happening this session. Adding to your rpm backlog
without a mirrored native task is the correct, intended behavior.
3 body lines max per entry, plus the org :PROPERTIES: drawer.
The drawer is its own thing — it doesn't count toward the body
budget. Body content (heading + any inline notes) caps at 3 lines;
default is just the heading.
Standard shape:
** TODO <description> [[file:YYYY-MM-DD-slug.md]]
:PROPERTIES:
:ID: <slug>
:END:
Add :BLOCKED_BY: <other-slug> inside the drawer when there's a
dependency. Add up to 2 inline body lines (under the drawer) only
when something can't reasonably live in the detail file — most of
the time the detail file is the right home for everything beyond
the heading.
What does not belong inline in tasks.org:
- Bullet lists describing the task
- Prose explaining "why", "how", or "defer until"
- Implementation notes, links to related files, status commentary
All of that goes in the detail file at
docs/rpm/future/YYYY-MM-DD-slug.md — never as 5+ lines of body
under the heading. Subagents dispatched by /next actionable-
backlog read the detail file, so information isn't lost — it's
just not in the line-scannable index. Multi-line entries turn
the backlog into prose-reading and break the SessionStart menu
/next priority scan, both of which need "topmost unblocked"
to fit a glance.
Read docs/rpm/future/tasks.org to see existing parent headings
and task structure.
Determine the parent heading:
- If an existing heading fits, suggest it (or ask when ambiguous).
- If none fits, create a new
* Parent group. When the new
group names a coherent objective (a deliverable, capability, or
area of work with a demonstrable done-state), propose a
Goal: body line for it — don't silently create a goalless
group. State the proposed goal as a demonstrable test (a
pass/fail artifact that PROVES it met — "N cases pass
end-to-end vs reference", "trace 38/38" — not a gap-list or a
vague description like "launch ready"). The user accepts,
edits, or declines; on accept, write it as a Goal: body line
directly under the * Parent. Skip the proposal for pure
status bands (Active, Blocked) or catch-all buckets
(Misc, Maintenance, Ideas) where a success metric doesn't
apply.
For any * Parent that carries a Goal: / Success: line (new
or existing), keep the metric a demonstrable test and ensure
the goal's chain terminates in a verify/sign-off task — file
that terminus now if it's missing, with the build gap-tasks as
its :BLOCKED_BY: deps. Don't leave a goal defined only by its
build gaps.
Add as ** TODO <one-sentence description> [[file:YYYY-MM-DD-slug.md]] followed by the standard
:PROPERTIES: / :ID: <slug> / :END: drawer, at the bottom of
the actionable band in the chosen heading (above any
blocked / postponed / DONE entries).
Create the detail file at docs/rpm/future/YYYY-MM-DD-slug.md
with everything that would otherwise be inline: title,
description, action steps, scope, estimate, related links. Ask
the user for details if the task is complex.
If the task has obvious dependencies on existing tasks, add
:BLOCKED_BY: <other-slug> inside the drawer (still
structured metadata, not body).
Research offer (when warranted). If the task crosses into a
domain or technology new to the project, hinges on external or
factual unknowns (APIs, libraries, standards, landscape/competitor
facts, best practices), or is a selection/evaluation/comparison
("X vs Y", "which approach"), offer to run the research skill
(rpm:research) on it first — upfront research de-risks a
new-domain task before build effort is committed, and its saved
report (docs/rpm/research/<slug>/) can be linked from the detail
file. Offer only; don't auto-run (matches the research skill's own
Offer gate). Skip the offer for internal/mechanical work fully
scoped by the existing codebase (refactors, bugfixes, renames,
doc/test edits) or when the domain knowledge is already in hand.
Confirm: print the new entry and its location.
List
Read docs/rpm/future/tasks.org.
Print a summary line and the active task list:
## Tasks — N in-progress · N todo · N blocked
<Parent Heading>
1. [TODO] <description>
2. [IN-PROGRESS] <description>
blocked-by: <id>
Grouped by parent heading. Number sequentially for reference.
Closed entries live in docs/rpm/future/done.org — read that
file directly if the user asks for history.
Review
- Read
docs/rpm/future/tasks.org and all linked detail files.
- Evaluate:
- Organization: tasks under logical parent headings?
- Dependencies: relationships correct? Missing or circular?
- Staleness: TODOs with no activity across multiple sessions?
- Scope: any tasks too large for one session (~35 min)?
Suggest decomposition.
- Duplicates: overlapping tasks?
- Demonstrable goals: for any
* Parent carrying a Goal: /
Success: line, that metric must be a demonstrable test (a
pass/fail artifact that PROVES it met — "N cases pass end-to-end
vs reference", "trace 38/38"), not a gap-checklist or a vague
description ("launch ready"). Every [NOT MET] goal's task chain
must terminate in a verify/sign-off task (with the build
gap-tasks as its :BLOCKED_BY: deps), not merely list build
gaps. Flag goals whose Success: is a gap-list/description or
whose chain has no terminal proof task. A metric reconcile/split
must add the "prove it" terminus in the same edit.
- Order: work is sorted top-to-bottom by execution order
(when it needs to get done)? Anything that should happen sooner
than what's currently above it?
- Deferrals: anything the user has set aside or signaled they
want to come back to later? Surface as candidates for Postpone.
- Present findings and proposed changes. Wait for confirmation
before editing. For postpones, apply the move using the
Postpone procedure below.
Postpone
Defer a task to the bottom of its * Parent group. Status stays
TODO (the task isn't dropped, just moved later in the execution
order). Adds a :POSTPONED: YYYY-MM-DD property so the deferral is
auditable.
- Read
docs/rpm/future/tasks.org.
- Match the argument to a task — by number (from most recent
/backlog list), by text match, or by asking if ambiguous.
- Identify the task's
* Parent heading. Find the last ** task
under that parent (any status — active, blocked, or postponed).
- Edit the file to move the matched task's heading + its property
drawer to just below that last sibling. Do not change status;
keep
** TODO.
- Add (or update)
:POSTPONED: YYYY-MM-DD inside the property
drawer with today's date. Create the drawer if the task didn't
have one.
- Confirm: print the moved task's new position.
If the task is already at the bottom of its group, just stamp the
:POSTPONED: property and note "already at bottom".
Done
- Read
docs/rpm/future/tasks.org.
- Match the argument to a task — by number (from most recent
/backlog list), by text match, or by asking if ambiguous.
- Change
** TODO to ** DONE and append today's date:
** DONE <description> :CLOSED: [YYYY-MM-DD]
- Confirm what was marked done.
1---2name: backlog3description: Manage the rpm backlog (long-term project tasks in docs/rpm/future/tasks.org — distinct from Claude's native TaskCreate list, which is session-scoped). Add, list, review, postpone, or complete entries. TRIGGER on natural-language backlog operations — phrasings like "backlog X", "add X to backlog", "add to backlog", "backlog the following", "what's on the backlog", "show/list backlog", "review backlog", "postpone N", "done N", "mark N done", "defer X" all qualify and must route through this skill instead of editing tasks.org directly. Also use when the user wants to reorder execution sequence, defer to the bottom of a group, or evaluate backlog health.4---56# /backlog78Manage the **rpm backlog** — persisted at `docs/rpm/future/tasks.org`.9All operations read and write this file using org-mode format.1011## Project Amendments1213At the start of every invocation, check whether14`docs/rpm/skills/backlog.md` exists in the consuming project. If it15does, read it and apply its contents as additional project-specific16instructions for this skill. Amendments may add band orderings,17extra parent groups, or custom triage rules. They cannot remove or18override plugin defaults — on conflict, this SKILL.md wins.1920The backlog is sorted in **execution order** (top-to-bottom = the21order in which tasks need to get done). "Take from the top" is the22expected read pattern.2324Within each `* Parent` group, keep this band order top-to-bottom:25261. **Actionable** — `** IN-PROGRESS` or `** TODO` with all27 `:BLOCKED_BY:` deps DONE282. **Blocked** — `** BLOCKED`, or `** TODO` with unresolved29 `:BLOCKED_BY:`303. **Postponed** — `** TODO` with a `:POSTPONED:` stamp3132Closed entries (`** DONE` / `** CANCELLED`) are archived to33`docs/rpm/future/done.org` by `/session-end` and do not live in34tasks.org long-term. `/backlog done` toggles `TODO → DONE` in place;35the archive sweep runs at the next session-end.3637Blocked and postponed items drift to the bottom of their band38automatically whenever this file is written (during `add`,39`postpone`, `review`, or session-end Phase 3b). Moves are mechanical40— no user question. Preserve relative order within each band.41New `add` entries land at the bottom of the **actionable band**42(not the absolute bottom); user promotes upward explicitly if43something needs to happen sooner.4445**Pivot capture (automatic, no user question).** When the user46redirects mid-session to new multi-step work that meets the47`TaskCreate` bar, the LLM must insert a `** TODO` at the **top** of48the actionable band AND update `docs/rpm/~rpm-session-start` to set49the `task:` field to the new work. The ask IS the confirmation —50don't prompt. Skip for tactical single-step follow-ups. Rationale:51the backlog should always represent current state, so a dropped52session (without `/session-end`) still hands off accurately. Full53rule lives in `plugin/hooks/_directives.sh`.5455## Routing5657Parse `$ARGUMENTS`:5859- `add <description>` → **Add** below60- `list` → **List** below61- `review` → **Review** below62- `postpone <task text or number>` → **Postpone** below63- `done <task text or number>` → **Done** below64- empty or natural language → infer intent from context. If unclear,65 show usage:6667 ```68 /backlog add <description> — add a backlog entry69 /backlog list — show all entries with statuses70 /backlog review — evaluate and reorganize71 /backlog postpone <task> — defer to the bottom of its group72 /backlog done <task> — mark an entry complete73 ```7475---7677## Add7879**Do NOT call `TaskCreate` for backlog additions.** Your rpm backlog80is long-term; native tasks (`TaskCreate`/`TaskList`) are reserved for81work actually happening *this session*. Adding to your rpm backlog82without a mirrored native task is the correct, intended behavior.8384**3 body lines max per entry, plus the org `:PROPERTIES:` drawer.**85The drawer is its own thing — it doesn't count toward the body86budget. Body content (heading + any inline notes) caps at 3 lines;87default is just the heading.8889Standard shape:9091```92** TODO <description> [[file:YYYY-MM-DD-slug.md]]93 :PROPERTIES:94 :ID: <slug>95 :END:96```9798Add `:BLOCKED_BY: <other-slug>` inside the drawer when there's a99dependency. Add up to 2 inline body lines (under the drawer) only100when something can't reasonably live in the detail file — most of101the time the detail file is the right home for everything beyond102the heading.103104What does **not** belong inline in tasks.org:105- Bullet lists describing the task106- Prose explaining "why", "how", or "defer until"107- Implementation notes, links to related files, status commentary108109All of that goes in the detail file at110`docs/rpm/future/YYYY-MM-DD-slug.md` — never as 5+ lines of body111under the heading. Subagents dispatched by `/next` actionable-112backlog read the detail file, so information isn't lost — it's113just not in the line-scannable index. Multi-line entries turn114the backlog into prose-reading and break the SessionStart menu115+ `/next` priority scan, both of which need "topmost unblocked"116to fit a glance.1171181. Read `docs/rpm/future/tasks.org` to see existing parent headings119 and task structure.1202. Determine the parent heading:121 - If an existing heading fits, suggest it (or ask when ambiguous).122 - If none fits, **create a new `* Parent` group**. When the new123 group names a coherent objective (a deliverable, capability, or124 area of work with a demonstrable done-state), **propose a125 `Goal:` body line for it** — don't silently create a goalless126 group. State the proposed goal as a **demonstrable test** (a127 pass/fail artifact that PROVES it met — "N cases pass128 end-to-end vs reference", "trace 38/38" — not a gap-list or a129 vague description like "launch ready"). The user accepts,130 edits, or declines; on accept, write it as a `Goal:` body line131 directly under the `* Parent`. **Skip the proposal** for pure132 status bands (`Active`, `Blocked`) or catch-all buckets133 (`Misc`, `Maintenance`, `Ideas`) where a success metric doesn't134 apply.135136 For any `* Parent` that carries a `Goal:` / `Success:` line (new137 or existing), keep the metric a **demonstrable test** and ensure138 the goal's chain terminates in a **verify/sign-off** task — file139 that terminus now if it's missing, with the build gap-tasks as140 its `:BLOCKED_BY:` deps. Don't leave a goal defined only by its141 build gaps.1423. Add as `** TODO <one-sentence description>143 [[file:YYYY-MM-DD-slug.md]]` followed by the standard144 `:PROPERTIES: / :ID: <slug> / :END:` drawer, at the bottom of145 the **actionable band** in the chosen heading (above any146 blocked / postponed / DONE entries).1474. Create the detail file at `docs/rpm/future/YYYY-MM-DD-slug.md`148 with everything that would otherwise be inline: title,149 description, action steps, scope, estimate, related links. Ask150 the user for details if the task is complex.1515. If the task has obvious dependencies on existing tasks, add152 `:BLOCKED_BY: <other-slug>` inside the drawer (still153 structured metadata, not body).1546. **Research offer (when warranted).** If the task crosses into a155 domain or technology new to the project, hinges on external or156 factual unknowns (APIs, libraries, standards, landscape/competitor157 facts, best practices), or is a selection/evaluation/comparison158 ("X vs Y", "which approach"), **offer to run the `research` skill159 (`rpm:research`) on it first** — upfront research de-risks a160 new-domain task before build effort is committed, and its saved161 report (`docs/rpm/research/<slug>/`) can be linked from the detail162 file. Offer only; don't auto-run (matches the research skill's own163 Offer gate). Skip the offer for internal/mechanical work fully164 scoped by the existing codebase (refactors, bugfixes, renames,165 doc/test edits) or when the domain knowledge is already in hand.1667. Confirm: print the new entry and its location.167168---169170## List1711721. Read `docs/rpm/future/tasks.org`.1732. Print a summary line and the active task list:174175 ```176 ## Tasks — N in-progress · N todo · N blocked177178 <Parent Heading>179 1. [TODO] <description>180 2. [IN-PROGRESS] <description>181 blocked-by: <id>182 ```183184 Grouped by parent heading. Number sequentially for reference.185 Closed entries live in `docs/rpm/future/done.org` — read that186 file directly if the user asks for history.187188---189190## Review1911921. Read `docs/rpm/future/tasks.org` and all linked detail files.1932. Evaluate:194 - **Organization:** tasks under logical parent headings?195 - **Dependencies:** relationships correct? Missing or circular?196 - **Staleness:** TODOs with no activity across multiple sessions?197 - **Scope:** any tasks too large for one session (~35 min)?198 Suggest decomposition.199 - **Duplicates:** overlapping tasks?200 - **Demonstrable goals:** for any `* Parent` carrying a `Goal:` /201 `Success:` line, that metric must be a **demonstrable test** (a202 pass/fail artifact that PROVES it met — "N cases pass end-to-end203 vs reference", "trace 38/38"), not a gap-checklist or a vague204 description ("launch ready"). Every `[NOT MET]` goal's task chain205 must **terminate in a verify/sign-off task** (with the build206 gap-tasks as its `:BLOCKED_BY:` deps), not merely list build207 gaps. Flag goals whose `Success:` is a gap-list/description or208 whose chain has no terminal proof task. A metric reconcile/split209 must add the "prove it" terminus in the **same** edit.210 - **Order:** work is sorted top-to-bottom by execution order211 (when it needs to get done)? Anything that should happen sooner212 than what's currently above it?213 - **Deferrals:** anything the user has set aside or signaled they214 want to come back to later? Surface as candidates for **Postpone**.2153. Present findings and proposed changes. Wait for confirmation216 before editing. For postpones, apply the move using the217 **Postpone** procedure below.218219---220221## Postpone222223Defer a task to the bottom of its `* Parent` group. Status stays224`TODO` (the task isn't dropped, just moved later in the execution225order). Adds a `:POSTPONED: YYYY-MM-DD` property so the deferral is226auditable.2272281. Read `docs/rpm/future/tasks.org`.2292. Match the argument to a task — by number (from most recent230 `/backlog list`), by text match, or by asking if ambiguous.2313. Identify the task's `* Parent` heading. Find the last `**` task232 under that parent (any status — active, blocked, or postponed).2334. Edit the file to move the matched task's heading + its property234 drawer to just below that last sibling. **Do not change status**;235 keep `** TODO`.2365. Add (or update) `:POSTPONED: YYYY-MM-DD` inside the property237 drawer with today's date. Create the drawer if the task didn't238 have one.2396. Confirm: print the moved task's new position.240241If the task is already at the bottom of its group, just stamp the242`:POSTPONED:` property and note "already at bottom".243244---245246## Done2472481. Read `docs/rpm/future/tasks.org`.2492. Match the argument to a task — by number (from most recent250 `/backlog list`), by text match, or by asking if ambiguous.2513. Change `** TODO` to `** DONE` and append today's date:252 `** DONE <description> :CLOSED: [YYYY-MM-DD]`2534. Confirm what was marked done.