Feature Decompose
Decomposes one roadmap item into one or more feature files at project/features/<slug>.md per spec/project/feature/<canonical_language>.md. This skill is the only authoring surface in the feature lifecycle that creates feature files; later status transitions belong to sprint-execute and sprint-review.
Why this is a skill, not an agent
- Mid-flow agent dispatch is the contract — the spec mandates a consistency check via the
feature-consistency-reviewer agent before draft → ready; the orchestrator that dispatches an agent is always a skill per spec/claude/skill-vs-agent/ §Hybrid pattern.
- Per-feature operator approval — title, description, acceptance criteria, test hooks, and the
verifies_sprint_value choice each require user confirmation; an agent's structured-report shape can't carry those checkpoints.
- Persistent on-disk artefact under iterative drafting — feature files live next to the roadmap and sprint corpus and are mutated again later by other skills; the iterative drafting (consistency findings → resolutions → final write) flows back into the main conversation naturally.
- Counter-dimension considered: a narrower agent prompt could sharpen acceptance-criterion phrasing, but the load-bearing dimensions here are mid-flow agent dispatch and per-step operator approval — skill wins.
User-language policy
Detect the user's language and respond in it. Feature files themselves (frontmatter, body sections, identifiers) are written in the project's primary language as declared by the consuming repo's root convention file (typically CLAUDE.md); when no primary language is declared, English is the default. Frontmatter field names, identifiers (F-<n>, R-<n>, acceptance-<n>), and the closed-vocabulary status tokens (pending, passing, skipped, failing) stay English regardless of prose language.
Preconditions
Before any write, confirm:
- The current repository carries
spec/project/feature/<canonical_language>.md. If absent, stop — the spec is the input to this skill, not optional.
project/roadmap.md exists and the target roadmap_item (passed by the user as R-<n>) is present in it; resolve its outcomes, detail, target_sprint, and mvp fields so they can be quoted into per-feature context.
project/goals.md exists and the roadmap item's outcomes list resolves; if not, stop and surface the broken outcome reference rather than guessing.
- An audience artefact exists when the project carries
project/mission.md; missing audiences block feature authoring the same way they block outcome and mission authoring (per spec/project/roadmap/ and spec/project/mission/). Dispatch audience-identify first if needed.
- A requirement artefact under
project/requirements/ covers the work being decomposed, with U_gate ≥ τ_high, per spec/project/requirements-elicitation/ § Consumer contract. When none exists or it is below threshold, dispatch requirements-elicit first, or record an explicit operator override; decomposing against unstated or weakly-understood requirements is the failure this gate prevents.
- The
feature-consistency-reviewer agent is reachable in the current plugin runtime, or the operator explicitly acknowledges the manual-fallback path and provides a manual-pass identifier of the form manual-<YYYY-MM-DD> (per spec/project/feature/ §Consistency check). The fallback is permitted only until the agent ships; once the agent is reachable, refuse to fall back.
- The next free
F-<n> ID is determinable by reading the highest existing ID under project/features/; never reuse a retired ID.
Operations
1. Decompose
The decomposition produces N ≥ 1 features for the given roadmap item; the
operator decides N.
- Restate the roadmap item. Read its YAML block from
project/roadmap.md and replay its title, outcomes, detail,
target_sprint, and mvp flag back to the operator. If detail is
coarse or backlog and the item is targeted at the current or next
sprint, stop and recommend running roadmap-refine first — decomposing a
non-fine item violates the roadmap spec.
- Propose a feature split. Suggest one to four feature titles based on
the roadmap item's body checklist (when present) or its prose. The
operator confirms the split, adds, removes, or renames before any file is
written.
- For each feature, gather:
- Title — one-line summary in the project's primary language.
- Slug — ASCII kebab-case, ≤ 6 words, derived from the title; confirm
with the operator and verify the path
project/features/<slug>.md is
free.
- Description — one to three paragraphs phrased from the end-user
perspective; ask follow-ups until the description is concrete enough
that a reader unfamiliar with the roadmap can grasp the change.
- Acceptance criteria — three to seven testable bullets, atomic and
user-visible (no workflow gates such as "PR merged"). Each bullet uses
the pattern
- [ ] **acceptance-<n>** <criterion>. One is suspicious;
more than ten suggests splitting the feature.
- Test hooks — one entry per acceptance criterion, in the format
- **acceptance-<n>** — <mechanism> — <status>, where <mechanism>
names a test path, skill name, CLI command, or manual procedure, and
<status> is one token from the closed vocabulary pending (default
at decomposition), passing, skipped, failing.
- Identify the value-verifier. Across the N features, ask the operator
whether one feature carries
verifies_sprint_value. The field is
non-null on at most one feature per sprint (per
spec/project/feature/ §Frontmatter schema). When this decomposition
produces the feature that closes the MVP per spec/project/mission/,
that feature MUST carry verifies_sprint_value: acceptance-<n>
naming the criterion that proves the sprint's value_statement. When
the operator is unsure, leave all features with
verifies_sprint_value: null — sprint-plan may reassign it later.
- Run the consistency check (mandatory; see Operation 2). Block the
write until the check completes and every
overlap or duplication
finding is resolved.
- Write the feature file(s). For each feature, render the frontmatter
with the nine fields in the declared order (
id, title,
status: draft, roadmap_item, sprint: null, created,
ended: null, verifies_sprint_value, consistency_check) and the
five required level-2 sections in the declared order (## Description,
## Acceptance criteria, ## Test hooks, ## Consistency notes,
## Risks). Optional sections (## Open questions, ## References)
MAY follow the required five.
- Confirm paths back to the operator in their language and remind
them that
draft → ready, ready → in_progress, and
in_progress → done are owned by sprint-plan, sprint-execute, and
sprint-review respectively — not by this skill.
2. Run the consistency check
Mandatory before the feature file is written with status: draft AND a
populated consistency_check frontmatter object. The check is what allows a
downstream skill to later transition draft → ready; without it, the
feature is malformed.
- Dispatch the
feature-consistency-reviewer agent with the draft
frontmatter and body assembled in step 3 of Operation 1, the resolved
roadmap_item, the slug, and a short git revision identifier
(git rev-parse --short HEAD from the dispatching skill — the agent
has no shell access by design and can't compute this itself). The
agent reviews the existing feature corpus under project/features/,
the project's primary source roots, and the spec corpus under spec/,
and returns a findings array. Confirm the working tree is a git
repository (git rev-parse --is-inside-work-tree) before invoking
the agent — the agent has no shell access, so this
skill owns that precondition.
- Manual fallback (deprecated, transitional only). The agent ships
with this skill, so the fallback is reached only when a plugin
runtime predating it can't resolve the agent at all: walk the
same investigation surface yourself — read every existing feature's
frontmatter and
## Description, scan the project's primary source
roots for already-implemented behaviour, and grep spec/ for prior
decisions that constrain the new feature. Capture findings in the
same shape the agent would emit. Acceptance of this path MUST be
explicit: ask the operator before proceeding, and surface the runtime
version gap so they know the right long-term fix is upgrading the
plugin runtime, not normalising the manual pass.
- Persist findings on the feature in two places:
- Frontmatter — populate the
consistency_check object with
performed_at: <ISO date>, agent_version: <agent-id> (or
manual-<YYYY-MM-DD> for the fallback), and a non-empty findings
list. Each finding carries kind (overlap, duplication, drift,
prior-art, or clean), target (file path or feature ID), and
resolution (merge-into <id>, supersede <id>,
split-out <ids>, proceed, or revisit-after <event>). A clean
run still records exactly one finding with kind: clean so the array
is never empty.
- Body — populate
## Consistency notes with one paragraph per
finding restating the finding in human-readable prose plus the chosen
resolution. Per spec/claude/claim-provenance/, each paragraph marks
the claim it rests on — the overlap, prior art, or drift it
asserts — as established, citing the file:line or command output
that established it, or as unestablished, naming the observation
that would settle it and stating it wasn't made; make a cheap
observation instead of taking the unestablished exit.
- Block the write when any finding has
kind: overlap or
kind: duplication and its resolution is proceed without an
explicit one-paragraph rationale in ## Consistency notes. Surface it
and ask for a non-proceed resolution or a written rationale first. A
merge-into <id> resolution is a first-class outcome and may end the
decomposition for that feature; record the choice and skip writing the
redundant file.
- Record the manual-pass author in
## Consistency notes when
agent_version starts with manual-. The spec's §Consistency check
requires naming the operator who performed the fallback; capture it as
a dedicated line of the exact form Manual pass performed by: <name>
at the top of ## Consistency notes, so an auditor can attribute the
resolution decisions without parsing prose. Every manual pass on a repo
whose plugin runtime can resolve the agent is a workflow-health
finding per spec/project/feature/ §Consistency check; the right
resolution is to upgrade the plugin runtime and rerun the check via
the agent path.
3. Re-run the consistency check on a material change
The consistency check is not a one-shot at decomposition. Per
spec/project/feature/ §Consistency check, the check MUST be re-run
while the feature is in ready or in_progress whenever any of these
material changes occur:
- the
## Description section changes by more than typo-level wording;
- an acceptance criterion is added, or its core wording (excluding the
checkbox state) is altered;
- the
roadmap_item or sprint frontmatter field is changed;
- a feature with overlapping scope is added or removed elsewhere under
project/features/.
Cosmetic edits — typo fixes, formatting, link-target normalisation, and
flipping the checkbox state of an existing acceptance criterion — MUST
NOT trigger a re-run. When a re-run is required, repeat Operation 2 but
append a new dated findings block (keyed by its own performed_at)
to the existing consistency_check object; never overwrite the
historical findings. The ## Consistency notes section gains a new dated
paragraph per re-run finding, preserving the prior notes. Re-invoking this
skill on a feature that already carries a consistency_check is the
canonical entry point for that re-run; when a downstream skill
(sprint-plan retargeting sprint, or sprint-execute adding the feature
mid-sprint) makes one of the triggering edits, it routes back here rather
than re-running the check itself.
Examples
- Read
examples/01-single-feature-from-roadmap-item.md when decomposing a single roadmap item into a feature for the first time.
- Read
examples/02-split-into-multiple-features.md when a roadmap item is large enough to warrant multiple features.
- Read
examples/03-consistency-check-overlap.md when the consistency checker reports potential overlap with existing features.
Gotchas
- The
feature-consistency-reviewer agent has no shell access (per agent-management §Tool access — read-only invariant). The dispatching call from this skill MUST confirm the working tree is a git repository (git rev-parse --is-inside-work-tree) and pass the short SHA (git rev-parse --short HEAD) as a dispatch argument; the agent uses the SHA to populate agent_version in its findings report. Skipping this step and dispatching anyway produces an agent_version: unknown field in every consistency-check result.
- The manual-fallback path is deprecated, not removed. When the agent dispatch in Operation 2 step 1 fails because the plugin runtime predates the agent's release, the operator can still walk the investigation surface manually — but the skill MUST ask explicit permission before falling back, and the resulting
consistency_check block carries agent: manual-<YYYY-MM-DD> instead of an agent name. Auditing later that bypasses surface as if it were a regular agent run mis-attributes the resolution decisions.
verifies_sprint_value is a feature-side invariant, not a sprint-side one. At most one feature per sprint carries a non-null verifies_sprint_value; setting it on two features in the same sprint is a hard violation per spec/project/feature/ §Frontmatter schema. The skill defaults the field to null on every new feature; the operator opts in explicitly when authoring or when sprint-plan reassigns the verifier.
- The
R-<n> and F-<n> ID counters are monotonic across the project's lifetime, never reused even after deletion. Deriving the next ID from "max existing ID + 1" without checking the git history's deleted IDs would silently re-use a retired ID. The skill reads the highest existing ID under project/features/ plus the highest deleted ID from git log before assigning.
Resumability
Per spec/claude/resumable-work/, this skill is resumable: true. State is persisted to .resume/feature-decompose/<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 transition a feature past
status: draft. Only sprint-plan
(draft → ready after a sprint value is assigned) and sprint-execute /
sprint-review (later transitions) own status flips. This skill writes
status: draft and stops.
- Never write a feature file without a populated
consistency_check
frontmatter object whose findings array is non-empty (a clean run still
records kind: clean) and a populated ## Consistency notes section.
- Never set
verifies_sprint_value on more than one feature per sprint
within a single decomposition; the at-most-one-per-sprint invariant is
feature-side per the spec.
- Never invent a roadmap item, an outcome, or an audience inline;
missing references block the write rather than fabricating them.
- Never rename a slug after the feature leaves
draft; the skill writes
the slug once and treats it as immutable thereafter.
- Never overwrite an existing feature file's
status with anything but
its current on-disk value: this skill re-reads the file before a rewrite
and refuses when the requested write would change status at all —
status transitions live in sprint-plan / sprint-execute /
sprint-review, each of which verifies the legal predecessor on disk. An
operator-decided lifecycle deviation is recorded as a dated deviation note
in ## Consistency notes before any status write (F-17/F-18 precedent,
#498).
- Never carry a process-internal acceptance criterion ("PR approved",
"merged to develop", "CI green"); criteria are user-visible behaviour,
not workflow gates.
- Never include effort estimates, points, due dates, or assignment
fields beyond the nine declared frontmatter fields; lints flag unknown
keys.
- Never dispatch
feature-consistency-reviewer from inside an agent
context. This is a skill operation; the parent dispatcher of this skill
is the user or another skill, never an agent.
- Never write the feature file when the operator declines to resolve an
overlap or duplication finding; the partial write would silently
break the draft → ready gate downstream.
- Never record a manual-fallback consistency pass without a
Manual pass performed by: <name> line in ## Consistency notes; the
spec requires the notes section to name the operator who performed it.
- Never overwrite historical
consistency_check.findings on a re-run;
append a new dated findings block and a new dated ## Consistency notes
paragraph per spec/project/feature/ §Consistency check, and never
trigger a re-run on a cosmetic-only edit.
- When
spec/project/feature/ disagrees with this skill, the spec wins.
Propose updating this skill rather than silently diverging.
1---2name: feature-decompose3description: Decomposes a roadmap item into feature files under project/features/ per spec/project/feature/. Invoke when the user asks to decompose a roadmap item, break down a roadmap entry into features, draft features, scaffold a feature file, plan features for the next sprint, or write a new feature. Also handles equivalent German-language requests. Walks the operator through title, description, 3-7 testable acceptance criteria, and test hooks per feature; identifies which carries `verifies_sprint_value`; dispatches `feature-consistency-reviewer` (or records a manual fallback) before allowing the feature to leave `draft`. Don't use to transition feature status (`ready → in_progress` / `in_progress → done` is `sprint-execute` / `sprint-review`) or to author roadmap items, sprints, or the mission file. Supports resume on re-invocation per `spec/claude/resumable-work/`.4---56# Feature Decompose78Decomposes one roadmap item into one or more feature files at `project/features/<slug>.md` per `spec/project/feature/<canonical_language>.md`. This skill is the only authoring surface in the feature lifecycle that creates feature files; later status transitions belong to `sprint-execute` and `sprint-review`.910## Why this is a skill, not an agent1112- **Mid-flow agent dispatch is the contract** — the spec mandates a consistency check via the `feature-consistency-reviewer` agent before `draft → ready`; the orchestrator that dispatches an agent is always a skill per `spec/claude/skill-vs-agent/` §Hybrid pattern.13- **Per-feature operator approval** — title, description, acceptance criteria, test hooks, and the `verifies_sprint_value` choice each require user confirmation; an agent's structured-report shape can't carry those checkpoints.14- **Persistent on-disk artefact under iterative drafting** — feature files live next to the roadmap and sprint corpus and are mutated again later by other skills; the iterative drafting (consistency findings → resolutions → final write) flows back into the main conversation naturally.15- Counter-dimension considered: a narrower agent prompt could sharpen acceptance-criterion phrasing, but the load-bearing dimensions here are mid-flow agent dispatch and per-step operator approval — skill wins.1617## User-language policy1819Detect the user's language and respond in it. Feature files themselves (frontmatter, body sections, identifiers) are written in the **project's primary language** as declared by the consuming repo's root convention file (typically `CLAUDE.md`); when no primary language is declared, English is the default. Frontmatter field names, identifiers (`F-<n>`, `R-<n>`, `acceptance-<n>`), and the closed-vocabulary status tokens (`pending`, `passing`, `skipped`, `failing`) stay English regardless of prose language.2021## Preconditions2223Before any write, confirm:2425- The current repository carries `spec/project/feature/<canonical_language>.md`. If absent, stop — the spec is the input to this skill, not optional.26- `project/roadmap.md` exists and the target `roadmap_item` (passed by the user as `R-<n>`) is present in it; resolve its `outcomes`, `detail`, `target_sprint`, and `mvp` fields so they can be quoted into per-feature context.27- `project/goals.md` exists and the roadmap item's `outcomes` list resolves; if not, stop and surface the broken outcome reference rather than guessing.28- An audience artefact exists when the project carries `project/mission.md`; missing audiences block feature authoring the same way they block outcome and mission authoring (per `spec/project/roadmap/` and `spec/project/mission/`). Dispatch `audience-identify` first if needed.29- A requirement artefact under `project/requirements/` covers the work being decomposed, with `U_gate ≥ τ_high`, per `spec/project/requirements-elicitation/` § Consumer contract. When none exists or it is below threshold, dispatch `requirements-elicit` first, or record an explicit operator override; decomposing against unstated or weakly-understood requirements is the failure this gate prevents.30- The `feature-consistency-reviewer` agent is reachable in the current plugin runtime, **or** the operator explicitly acknowledges the manual-fallback path and provides a manual-pass identifier of the form `manual-<YYYY-MM-DD>` (per `spec/project/feature/` §Consistency check). The fallback is permitted only until the agent ships; once the agent is reachable, refuse to fall back.31- The next free `F-<n>` ID is determinable by reading the highest existing ID under `project/features/`; never reuse a retired ID.3233## Operations3435### 1. Decompose3637The decomposition produces N ≥ 1 features for the given roadmap item; the38operator decides N.39401. **Restate the roadmap item.** Read its YAML block from41 `project/roadmap.md` and replay its `title`, `outcomes`, `detail`,42 `target_sprint`, and `mvp` flag back to the operator. If `detail` is43 `coarse` or `backlog` and the item is targeted at the current or next44 sprint, stop and recommend running `roadmap-refine` first — decomposing a45 non-`fine` item violates the roadmap spec.462. **Propose a feature split.** Suggest one to four feature titles based on47 the roadmap item's body checklist (when present) or its prose. The48 operator confirms the split, adds, removes, or renames before any file is49 written.503. **For each feature, gather:**51 - **Title** — one-line summary in the project's primary language.52 - **Slug** — ASCII kebab-case, ≤ 6 words, derived from the title; confirm53 with the operator and verify the path `project/features/<slug>.md` is54 free.55 - **Description** — one to three paragraphs phrased from the end-user56 perspective; ask follow-ups until the description is concrete enough57 that a reader unfamiliar with the roadmap can grasp the change.58 - **Acceptance criteria** — three to seven testable bullets, atomic and59 user-visible (no workflow gates such as "PR merged"). Each bullet uses60 the pattern `- [ ] **acceptance-<n>** <criterion>`. One is suspicious;61 more than ten suggests splitting the feature.62 - **Test hooks** — one entry per acceptance criterion, in the format63 `- **acceptance-<n>** — <mechanism> — <status>`, where `<mechanism>`64 names a test path, skill name, CLI command, or manual procedure, and65 `<status>` is one token from the closed vocabulary `pending` (default66 at decomposition), `passing`, `skipped`, `failing`.674. **Identify the value-verifier.** Across the N features, ask the operator68 whether one feature carries `verifies_sprint_value`. The field is69 non-null on **at most one** feature per sprint (per70 `spec/project/feature/` §Frontmatter schema). When this decomposition71 produces the feature that closes the MVP per `spec/project/mission/`,72 that feature **MUST** carry `verifies_sprint_value: acceptance-<n>`73 naming the criterion that proves the sprint's `value_statement`. When74 the operator is unsure, leave all features with75 `verifies_sprint_value: null` — `sprint-plan` may reassign it later.765. **Run the consistency check** (mandatory; see Operation 2). Block the77 write until the check completes and every `overlap` or `duplication`78 finding is resolved.796. **Write the feature file(s).** For each feature, render the frontmatter80 with the nine fields in the declared order (`id`, `title`,81 `status: draft`, `roadmap_item`, `sprint: null`, `created`,82 `ended: null`, `verifies_sprint_value`, `consistency_check`) and the83 five required level-2 sections in the declared order (`## Description`,84 `## Acceptance criteria`, `## Test hooks`, `## Consistency notes`,85 `## Risks`). Optional sections (`## Open questions`, `## References`)86 MAY follow the required five.877. **Confirm paths back to the operator** in their language and remind88 them that `draft → ready`, `ready → in_progress`, and89 `in_progress → done` are owned by `sprint-plan`, `sprint-execute`, and90 `sprint-review` respectively — not by this skill.9192### 2. Run the consistency check9394Mandatory before the feature file is written with `status: draft` AND a95populated `consistency_check` frontmatter object. The check is what allows a96downstream skill to later transition `draft → ready`; without it, the97feature is malformed.98991. **Dispatch the `feature-consistency-reviewer` agent** with the draft100 frontmatter and body assembled in step 3 of Operation 1, the resolved101 `roadmap_item`, the slug, and a short git revision identifier102 (`git rev-parse --short HEAD` from the dispatching skill — the agent103 has no shell access by design and can't compute this itself). The104 agent reviews the existing feature corpus under `project/features/`,105 the project's primary source roots, and the spec corpus under `spec/`,106 and returns a `findings` array. Confirm the working tree is a git107 repository (`git rev-parse --is-inside-work-tree`) before invoking108 the agent — the agent has no shell access, so this109 skill owns that precondition.1102. **Manual fallback (deprecated, transitional only).** The agent ships111 with this skill, so the fallback is reached only when a plugin112 runtime predating it can't resolve the agent at all: walk the113 same investigation surface yourself — read every existing feature's114 frontmatter and `## Description`, scan the project's primary source115 roots for already-implemented behaviour, and grep `spec/` for prior116 decisions that constrain the new feature. Capture findings in the117 same shape the agent would emit. Acceptance of this path **MUST** be118 explicit: ask the operator before proceeding, and surface the runtime119 version gap so they know the right long-term fix is upgrading the120 plugin runtime, not normalising the manual pass.1213. **Persist findings on the feature** in two places:122 - **Frontmatter** — populate the `consistency_check` object with123 `performed_at: <ISO date>`, `agent_version: <agent-id>` (or124 `manual-<YYYY-MM-DD>` for the fallback), and a non-empty `findings`125 list. Each finding carries `kind` (`overlap`, `duplication`, `drift`,126 `prior-art`, or `clean`), `target` (file path or feature ID), and127 `resolution` (`merge-into <id>`, `supersede <id>`,128 `split-out <ids>`, `proceed`, or `revisit-after <event>`). A clean129 run still records exactly one finding with `kind: clean` so the array130 is never empty.131 - **Body** — populate `## Consistency notes` with one paragraph per132 finding restating the finding in human-readable prose plus the chosen133 resolution. Per `spec/claude/claim-provenance/`, each paragraph marks134 the claim it rests on — the overlap, prior art, or drift it135 asserts — as **established**, citing the `file:line` or command output136 that established it, or as **unestablished**, naming the observation137 that would settle it and stating it wasn't made; make a cheap138 observation instead of taking the unestablished exit.1394. **Block the write** when any finding has `kind: overlap` or140 `kind: duplication` and its `resolution` is `proceed` without an141 explicit one-paragraph rationale in `## Consistency notes`. Surface it142 and ask for a non-`proceed` resolution or a written rationale first. A143 `merge-into <id>` resolution is a first-class outcome and may end the144 decomposition for that feature; record the choice and skip writing the145 redundant file.1465. **Record the manual-pass author** in `## Consistency notes` when147 `agent_version` starts with `manual-`. The spec's §Consistency check148 requires naming the operator who performed the fallback; capture it as149 a dedicated line of the exact form `Manual pass performed by: <name>`150 at the top of `## Consistency notes`, so an auditor can attribute the151 resolution decisions without parsing prose. Every manual pass on a repo152 whose plugin runtime can resolve the agent is a workflow-health153 finding per `spec/project/feature/` §Consistency check; the right154 resolution is to upgrade the plugin runtime and rerun the check via155 the agent path.156157### 3. Re-run the consistency check on a material change158159The consistency check is not a one-shot at decomposition. Per160`spec/project/feature/` §Consistency check, the check **MUST** be re-run161while the feature is in `ready` or `in_progress` whenever **any** of these162material changes occur:163164- the `## Description` section changes by more than typo-level wording;165- an acceptance criterion is added, or its core wording (excluding the166 checkbox state) is altered;167- the `roadmap_item` or `sprint` frontmatter field is changed;168- a feature with overlapping scope is added or removed elsewhere under169 `project/features/`.170171Cosmetic edits — typo fixes, formatting, link-target normalisation, and172flipping the checkbox state of an existing acceptance criterion — **MUST173NOT** trigger a re-run. When a re-run is required, repeat Operation 2 but174**append** a new dated `findings` block (keyed by its own `performed_at`)175to the existing `consistency_check` object; **never overwrite** the176historical findings. The `## Consistency notes` section gains a new dated177paragraph per re-run finding, preserving the prior notes. Re-invoking this178skill on a feature that already carries a `consistency_check` is the179canonical entry point for that re-run; when a downstream skill180(`sprint-plan` retargeting `sprint`, or `sprint-execute` adding the feature181mid-sprint) makes one of the triggering edits, it routes back here rather182than re-running the check itself.183184## Examples185186- Read `examples/01-single-feature-from-roadmap-item.md` when decomposing a single roadmap item into a feature for the first time.187- Read `examples/02-split-into-multiple-features.md` when a roadmap item is large enough to warrant multiple features.188- Read `examples/03-consistency-check-overlap.md` when the consistency checker reports potential overlap with existing features.189190## Gotchas191192- **The `feature-consistency-reviewer` agent has no shell access** (per `agent-management` §Tool access — read-only invariant). The dispatching call from this skill **MUST** confirm the working tree is a git repository (`git rev-parse --is-inside-work-tree`) and pass the short SHA (`git rev-parse --short HEAD`) as a dispatch argument; the agent uses the SHA to populate `agent_version` in its findings report. Skipping this step and dispatching anyway produces an `agent_version: unknown` field in every consistency-check result.193- **The manual-fallback path is deprecated, not removed.** When the agent dispatch in Operation 2 step 1 fails because the plugin runtime predates the agent's release, the operator can still walk the investigation surface manually — but the skill **MUST** ask explicit permission before falling back, and the resulting `consistency_check` block carries `agent: manual-<YYYY-MM-DD>` instead of an agent name. Auditing later that bypasses surface as if it were a regular agent run mis-attributes the resolution decisions.194- **`verifies_sprint_value` is a feature-side invariant, not a sprint-side one.** At most one feature per sprint carries a non-null `verifies_sprint_value`; setting it on two features in the same sprint is a hard violation per `spec/project/feature/` §Frontmatter schema. The skill defaults the field to `null` on every new feature; the operator opts in explicitly when authoring or when `sprint-plan` reassigns the verifier.195- **The `R-<n>` and `F-<n>` ID counters are monotonic across the project's lifetime, never reused** even after deletion. Deriving the next ID from "max existing ID + 1" without checking the git history's deleted IDs would silently re-use a retired ID. The skill reads the highest existing ID under `project/features/` plus the highest deleted ID from `git log` before assigning.196197## Resumability198199Per `spec/claude/resumable-work/`, this skill is `resumable: true`. State is persisted to `.resume/feature-decompose/<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.200201## Hard rules202203- **Never** transition a feature past `status: draft`. Only `sprint-plan`204 (`draft → ready` after a `sprint` value is assigned) and `sprint-execute` /205 `sprint-review` (later transitions) own status flips. This skill writes206 `status: draft` and stops.207- **Never** write a feature file without a populated `consistency_check`208 frontmatter object whose `findings` array is non-empty (a clean run still209 records `kind: clean`) and a populated `## Consistency notes` section.210- **Never** set `verifies_sprint_value` on more than one feature per sprint211 within a single decomposition; the at-most-one-per-sprint invariant is212 feature-side per the spec.213- **Never** invent a roadmap item, an outcome, or an audience inline;214 missing references block the write rather than fabricating them.215- **Never** rename a slug after the feature leaves `draft`; the skill writes216 the slug once and treats it as immutable thereafter.217- **Never** overwrite an existing feature file's `status` with anything but218 its current on-disk value: this skill re-reads the file before a rewrite219 and refuses when the requested write would change `status` at all —220 status transitions live in `sprint-plan` / `sprint-execute` /221 `sprint-review`, each of which verifies the legal predecessor on disk. An222 operator-decided lifecycle deviation is recorded as a dated deviation note223 in `## Consistency notes` *before* any status write (F-17/F-18 precedent,224 #498).225- **Never** carry a process-internal acceptance criterion ("PR approved",226 "merged to develop", "CI green"); criteria are user-visible behaviour,227 not workflow gates.228- **Never** include effort estimates, points, due dates, or assignment229 fields beyond the nine declared frontmatter fields; lints flag unknown230 keys.231- **Never** dispatch `feature-consistency-reviewer` from inside an agent232 context. This is a skill operation; the parent dispatcher of this skill233 is the user or another skill, never an agent.234- **Never** write the feature file when the operator declines to resolve an235 `overlap` or `duplication` finding; the partial write would silently236 break the `draft → ready` gate downstream.237- **Never** record a manual-fallback consistency pass without a238 `Manual pass performed by: <name>` line in `## Consistency notes`; the239 spec requires the notes section to name the operator who performed it.240- **Never** overwrite historical `consistency_check.findings` on a re-run;241 append a new dated `findings` block and a new dated `## Consistency notes`242 paragraph per `spec/project/feature/` §Consistency check, and never243 trigger a re-run on a cosmetic-only edit.244- When `spec/project/feature/` disagrees with this skill, the spec wins.245 Propose updating this skill rather than silently diverging.