roadmap-plan¶
Fügt Roadmap-Items hinzu, retargetet sie und passt sie an in project/roadmap.md mit vollständiger Lifecycle-Validierung.
Adds, retargets, and reshapes roadmap items in project/roadmap.md per spec/project/roadmap/ and spec/project/mission/. Invoke when the user asks to \"add a roadmap item\", \"queue work for sprint N\", \"promote roadmap item to fine\", \"retarget R-3 to sprint 9\", \"flip MVP on this item\", or equivalent German-language requests. Validates outcome IDs against goals.md, validates target_sprint against project/sprints/, enforces the lifecycle transitions declared in the roadmap and mission specs (including the asymmetric MVP-flag rule: false→true allowed before stabilisation, true→false forbidden after the item entered status: active), and refuses partial writes that would leave inconsistencies. Don't use to scaffold the roadmap from scratch (use roadmap-init) or to enforce the detail-level invariant (use roadmap-refine). Supports resume on re-invocation per spec/claude/resumable-work/.
- Plugin:
nolte-shared - Phase: 2 Plan (
plan) - Tags:
planning - Quelle: skills/roadmap-plan/SKILL.md
Anwenden wenn¶
- you want to add a roadmap item or queue work for sprint N
- you want to retarget an existing roadmap item to another sprint
- you want to flip the MVP flag on a roadmap item
Nicht anwenden wenn¶
- project/roadmap.md does not exist yet →
roadmap-init - You want to enforce the queue-wide detail-level invariant →
roadmap-refine
Siehe auch¶
Referenziert von¶
roadmap-coherence-reviewerfeature-decomposeissue-orchestratemission-reviserequirements-elicitroadmap-initroadmap-refine
Roadmap Plan¶
Mutates the queue in project/roadmap.md per spec/project/roadmap/<canonical_language>.md and the cross-cutting MVP semantics declared by spec/project/mission/<canonical_language>.md. Owns adds, detail promotions, sprint retargets, MVP flips, and lifecycle transitions on existing items. The detail-level invariant is checked here on every write; the wider per-queue audit belongs to roadmap-refine.
Why this is a skill, not an agent¶
- Mid-flow interactivity is the contract — every mutation (new item draft, sprint retarget, MVP flip) needs explicit confirmation before it hits disk; an agent's structured-report shape would lose the per-edit gate.
- Output flows back into the main conversation — drafted items, validated cross-references, and lifecycle warnings all need to be readable in the working context so the user can iterate before confirming.
- Orchestrator role — when this skill discovers that the audience artefact or the goals file is missing, it dispatches
audience-identifyorroadmap-initand resumes; when fixes spread across the queue, it cooperates withroadmap-refine. The orchestrator stays in skill form perskill-vs-agent. - Counter-dimension considered: a narrow agent could sharpen the cross-reference validation pass (resolve every
O-<n>and everytarget_sprintin one shot), but the load-bearing dimension is the per-mutation user dialogue, not the validator's output specialisation — skill wins.
User-language policy¶
Detect the user's language and respond in it. Item titles, bodies, and any prose written into project/roadmap.md use the project's primary language (the same language already used in goals.md and roadmap.md).
Preconditions¶
Before any mutation:
project/roadmap.mdandproject/goals.mdexist. When either is missing, stop and direct the user toroadmap-init.- The roadmap parses end-to-end; a partially-parsed file is rejected because partial writes risk corrupting items the parser couldn't reach.
project/sprints/is reachable when the requested mutation cites atarget_sprint; otherwise the cross-reference can't be validated and the mutation is refused.project/mission.mdmay or may not exist. When it exists, every roadmap item carries themvpfield; when it does not, items MAY carrymvp: falseuniformly or omit the field entirely. This skill respects whichever shape the file already uses and refuses to mix the two on a single write.- A new or retargeted item whose scope is not yet precisely understood should be informed by a requirement artefact under
project/requirements/, perspec/project/requirements-elicitation/§ Consumer contract. When the item's requirements are unstated or itsU_gateis belowτ_high, dispatchrequirements-elicitfirst, or record an explicit operator override; the roadmap should queue understood work, not guesses.
Operations¶
1. add — append a new roadmap item¶
- Collect from the user:
- Title — one line in the project's primary language.
- Outcomes — at least one
O-<n>fromgoals.md. When the user names an outcome that does not yet exist, refuse and direct them to add it via the goals workflow first; do not invent outcomes inline. - Detail —
fine,coarse, orbacklog. When the user requestsfineand supplies notarget_sprint, ask whether the item is genuinely near-term enough to justify the body depth. target_sprint— integer sprint number or null. Resolve againstproject/sprints/; a number that does not match a sprint file is refused. A number pointing at aclosedorcancelledsprint is refused (the spec rejects items whosetarget_sprintpoints at a terminal sprint as a lint violation).mvp— boolean, only whenproject/mission.mdexists. Default tofalseand ask the user to confirm before flipping totrue;mvp: truecarries the achievability bound from the mission spec.status— defaults toproposed. Direct creation asactiveordoneis refused; lifecycle transitions are owned by step 4.- Assign a fresh
idof shapeR-<n>where<n>is monotonic and never reused — including past IDs that have since been deleted. - Draft the body to the depth required by
detail: fine— paragraph stating the user-visible change plus a feature checklist (titles only; actual feature schema lives inspec/project/feature/).coarse— one or two sentences describing the intent.backlog— a single sentence.- Validate the detail-level invariant before writing: when the new item's
target_sprintresolves to the current or next sprint (per the resolution rule inspec/project/roadmap/§Detail-level convention and refinement rule),detailMUST befine. Refuse otherwise. - Show the drafted item to the user and iterate until approved. Only then append it to
project/roadmap.mdin the appropriate phase section (or at the end when the file is flat).
2. promote — move coarse or backlog to fine¶
- Locate the item by
id. - Refuse the promotion when
statusiscancelled(cancelled items are archival per the lifecycle). - Draft the missing body shape: paragraph plus feature checklist.
- Show the diff and confirm with the user.
- Write the change in one operation; refuse partial writes that would leave a
fineYAML field paired with acoarse-shaped body.
3. retarget — change target_sprint¶
- Locate the item by
id. - Resolve the new
target_sprintagainstproject/sprints/. Reject: - non-existent sprint numbers;
- sprint numbers whose file shows
status: closedorstatus: cancelled; - retargets that move a
mvp: trueitem off a sprint while leavingdetail: fineintact when no successor sprint is in the current/next window — surface this and ask the user whether to also demote detail. - Re-check the detail-level invariant after the retarget. When the new
target_sprintresolves to the current or next sprint anddetailis notfine, refuse the retarget; route throughpromotefirst. - Special case
nullretarget: settingtarget_sprint: nullis always allowed (the item drops back to unscheduled). The spec explicitly namesnullas a valid post-closure state. - Show the diff and confirm with the user.
4. transition — advance status¶
The roadmap spec permits exactly these transitions:
proposed → activeactive → doneproposed → cancelledactive → cancelled
Every other transition (in particular proposed → done and any path back from cancelled) is refused.
Additional gates:
active → donerequires that every feature this item spawned (underproject/features/) is itselfdone, and that the corresponding sprint has reachedclosed(specificallyclosed, notcancelled). When a sprint reachescancelledwith features attached, the item remainsactiveuntil the pending features are re-targeted to a successor sprint that itself reachesclosed. This skill checks the sprint state viaproject/sprints/; when the gate fails, refuse the transition with a verbatim error citing the spec.proposed → activeis normally driven bysprint-executewhen a feature on the item entersin_progress; this skill performs the transition only when explicitly requested by the user and only when no sprint-side state would be left inconsistent.
5. mvp-flip — change the mvp boolean¶
The mission spec governs the asymmetry:
false → trueis allowed at any time before the project'smvp_statusreachesstabilised. Once stabilised,false → trueis refused with a verbatim error.true → falseis allowed only while the item'sstatusis stillproposed. Once the item entersstatus: active, the flip fromtruetofalseis forbidden because removing it from MVP scope retroactively breaks the achievability bound the SMART contract relies on.
Read project/mission.md to resolve mvp_status when the file exists; when it does not exist, the asymmetric rule is dormant and the flag's only constraint is the on-disk consistency declared by the roadmap spec. Show the user which rule the skill applied to their flip and confirm before writing.
6. Validate every write end-to-end¶
After any mutation, before the file is written:
- Every item's
outcomeslist resolves: eachO-<n>exists ingoals.md. Emptyoutcomeslists are refused. - Every non-null
target_sprintresolves to a sprint file underproject/sprints/, and the sprint is not in a terminal status that would make the reference a lint violation. - Every item with
target_sprintequal to the current or next sprint carriesdetail: fine. - Every YAML block carries the seven required keys in the declared order (
id,title,detail,outcomes,target_sprint,mvp,status); whenproject/mission.mddoes not exist, omittingmvpuniformly is also acceptable as long as the file is consistent. - Every
idis unique within the file and follows theR-<n>shape.
When any check fails, refuse the write entirely. Do not produce partial output. Show the failing check and let the user choose to fix the input or abort.
Gotchas¶
- The MVP-flag rule is asymmetric.
mvp: false → trueis allowed before stabilisation;mvp: true → falseis forbidden after the item enteredstatus: active(perspec/project/mission/). The skill enforces both directions, but the operator routinely confuses the two — flag flips on already-active MVP items get refused with a verbatim error citing the spec section. R-<n>IDs are monotonic across the project's lifetime, never reused even after deletion. The skill reads the highest existing ID under the roadmap plus the highest deleted ID fromgit log -- project/roadmap.mdbefore assigning. Reusing a retired ID would silently bind two different features to the same ID across the project's history.target_sprintpointing at aclosedorcancelledsprint isn't this skill's violation — that's a separate lint owned byroadmap-refine. The skill surfaces the situation as an informational note and refuses to retarget directly; the operator either accepts the note or runsroadmap-refinefor the cross-queue fix.- Mission file presence changes the schema. When
project/mission.mdexists, every roadmap item carries anmvp: boolfield; when the mission file is absent, the field is silently dropped. Authoring a roadmap item in a mission-less project and later adding the mission flips every item to require a defaultmvp: false— this skill won't backfill silently; the operator runs a follow-up pass withmission-definefirst. outcomesresolution againstgoals.mdis strict. An outcome ID that doesn't exist ingoals.mdblocks the write; there's no "warn-and-continue" mode. When the operator wants a placeholder outcome, they must add the outcome togoals.mdfirst via the goals-authoring path; this skill doesn't author outcomes.
Examples¶
- Read
examples/01-add-item-target-sprint.mdwhen adding a new roadmap item and targeting it to a specific sprint. - Read
examples/02-flip-mvp-flag-asymmetric.mdwhen flipping themvpflag on an item and you need to see the asymmetry rules in action. - Read
examples/03-retarget-and-promote-detail.mdwhen retargeting an item to a different sprint and promoting it fromcoarsetofinedetail.
Resumability¶
Per spec/claude/resumable-work/, this skill is resumable: true. State is persisted to .resume/roadmap-plan/<run-id>.yml after every successful user-approval gate and after each named phase boundary. On re-invocation, scan that directory for files with status: in_progress whose inputs: snapshot matches the current invocation; if one matches, prompt the operator with Resume run <run_id> from phase <phase> (last checkpoint <last_checkpoint_at>)? [resume / start-new / discard]. The state-file envelope (schema_version, run_id, inputs, phase, decisions[], status, ...) and the fail-closed semantics on schema or YAML errors are load-bearing in the spec; don't duplicate those rules here.
Hard rules¶
- Never invent outcomes, audience entries, or sprint numbers inline. Missing outcomes route to the goals workflow; missing audiences route to
audience-identify; non-existent sprint numbers are refused. - Never assign an
R-<n>ID that has already existed in the file's history (even if currently deleted). IDs are monotonic and never reused. - Never allow
proposed → doneor any transition back fromcancelled. Directproposed → doneis forbidden because every done item must have been actively worked on. - Never flip
mvp: true → falseafter the item enteredstatus: active. The asymmetry is mandated byspec/project/mission/. - Never flip
mvp: false → trueaftermvp_statusreachedstabilised. Surface a verbatim error citing the mission spec. - Never retarget an item to a
closedorcancelledsprint. The valid post-terminal values arenullor aplannedsprint number. - Never leave a
fine-flagged YAML field paired with a body that lacks the required paragraph plus feature checklist. The two surfaces are written in the same operation. - Never allow partial writes when end-to-end validation fails. Refuse the whole mutation and report the failing check.
- Never mix shapes on a single write: when
project/mission.mdexists, every item carriesmvp; when it does not, the file uses a uniform stance (all items omit, or all items carrymvp: false). Do not introducemvpon a subset. - When
spec/project/roadmap/(or, for the MVP semantics,spec/project/mission/) disagrees with this skill, the spec wins. Propose updating this skill rather than silently diverging.
Multi-model testing¶
Examples and operations in this skill are verified on Claude Sonnet 4.6 as the default model; spot-checked on Haiku 4.5 for cost-sensitive runs; Opus 4.7 is appropriate for high-stakes audits that require deeper reasoning. The skill body has no model-specific assumptions beyond standard tool-call semantics.