Skill: Promote Roadmap Items
Purpose
Promote scored backlog items into the roadmap's Now / Next / Later slots according to the strategic-goal capacity allocation. This is the supporting skill for the roadmap planning ceremony, and it is event-driven.
Core Objective
Primary goal: decide which items are promoted / demoted / held, based on the current strategic-goal capacity allocation and the backlog priorities, and update roadmap.md.
Success criteria (all of them must hold):
- ✅ Backlog items with a priority set were read (unset ones skipped)
- ✅ The capacity used and remaining in each roadmap tier (Now/Next/Later) was computed
- ✅ Promotion candidates were presented against the strategic_goal capacity allocation (from roadmap.md or the strategy setup)
- ✅ The user confirmed every promotion / demotion decision
- ✅ roadmap.md and the status field of each promoted item were updated
- ✅ A capacity usage report was emitted (used / total / remaining per goal)
Acceptance test: after promotion, can a reader see straight from roadmap.md which strategic_goal each Now item came from and what its priority is?
Scope Boundaries
This skill owns:
- Backlog → Roadmap promotion / demotion decisions
- Holding to the strategic_goal capacity guardrail
- Updating roadmap.md and the status of the promoted items
This skill does not own:
- Creating new backlog items (
capture-work-items) - Scoring backlog items (
prioritize-backlog) - Defining the roadmap's base structure / milestones (
define-roadmap) - Task breakdown (the AgentFabric runtime takes it)
- Requirement capture (
capture-work-items)
Handoff point: promoted Now-tier items go into capture-work-items as needed, and the AgentFabric runtime then carries out design / task breakdown / execution.
Use Cases
- Capacity freed: the previous batch of Now-tier items finished, capacity came free, and new items need pulling in
- Strategy refresh: after the strategic goals shift, re-assess whether the Now-tier items still fit
- Filling a large gap: a large gap reported by
plan-nextreaches the promotion decision after capture + prioritize - Planning on demand: the user starts roadmap planning themselves, tied to no fixed cycle
Behavior
Stage 0: read the inputs
- Read
docs/process-management/roadmap.md(the current Now / Next / Later state) - Read the backlog directory and select the items whose
priorityis set (not unset) and whosestatusis notdeclined—declinedis the terminal state for never doing it, written byprioritize-backlog, and it takes no part in promotion - Read
docs/project-overview/strategic-goals.md(the list of strategic goals) - Read the strategic-goal capacity allocation declared in roadmap.md (see Stage 1)
halt conditions:
- roadmap.md does not exist → suggest running
define-roadmapfirst - strategic-goals.md does not exist → suggest running
design-strategic-goalsfirst - every backlog item is
priority: unset→ suggest runningprioritize-backlogfirst - roadmap.md carries no capacity allocation, or no total capacity baseline → halt, and prompt for a
define-roadmaprun to settle the capacity
Stage 1: compute the current capacity state
The total capacity baseline comes from the header of the "Capacity allocation" section in roadmap.md, gathered and written by step 8 of define-roadmap (headcount × cycle − overhead, converted into effective working hours). When the baseline is missing, halt and prompt for a rerun of define-roadmap — with no denominator, no goal's allocated capacity can be worked out.
For each strategic_goal:
| Field | Meaning |
|---|---|
| Allocated capacity | that goal's percentage in roadmap.md × the total capacity baseline |
| Used capacity | the sum of effort across the current Now-tier items belonging to that goal |
| Remaining capacity | allocated - used |
Emit the capacity table:
## Current capacity usage
| Strategic Goal | Allocated | Used | Remaining | Share |
| Goal 1 (user value) | 6 person-weeks | 4 person-weeks | 2 person-weeks | 67% |
| Goal 2 (market expansion) | 2 person-weeks | 1 person-week | 1 person-week | 50% |
| Goal 3 (engineering health) | 2 person-weeks | 0 person-weeks | 2 person-weeks | 0% |
Stage 2: generate promotion candidates
Now-tier admission rule: the 3–5 top-ranked items that carry no unresolved prerequisite. Both conditions hold.
The dependency check reads each item's frontmatter depends_on (registered by map-item-dependencies):
depends_on state |
Handling |
|---|---|
— (checked, no dependency) |
may enter Now |
| has dependencies, and every prerequisite is already in Now or finished | may enter Now |
| has dependencies with an unresolved prerequisite | must not enter Now; Next is as far as it goes, and the candidate table names which one blocks it |
| field missing (never checked) | do not wave it through silently. Prompt for a map-item-dependencies run first; when the user insists on continuing, mark it "dependencies unchecked" in the candidate table and leave the risk with the user |
For each strategic_goal:
- Select the backlog items belonging to that goal
- Sort by
priority(P0 > P1 > P2 > P3) - Pull from the highest priority downward against the remaining capacity, until that goal's capacity is full or no items are left
Emit the promotion candidate table:
## Promotion candidates (Now tier)
| Goal | Item | Priority | Effort | Action |
| Goal 1 | #42 payment optimization | P0 | 2w | promote Later → Now |
| Goal 3 | #17 tech debt: auth refactor | P1 | 2w | promote Backlog → Now |
Stage 3: demotion / deferral decisions
Check the current Now-tier items:
- if the priority has dropped (a re-score after a strategy change, say) → suggest demoting it to Next or Later
- if a strategic_goal is over its capacity → suggest demoting the lowest-priority item
Emit the demotion suggestions.
Stage 4: the user confirms each decision
Present the merged list (promotions + demotions) and have the user confirm item by item:
## Confirmation list
[ ] #42 promote Later → Now?
[ ] #17 promote Backlog → Now?
[ ] #8 demote Now → Next? (over capacity + low priority)
[ ] ...
Stage 5: persist
For each confirmed decision:
- Update the item's frontmatter
status(captured→activeon entering Now;active→deferredon demotion) - Update roadmap.md, adding / removing the matching item reference
- Write the
promoted_at/demoted_attimestamp into the item's frontmatter
Stage 6: emit the final report
- Counts promoted / demoted / held
- Capacity usage after the update
- The suggested next step (
capture-work-itemsfor the newly promoted Now items, for example)
Input and Output
Input: roadmap.md + the backlog (priority set) + strategic-goals.md + the capacity allocation.
Output: the decision table in chat + the roadmap.md update + the item frontmatter update (status + promoted_at / demoted_at).
Restrictions
Hard Boundaries
- Do not promote a
priority: unsetitem (go throughprioritize-backlogfirst) - Do not promote a
status: declineditem — that terminal state means never doing it, and taking it back in needs the user to lift the terminal state explicitly - Do not exceed a strategic_goal's capacity allocation (when it is over capacity, something must be demoted before anything is promoted)
- Do not promote a P3 item into Now automatically (P3 goes to Later by default)
- Do not promote an item with an unresolved prerequisite into Now (clear the prerequisite first, or promote only as far as Next)
- Do not change the roadmap's strategic_goal capacity allocation automatically (that is
define-roadmap's job)
Skill boundaries
Not done here (other skills own it):
| Action | Owner |
|---|---|
| Creating backlog items | capture-work-items |
| Scoring the backlog | prioritize-backlog |
| Defining roadmap structure and capacity | define-roadmap |
| Breaking a Now item into tasks | AgentFabric runtime (outside AI Cortex) |
| Detailed requirement capture | capture-work-items |
Anti-Patterns
- ❌ Do not tie it to a fixed cycle ("run it every Monday") — this skill is event-driven (capacity freed / strategy change / on demand)
- ❌ Do not ignore the capacity guardrail — one goal holding a high-priority item is no licence to overrun and take another goal's capacity
- ❌ Do not promote too much at once — the Now tier caps at 3–5 items by default (a project can override it in roadmap.md), and stacking past that cap breaks the pull-based flow
- ❌ Do not act on priority-unset items — score them first
- ❌ Do not skip the dependency check — high priority does not mean it can be pulled now; a blocked item in Now just holds capacity and produces nothing
- ❌ Do not change the roadmap structure (adding a milestone, say) — that is
define-roadmap's business
Self-Check
- roadmap.md, the backlog and strategic-goals.md were read successfully
- The capacity allocation exists; where it does not, the run halted and suggested
define-roadmap - Only backlog items with
priorityset andstatusother thandeclinedwere handled - Capacity usage was computed for every strategic_goal
- Promotion candidates were generated by priority order plus the capacity constraint
- Now-tier candidates passed the dependency check; items missing
depends_onwere told to runmap-item-dependenciesfirst, not waved through silently - The Now-tier item count stays within the WIP cap (3–5 by default)
- The demotion suggestions weigh priority and over-capacity
- The user confirmed item by item; nothing was auto-approved
- roadmap.md was updated and the item frontmatter was updated
- The final capacity usage report was emitted
Examples
Example 1: freed capacity triggers a promotion (the mainstream case)
Context: 3 Now items finished during the cycle, freeing 4 person-weeks of capacity. Strategic goals: Goal 1 (60%), Goal 2 (20%), Goal 3 engineering health (20%).
Flow:
- Compute capacity — Goal 3 has 2 weeks free, Goal 1 has 2 weeks free
- Generate candidates:
- Goal 1: #42 payment optimization (P0, 2w) → promote Later → Now
- Goal 3: #17 auth refactor (P1, 2w) → promote Backlog → Now
- The user confirms item by item (all yes)
- Update roadmap.md and set the item status to active
- Capacity report: Goal 1 6/6, Goal 2 1/2, Goal 3 2/2
Result: 2 items promoted into Now; the handoff suggests running capture-work-items for the new Now items.
Example 2: a strategy refresh forces a broad re-assessment (edge case)
Context: after the quarterly strategy refresh, a new strategic goal 4 joins and Goal 3's capacity moves from 20% to 10%.
Flow:
- halt and check — the capacity allocation in roadmap.md does not reflect the new strategy
- Prompt: "the strategic goals or the capacity have changed, and this skill cannot handle a structural change. Run
define-roadmapfirst to settle the capacity allocation again." - The user runs
define-roadmap, then starts over - Re-enter promote-roadmap-items: Goal 3 turns out to be over capacity (2w in Now, new capacity 1w), so suggest demoting #17 to Next
- The user confirms → update
Result: the roadmap lines up with the strategy again; #17 is demoted but not lost.