feat(auto-feature): turn two blind spots into requirement documents
Deciding what to build next was an ad-hoc act: whatever the operator happened to notice. Two lenses see different work and neither is optional. The code has defects of structure - a truth held twice, a unit with two reasons to change, an input that reaches a sink unvalidated. The product has gaps of use - no --help, a stack trace where a remediation belongs, no dry-run, no empty state, a capability reachable only by reading the tests. sceptic supplies the first lens and is read-only, so running it as a pass costs nothing. The usability lens is written out as six categories, each anchored in something observable in the repository: an invented persona produces invented requirements, so a gap that cannot be anchored is dropped rather than argued. Both lists merge, deduplicate where a structural finding and a usability gap describe the same defect, and rank by blocked users before blast radius. Only then does the operator get asked - active-listening first removes every question the code, the docs or the history can answer, and what remains goes out as radio buttons where every option is a real alternative, including fix the structure instead and document the limitation and defer. The output is requirement documents and nothing else: one per feature, each traced to file:line evidence, each recording the alternatives that were rejected and why, so the next reader does not re-propose them. No implementation, no refactor, no staging. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
3071108f57
commit
c6de96f688
1 file changed
+101
@@ -0,0 +1,101 @@
|
||||
---
|
||||
name: auto-feature
|
||||
description: >
|
||||
Derive the missing work of a codebase and turn it into requirement
|
||||
documents: a sceptic pass for what the code gets structurally wrong, a
|
||||
usability pass for what the product does not do yet, then active-listening
|
||||
to confirm every proposal through single-select (radio button) questions
|
||||
before anything is written. Trigger on /auto-feature, "was fehlt noch",
|
||||
"welche features brauchen wir", or when the operator asks what to build
|
||||
next. Portable across projects.
|
||||
---
|
||||
|
||||
Two blind spots produce different work: the code has defects of structure,
|
||||
the product has gaps of use. This skill runs both lenses, ranks what comes
|
||||
out, and lets the operator choose — it writes requirement documents, never
|
||||
implementations.
|
||||
|
||||
## Step 1: fix the scope
|
||||
|
||||
Name the target in one line: repository, subsystem, role, or user-facing
|
||||
surface. Read the project's existing requirement documents first — their
|
||||
location, filename convention, and section structure are the template, and
|
||||
an already-written requirement is not a finding.
|
||||
|
||||
## Step 2: the sceptic pass
|
||||
|
||||
Invoke the `sceptic` skill on the target. Its findings become requirement
|
||||
candidates by severity: a violated SPOT, SRP, or trust boundary is work the
|
||||
product needs whether or not a user ever notices. Carry each finding's
|
||||
`file:line` evidence forward — a requirement without it is a guess.
|
||||
|
||||
## Step 3: the usability pass
|
||||
|
||||
Independently, look for what the product does not do yet. Anchor every gap
|
||||
in something observable in the repository, never in an invented persona:
|
||||
|
||||
- **Entry** — can someone install, configure, and run it without reading the
|
||||
source? Missing `--help`, missing example config, an undocumented required
|
||||
variable.
|
||||
- **Recovery** — does a failure tell the user what to do next? Errors that
|
||||
print a stack trace instead of the remediation, no dry-run, no way to undo
|
||||
or uninstall, no idempotent re-run.
|
||||
- **Feedback** — does a long operation say anything while it works? Silent
|
||||
minutes, no progress, no exit summary.
|
||||
- **Empty and edge states** — first run with no data, zero results, an
|
||||
expired credential, a partially completed run.
|
||||
- **Discoverability** — a capability that exists but nothing surfaces:
|
||||
undocumented flags, features reachable only by reading tests.
|
||||
- **Accessibility and locale** — output that assumes colour, a terminal
|
||||
width, or one language.
|
||||
|
||||
Each gap gets one line: `observed evidence -> who is blocked -> smallest
|
||||
change that unblocks them`. Drop anything you cannot anchor.
|
||||
|
||||
## Step 4: rank and ask
|
||||
|
||||
Merge both lists, drop duplicates where a structural finding and a usability
|
||||
gap describe the same defect, and rank by blocked users first, blast radius
|
||||
second.
|
||||
|
||||
Then apply `active-listening`: answer everything you can from the code, the
|
||||
docs, and the git history yourself, and put only the genuinely open decisions
|
||||
to the operator with `AskUserQuestion`, `multiSelect: false`, so every
|
||||
question renders as radio buttons. At most four questions per call, each
|
||||
option a real alternative — never one option plus filler:
|
||||
|
||||
1. **Which candidates** become requirements this run, ranked, each option
|
||||
carrying its evidence in the description.
|
||||
2. **Which shape** the chosen one takes — for a feature typically
|
||||
`Minimal version that unblocks the user`, `Full version`, `Fix the
|
||||
underlying structure instead`, `Document the limitation and defer`.
|
||||
3. **Scope boundary** — what is explicitly out of scope, when the candidate
|
||||
could grow in more than one direction.
|
||||
4. **Placement** — which requirement file or directory receives it, when the
|
||||
project has more than one.
|
||||
|
||||
Never assume an answer, never fold two decisions into one option, and never
|
||||
write a file before the answers are in.
|
||||
|
||||
## Step 5: write the requirements
|
||||
|
||||
One document per feature — a requirement that needs "and" in its title is
|
||||
two requirements. Follow the project's existing template; when there is
|
||||
none, keep it to: problem with its evidence, the decided scope and its
|
||||
boundary, definition of done as checkable criteria, and the alternatives the
|
||||
operator rejected with the reason.
|
||||
|
||||
Show the drafted document and ask for a final `Write it` / `Revise it` /
|
||||
`Discard` before touching disk.
|
||||
|
||||
## Rules
|
||||
|
||||
- Requirements only: no implementation, no refactor, no staging as part of
|
||||
this skill.
|
||||
- Every requirement traces to evidence — a `file:line`, a failing path, a
|
||||
missing artifact. A requirement whose justification is "would be nice" is
|
||||
not written.
|
||||
- Record the rejected alternatives inside the document; the next reader
|
||||
needs to know what was already considered and dismissed.
|
||||
- Close with the `confidence` skill's numbers for the analysis: how sure the
|
||||
gaps are real, and what the passes did not cover.
|
||||
Reference in new issue
Block a user