design
Design a change — create a change container (if needed) and generate spec artifacts.
<decision_boundary>
Use for:
- Creating a new Beat change and generating spec artifacts (proposal, gherkin, design.md)
- Resuming artifact generation for an existing change that has pending spec artifacts
- Choosing which spec artifacts to include (presets: Full, Standard, Minimal, Technical, Custom)
NOT for:
- Breaking down tasks or creating execution plans (use
/beat:plan) - Exploring ideas or thinking through a problem before committing (use
/beat:explore) - Implementing code (use
/beat:apply) - Reviewing or verifying implementation (use
/beat:verify)
Trigger examples:
- "Design a user authentication feature" / "Create a change for login" / "Generate specs for X"
- Should NOT trigger: "break down the tasks" / "let me think about this" / "implement the change"
</decision_boundary>
Invoke in order: worktrees first (isolate), then brainstorming (design).
If a prerequisite skill is unavailable (not installed), continue with fallback — but NEVER skip because you judged it unnecessary.
Prerequisites (invoke before proceeding)
| Superpower | When | Priority |
|---|---|---|
| using-git-worktrees | Before first file write | MUST |
| brainstorming | Before creating proposal or design | MUST |
If a superpower is unavailable (skill not installed), skip and continue.
Rationalization Prevention
| Thought | Reality |
|---|---|
| "I don't need a worktree for just writing specs" | Without a worktree, artifacts live in the main workspace and won't carry into apply. Isolate from the start. |
| "brainstorming isn't needed, the user already described what they want" | A description is not a design. brainstorming surfaces assumptions, alternatives, and edge cases. |
| "The user wants speed, invoking superpowers will slow us down" | Skipping prerequisites produces lower-quality artifacts that cause rework during apply and verify. |
| "This change is simple enough to skip brainstorming" | Simple changes finish brainstorming quickly. Complex changes need it most. There is no middle ground where skipping helps. |
Red Flags — STOP if you catch yourself:
- Writing any file before invoking using-git-worktrees
- Generating proposal sections without having invoked brainstorming
- Creating design.md without invoking brainstorming first
- Writing gherkin scenarios that contain internal method names, numeric thresholds, or implementation constants
- Modifying an existing feature in
beat/features/without creating a.origbackup first - Writing tasks.md or
- [ ]checkboxes — tasks belong in/beat:plan - Thinking "this prerequisite isn't needed for this particular change"
Process Flow
digraph design {
"Select or create change" [shape=box];
"Invoke using-git-worktrees" [shape=box, style=bold];
"Ask artifact preset" [shape=box];
"Includes proposal?" [shape=diamond];
"Invoke brainstorming" [shape=box, style=bold];
"Create proposal" [shape=box];
"Includes gherkin?" [shape=diamond];
"Existing scenarios\nto modify?" [shape=diamond];
"Backup .orig +\ncopy to changes/" [shape=box];
"Create gherkin\n(new features only)" [shape=box];
"Includes design?" [shape=diamond];
"Create design" [shape=box];
"Commit artifacts" [shape=box];
"Show summary" [shape=doublecircle];
"Select or create change" -> "Invoke using-git-worktrees";
"Invoke using-git-worktrees" -> "Ask artifact preset";
"Ask artifact preset" -> "Includes proposal?";
"Includes proposal?" -> "Invoke brainstorming" [label="yes"];
"Includes proposal?" -> "Includes gherkin?" [label="no"];
"Invoke brainstorming" -> "Create proposal";
"Create proposal" -> "Includes gherkin?";
"Includes gherkin?" -> "Existing scenarios\nto modify?" [label="yes"];
"Includes gherkin?" -> "Includes design?" [label="no"];
"Existing scenarios\nto modify?" -> "Backup .orig +\ncopy to changes/" [label="yes"];
"Existing scenarios\nto modify?" -> "Create gherkin\n(new features only)" [label="no"];
"Backup .orig +\ncopy to changes/" -> "Create gherkin\n(new features only)";
"Create gherkin\n(new features only)" -> "Includes design?";
"Includes design?" -> "Invoke brainstorming" [label="yes, only if\nnot yet invoked"];
"Includes design?" -> "Commit artifacts" [label="no"];
"Invoke brainstorming" -> "Create design" [label="for design"];
"Create design" -> "Commit artifacts";
"Commit artifacts" -> "Show summary";
}
Input: Change name (kebab-case) OR a description of what to build. Can also be an existing change name to fast-forward remaining artifacts.
Steps
-
If no clear input provided, ask what they want to build
Use AskUserQuestion tool to ask what they want to build. Derive kebab-case name from description.
-
Create or select change
Determine the change name. Before creating any files, invoke
using-git-worktreesto isolate this change.- If
beat/changes/<name>/doesn't exist: create it (directory + status.yaml + features/.gitkeep) - If it exists: use it, read
status.yaml(schema:references/status-schema.md) to find remaining artifacts
- If
-
Ask which spec artifacts to include
Read
status.yaml. For artifacts stillpending, ask user once upfront:Use AskUserQuestion tool:
"Which spec artifacts do you want? (Tasks are handled separately by
/beat:plan)"- Full: Proposal + Gherkin + Design (recommended for large features)
- Standard: Proposal + Gherkin (recommended for medium features)
- Minimal: Gherkin only (recommended for small bug fixes)
- Technical: Proposal only, no Gherkin (for tooling/infra/refactor changes with no behavior change)
- Custom: Let me choose each one
Mark skipped artifacts as
skippedinstatus.yaml. Tasks are always set topending— task breakdown happens in/beat:plan. Updatephaseto match the latest completed spec artifact after each creation. -
Create artifacts in pipeline order
Read
beat/config.yamlif it exists (schema:references/config-schema.md). Uselanguagefor artifact output language, injectcontext, and apply matchingrulesper artifact type throughout creation.For each artifact to create (pipeline order: proposal -> gherkin -> design):
- Read all completed artifacts for context
- Invoke prerequisites per the table above (brainstorming before proposal/design — invoke once before the first artifact that needs it; skip for subsequent artifacts if already invoked)
- Create the artifact following the patterns below
- Update
status.yaml - Show brief progress: "Created "
- If context is critically unclear, pause and ask
Artifact patterns:
-
Proposal: Sections:
## Why,## What Changes,## Impact -
Gherkin:
- Read
references/feature-writing.mdfor conventions on description blocks, scenario organization, and review checklist - Before writing, scan
beat/features/**/*.featureandbeat/changes/*/features/*.feature(excluding current change) — readFeature:andScenario:lines to map existing coverage, deep-read only overlapping features, avoid duplication and align style - SpecFlow style, tags
@happy-path/@error-handling/@edge-case - Feature description carries PRD essence (must include: As a / I want / So that)
- Every scenario MUST have a testing layer tag:
@e2e(user journeys needing a running app) or@behavior(business logic testable without a full app; default@behavior) - Write at behavior level — describe what the system does ("Monthly billing adjusts for short months"), not how a function works ("calculateNextTransactionDate clamps to last day")
- Use business language — no concrete numeric thresholds, code method names, or internal constants (API contract constants are OK as shared vocabulary)
- Repeated Given steps use
Background: - Tags must serve a filtering purpose — no decorative tags
- BDD focuses on high-level acceptance; boundary values and algorithm details belong in unit tests
- If option 4 (Technical) was chosen, skip gherkin entirely
Modifying existing features (see
references/testing-conventions.mdfor full mechanism):When the scan reveals scenarios in
beat/features/that need modification:- Conflict check: scan
beat/features/**/*.feature.orig— if a.origexists for the same file, another change is modifying it. Warn and stop. - Backup: rename the original in
beat/features/to.feature.orig(hides it from BDD runners) - Copy: copy the original content to
beat/changes/<name>/features/<file>.feature - Modify: edit the scenario(s) in the
changes/copy (add/change/remove steps, add new scenarios) - Record: add the original path to
status.yamlgherkin.modifiedarray
New features that don't modify existing scenarios go directly to
changes/<name>/features/as before. - Read
-
Design: Sections:
## Approach,## Key Decisions,## Components
-
Commit artifacts and show final status
Commit all change artifacts:
git add beat/changes/<name>/ && git commitUpdate phase to the latest completed spec artifact in
status.yaml.## Design Complete: <change-name> Created: - proposal.md (or skipped) - features/*.feature (or skipped if Technical option) - design.md (or skipped) Tasks: pending (run `/beat:plan` to create execution plan) Spec artifacts ready! Review them, then run `/beat:plan` for task breakdown.
Guardrails
- Gherkin is mandatory by default -- only skip for purely technical changes (option 4: Technical)
- Ask upfront which artifacts to include (don't ask per artifact)
- If change already exists with some artifacts done, only create remaining
- If context is critically unclear, ask -- but prefer reasonable defaults to keep momentum
- Verify each artifact file exists after writing before proceeding
- Tasks are NOT created in this skill — they are handled by
/beat:plan
More from kirkchen/beat
distill
Use when extracting BDD specs from existing code — for adopting Beat in an established codebase or distilling a module into feature files
14archive
Use when finalizing a Beat change — syncs features to living documentation and archives the change — not for verifying implementation
13apply
Use when implementing a Beat change — requires gherkin or proposal artifact to be done first
13verify
Use when validating implementation completeness before archiving a Beat change
13explore
Use when thinking through ideas, investigating problems, or clarifying requirements — before or during a Beat change
13setup
Use when setting up Beat for the first time in a project or updating project configuration — not for editing beat/config.yaml directly or configuring non-Beat tools
13