Plan Feature — From Issue (internal)
Convert a feature-request issue into the project's planning artifacts, keeping a
clean issue → SPEC → PR(Closes #n) trace. Writes the SPEC's product half
(same two-halves convention design-feature uses) and must satisfy capability
closure before handing off — a thin issue does not get a shortcut around it.
This skill stops at the Product half. It designs, then the unit goes to
review-spec for an independent Product review; engineering planning is a
different authority's turn. Composing plan-feature-scaffold in the same breath
as the design it just wrote is the bypass this separation exists to close — the
author of a Product half cannot be the one who decides it is ready to build on.
When to use
- The
plan-feature router calls this when the input is a GitHub issue (or
--from-issue N) that describes new product capability.
If the issue is a bug or tech-debt, stop and route it: triage-issue to
classify, then plan-fix + execute-phase --fix. This skill is for
genuine features only.
Step 0 — Discover the project (always first)
Per the agent guide's Workflow conventions + documentation map, then read
what THIS skill needs: the feature SPEC template, the roadmap, and the issue/PR
templates (.github/ISSUE_TEMPLATE/, .github/PULL_REQUEST_TEMPLATE.md) so the
SPEC mirrors the fields reviewers expect. Then read the issue (forge CLI per the
project's Workflow conventions — examples use gh):
gh issue view <N> --json number,title,body,labels,state,comments
Process
Classify first. Confirm it is a feature. Not a feature if it describes a
defect, regression, duplicated code, perf debt, or carries a "when to
fix / trigger" clause → hand to triage-issue. State the verdict explicitly.
Normalize language. If not in the project's docs language (this repo:
English), translate before drafting any artifact.
Map to the roadmap. Assign the next number + slug. Identify dependencies
and conflicts with existing features, coupling/migration risks, and whether
it should instead extend an existing feature.
Close product-half gaps proactively. Compare the issue against what a
complete SPEC product half needs (goals, scope in/out, business goals,
i18n/SEO/a11y/pricing per the docs map, a UI design reference when the
feature has a UI surface), probing the same fixed vagueness rubric
design-feature's interview uses: affected users/roles · error & edge
states · data shape · boundaries & limits · out of scope · success
criteria — each slot filled or explicit n/a: <reason>. For each genuine
gap you can't safely default, ask the user one question per turn, never
batched, each with a recommended default; never ask what the issue or
docs already answer. Structural hand-off threshold: if ≥ 3 rubric
slots remain unfillable from the issue plus the answers so far, stop and
hand the feature to design-feature (the thin-issue rule below, now with
a fixed trigger) instead of continuing to interview here.
Satisfy capability closure. Walk the same fixed checklist
design-feature uses (per entity: CRUD + state transitions, each with UI +
API + test, or explicit n/a: <reason>; per capability: entry point + ACL;
per role: assigned/revoked/viewed where) into the SPEC's ## Capability closure and ## Acceptance criteria. A thin issue that doesn't carry
enough to fill it is not a shortcut around the gate — hand it to
design-feature (compose in-turn only at ≥ this skill's tier, per
Guardrails; otherwise hand off with run /design-feature <slug> and stop
here) rather than stamping designed on a hollow closure.
Size it. Estimate XS / S / M / L (scale defined in the SPEC template)
and record it in the SPEC. XS/S → the SPEC is the only planning artifact
(single-pass execution); M/L → full artifact set. If L, propose splitting.
Produce the SPEC product half. Fill it and stamp ## Design status: designed once closure is complete; set the roadmap row (added at idea
first if it didn't exist) to defined in the same edit — the same
idea → defined transition design-feature owns, performed here when this
skill is the one that satisfies closure. Then run the stage: spec readiness
preflight from the internal
evidence-grounding capability, mint the
current artifactRevisionId, and stop: this skill never continues into the
engineering half, never promotes the row past defined, and never composes
plan-feature-scaffold in this turn. The plan-feature router may scaffold only
after review-spec returns a current spec-review-pass receipt bound to these
exact bytes.
Wire traceability. Record #N in the SPEC; the PR body must include
Closes #N so the issue closes on merge.
Hand off — return exactly (fixed completion report, back to the router):
ISSUE #<N> → SPEC <slug> — size: <XS|S|M|L>
Verdict: feature (not bug/debt — else this would have routed to triage-issue)
Gaps closed: <n> asked / <n> defaulted (logged) Closure: designed | handed to design-feature
Readiness: READY-FOR-REVIEW | NEEDS-EVIDENCE | NEEDS-DESIGN Artifact revision: <id>
Traceability: Closes #<N> wired
→ review-spec next (engineering planning is gated on its receipt; do not scaffold here)
Guardrails
- Don't silently expand scope beyond the issue — surface additions as proposals.
- Don't open the feature branch or write code here.
- Don't plan engineering work here. No Engineering half, no phases, no
defined → planned promotion, no in-turn plan-feature-scaffold composition:
the Product half this skill writes must be reviewed by review-spec first, and
readiness READY-FOR-REVIEW is not that review.
- Keep the
Closes #N link; an issue-born feature must close it.
- Never stamp
## Design status: designed with a blank Capability closure
row — the same rule design-feature follows; a thin issue hands off
instead of faking closure.
- Composition tier. Composing
design-feature in-turn for a thin issue is
allowed only when this skill is running at ≥ design-feature's tier
(planning-class — strongest model / highest effort); otherwise hand off
(run /design-feature <slug>) rather than under-power it.
- Otherwise honor the project's Workflow conventions (branch/PR, docs-language).
Architectural invariants
The planning preflight owns the normalized
repository state read and the ONE final architectural classification for the
whole plan. Consume it here before writing the product half: for each applicable
invariant rule, cite its ID and repository evidence and classify the issue
proposal as preserves, violates, introduces, or changes. Only
preserves can be stamped designed; every other classification stops for an
explicit architectural decision through the project-declared authority — never
before the full plan exists, and never inferred from the issue body, SPEC, or
passing test.
Relationship to other skills
triage-issue — decides bug vs feature vs defer; call it if unsure.
plan-fix — the fix-side sibling for bug/debt issues.
design-feature — receives thin issues this skill cannot safely close
capability closure for; both write the SPEC's product half in the same format.
review-spec — the mandatory next hop for every issue-derived feature: it
reviews and receipts the Product half this skill produced.
plan-feature-scaffold — fills the engineering half later, only once
review-spec passed. This skill never invokes it.
execute-phase — executes the phases; its PR carries Closes #N.
Done when
- A filled SPEC product half exists, roadmap-registered at
defined, with the
stage: spec readiness block printed and the current artifactRevisionId
recorded.
- Capability closure is satisfied (or the issue was handed off to
design-feature instead of faking it) and ## Design status is accurate.
- The roadmap row status is
defined (added at idea first if new) whenever
## Design status: designed was stamped — never defined on a hollow
closure, never left at idea once designed is stamped.
- Nothing was scaffolded: no Engineering half, no phases, no
planned write, and
the fixed report hands off to /review-spec.
#N is recorded and the PR plan includes Closes #N.
- Scope gaps were resolved with the user, not assumed.
1---2name: plan-feature-from-issue3description: Internal step of plan-feature: turn a feature-request issue into a scoped, sized, roadmap-mapped SPEC **product half** (capability closure satisfied) with Closes #N traceability.4license: MIT5---67# Plan Feature — From Issue (internal)89Convert a feature-request issue into the project's planning artifacts, keeping a10clean issue → SPEC → PR(Closes #n) trace. Writes the SPEC's **product half**11(same two-halves convention `design-feature` uses) and must satisfy capability12closure before handing off — a thin issue does not get a shortcut around it.1314**This skill stops at the Product half.** It designs, then the unit goes to15`review-spec` for an independent Product review; engineering planning is a16different authority's turn. Composing `plan-feature-scaffold` in the same breath17as the design it just wrote is the bypass this separation exists to close — the18author of a Product half cannot be the one who decides it is ready to build on.1920## When to use2122- The `plan-feature` router calls this when the input is a GitHub issue (or23 `--from-issue N`) that describes new product capability.2425If the issue is a **bug or tech-debt**, stop and route it: `triage-issue` to26classify, then `plan-fix` + `execute-phase --fix`. This skill is for27genuine features only.2829## Step 0 — Discover the project (always first)3031Per the agent guide's **Workflow conventions** + **documentation map**, then read32what THIS skill needs: the feature SPEC template, the roadmap, and the issue/PR33templates (`.github/ISSUE_TEMPLATE/`, `.github/PULL_REQUEST_TEMPLATE.md`) so the34SPEC mirrors the fields reviewers expect. Then read the issue (forge CLI per the35project's Workflow conventions — examples use `gh`):3637```sh38gh issue view <N> --json number,title,body,labels,state,comments39```4041## Process42431. **Classify first.** Confirm it is a feature. Not a feature if it describes a44 defect, regression, duplicated code, perf debt, or carries a "when to45 fix / trigger" clause → hand to `triage-issue`. State the verdict explicitly.462. **Normalize language.** If not in the project's docs language (this repo:47 **English**), translate before drafting any artifact.483. **Map to the roadmap.** Assign the next number + slug. Identify dependencies49 and conflicts with existing features, coupling/migration risks, and whether50 it should instead extend an existing feature.514. **Close product-half gaps proactively.** Compare the issue against what a52 complete SPEC **product half** needs (goals, scope in/out, business goals,53 i18n/SEO/a11y/pricing per the docs map, a UI design reference when the54 feature has a UI surface), probing the same fixed **vagueness rubric**55 `design-feature`'s interview uses: affected users/roles · error & edge56 states · data shape · boundaries & limits · out of scope · success57 criteria — each slot filled or explicit `n/a: <reason>`. For each genuine58 gap you can't safely default, ask the user **one question per turn, never59 batched**, each with a recommended default; never ask what the issue or60 docs already answer. **Structural hand-off threshold:** if ≥ 3 rubric61 slots remain unfillable from the issue plus the answers so far, stop and62 hand the feature to `design-feature` (the thin-issue rule below, now with63 a fixed trigger) instead of continuing to interview here.645. **Satisfy capability closure.** Walk the same fixed checklist65 `design-feature` uses (per entity: CRUD + state transitions, each with UI +66 API + test, or explicit `n/a: <reason>`; per capability: entry point + ACL;67 per role: assigned/revoked/viewed where) into the SPEC's `## Capability68 closure` and `## Acceptance criteria`. **A thin issue that doesn't carry69 enough to fill it is not a shortcut around the gate** — hand it to70 `design-feature` (compose in-turn only at ≥ this skill's tier, per71 *Guardrails*; otherwise hand off with `run /design-feature <slug>` and stop72 here) rather than stamping `designed` on a hollow closure.736. **Size it.** Estimate `XS / S / M / L` (scale defined in the SPEC template)74 and record it in the SPEC. XS/S → the SPEC is the only planning artifact75 (single-pass execution); M/L → full artifact set. If L, propose splitting.767. **Produce the SPEC product half.** Fill it and stamp `## Design status:77 designed` once closure is complete; set the roadmap row (added at `idea`78 first if it didn't exist) to `defined` in the same edit — the same79 `idea → defined` transition `design-feature` owns, performed here when this80 skill is the one that satisfies closure. Then run the `stage: spec` readiness81 preflight from the internal82 [`evidence-grounding`](<../evidence-grounding/SKILL.md>) capability, mint the83 current `artifactRevisionId`, and **stop**: this skill never continues into the84 engineering half, never promotes the row past `defined`, and never composes85 `plan-feature-scaffold` in this turn. The `plan-feature` router may scaffold only86 after `review-spec` returns a current `spec-review-pass` receipt bound to these87 exact bytes.888. **Wire traceability.** Record `#N` in the SPEC; the PR body must include89 `Closes #N` so the issue closes on merge.909. **Hand off — return exactly** (fixed completion report, back to the router):9192 ```93 ISSUE #<N> → SPEC <slug> — size: <XS|S|M|L>94 Verdict: feature (not bug/debt — else this would have routed to triage-issue)95 Gaps closed: <n> asked / <n> defaulted (logged) Closure: designed | handed to design-feature96 Readiness: READY-FOR-REVIEW | NEEDS-EVIDENCE | NEEDS-DESIGN Artifact revision: <id>97 Traceability: Closes #<N> wired98 → review-spec next (engineering planning is gated on its receipt; do not scaffold here)99 ```100101## Guardrails102103- Don't silently expand scope beyond the issue — surface additions as proposals.104- Don't open the feature branch or write code here.105- **Don't plan engineering work here.** No Engineering half, no phases, no106 `defined → planned` promotion, no in-turn `plan-feature-scaffold` composition:107 the Product half this skill writes must be reviewed by `review-spec` first, and108 readiness `READY-FOR-REVIEW` is not that review.109- Keep the `Closes #N` link; an issue-born feature must close it.110- **Never stamp `## Design status: designed` with a blank Capability closure111 row** — the same rule `design-feature` follows; a thin issue hands off112 instead of faking closure.113- **Composition tier.** Composing `design-feature` in-turn for a thin issue is114 allowed only when this skill is running at ≥ `design-feature`'s tier115 (planning-class — strongest model / highest effort); otherwise hand off116 (`run /design-feature <slug>`) rather than under-power it.117- Otherwise honor the project's **Workflow conventions** (branch/PR, docs-language).118119## Architectural invariants120121The [planning preflight](<../planning-preflight/SKILL.md>) owns the normalized122repository state read and the ONE final architectural classification for the123whole plan. Consume it here before writing the product half: for each applicable124invariant rule, cite its ID and repository evidence and classify the issue125proposal as `preserves`, `violates`, `introduces`, or `changes`. Only126`preserves` can be stamped `designed`; every other classification stops for an127explicit architectural decision through the project-declared authority — never128before the full plan exists, and never inferred from the issue body, SPEC, or129passing test.130131## Relationship to other skills132133- `triage-issue` — decides bug vs feature vs defer; call it if unsure.134- `plan-fix` — the fix-side sibling for bug/debt issues.135- `design-feature` — receives thin issues this skill cannot safely close136 capability closure for; both write the SPEC's product half in the same format.137- `review-spec` — the mandatory next hop for every issue-derived feature: it138 reviews and receipts the Product half this skill produced.139- `plan-feature-scaffold` — fills the engineering half later, only once140 `review-spec` passed. This skill never invokes it.141- `execute-phase` — executes the phases; its PR carries `Closes #N`.142143## Done when144145- A filled SPEC product half exists, roadmap-registered at `defined`, with the146 `stage: spec` readiness block printed and the current `artifactRevisionId`147 recorded.148- Capability closure is satisfied (or the issue was handed off to149 `design-feature` instead of faking it) and `## Design status` is accurate.150- The roadmap row status is `defined` (added at `idea` first if new) whenever151 `## Design status: designed` was stamped — never `defined` on a hollow152 closure, never left at `idea` once `designed` is stamped.153- Nothing was scaffolded: no Engineering half, no phases, no `planned` write, and154 the fixed report hands off to `/review-spec`.155- `#N` is recorded and the PR plan includes `Closes #N`.156- Scope gaps were resolved with the user, not assumed.