/story-time
Start the Specify phase of the SPARK loop: the Product Owner interrogates a product idea and turns it into a spec with user stories and testable acceptance criteria. Use when the user brings a new feature idea, product idea or change request that has no spec yet — or wants an
Claude Code
$ npx -y skills add a-lottes/aSPARK --skill story-time --agent claude-code
Codex
$ npx skills add a-lottes/aSPARK --skill story-time -a codex -y
Cursor
$ npx skills add a-lottes/aSPARK --skill story-time -a cursor -y
Gemini CLI
$ npx skills add a-lottes/aSPARK --skill story-time -a gemini-cli -y
GitHub Copilot
$ npx skills add a-lottes/aSPARK --skill story-time -a github-copilot -y
OpenCode
$ npx skills add a-lottes/aSPARK --skill story-time -a opencode -y
Windsurf
$ npx skills add a-lottes/aSPARK --skill story-time -a windsurf -y
SKILL.md
story-time.SKILL.mdname: story-time
description: >
Start the Specify phase of the SPARK loop: the Product Owner interrogates a
product idea and turns it into a spec with user stories and testable
acceptance criteria. Use when the user brings a new feature idea, product
idea or change request that has no spec yet — or wants an existing spec
challenged and reworked.
/story-time — Specify (Product Owner)
You are running the **Specify** ceremony. The Product Owner challenges the idea; the outcome is a spec — or the insight that the idea shouldn't be built.
Input
The user's feature idea, usually passed as the command argument. If no idea was provided, ask for it before doing anything else.
Instead of an idea, the argument may be a bare GitHub issue number (`/story-time 42`). Anything else — `#42`, a full issue URL, prose — is treated as the idea text itself, not as a ticket reference; only a bare number triggers the fetch below. Default when no argument is passed: unchanged from today — ask for the idea, no ticket prompt, no mention that import is possible. When an issue number **is** passed: resolve the current repo **once**, from `origin` (`git remote get-url origin` / `gh repo view`), and echo the resolved `owner/repo` to the user before fetching — this is the only network-facing step in this ceremony, and the user should see which repo it's about to read. If `origin` can't be resolved unambiguously (no `origin`, or several remotes and no `origin`), **STOP** and report that plainly — never guess a repo. Otherwise run `gh issue view <n> --repo <resolved owner/repo> --json number,title,body,url` — pinned to the same repo just echoed, never left for `gh` to re-resolve on its own. If the issue doesn't exist, the repo is private without access, or `gh` is missing or unauthenticated, **STOP**, report the real error in plain language, and ask whether to proceed with a manually supplied idea instead — never proceed silently with an empty or invented brief. On success, pass the fetched `title`+`body`+`url` into step 3 as **the idea** — everything downstream (interrogation, Clarify pass, gate) proceeds exactly as it would for a typed idea; a ticket is a seed for step 3's input, never a substitute for what steps 3–8 do with it. If the target project's `.spark/` is tracked in git, state once, before writing, that the imported title/description is about to become part of a (possibly public) committed artifact, so the maintainer can decide whether that ticket's content belongs there.
Steps
1. **Name the feature.** Derive a short kebab-case feature name from the idea (e.g. `weekly-stats-dashboard`). If `.spark/<feature-name>/` already exists, ask the user whether to rework that spec or pick a new name. Exception: a bare issue number whose existing spec has a `Gate comment` URL is a **resume**, not a rework: skip steps 3-7 and continue at step 8 with *Ticket gate question* step 3. 2. **Resolve active lenses.** The constitution is the single source of truth. If `.spark/constitution.md` has a *Project Profile & Active Lenses* section, take the active lenses from it and pass their paths in step 3. If there's **no constitution**, do **not** resolve or apply lenses for this run — only give a lightweight **nudge**: glance at the repo (signals in `${CLAUDE_PLUGIN_ROOT}/lenses/README.md`), name the likely type(s) in one line (e.g. "this looks like a public `website` — an `seo` lens would apply"), and point the user to `/charter` to record the profile so the lens activates for every phase. No lens is applied off a fallback guess; nothing is switched on without a constitution entry the user confirmed. 3. **Delegate to the Product Owner.** Pick the model first: if `.spark/constitution.md` §11 names a model for `product-owner`, pass exactly that as the agent call's `model`; if it names none, or there is no constitution or no §11, pass no model, so the agent's own default (`sonnet`) applies. Then invoke the `product-owner` agent with: the user's idea verbatim (or the fetched title+body, if this run started from an issue number — say so explicitly to the agent, don't let it rediscover the source), the feature name, the path `.spark/<feature-name>/spec.md`, and the spec template from `${CLAUDE_PLUGIN_ROOT}/templates/spec.md`. Point it at `.spark/constitution.md` if that file exists — the spec must live within it. Pass the paths of any active lenses (`${CLAUDE_PLUGIN_ROOT}/lenses/<name>.md`) so the PO captures their concerns as measurable NFRs. If this run started from an issue number, also tell it to cite the reference in the spec's `Ticket` row and state once, in §1, that the spec was seeded from that issue, with its URL. 4. **Relay, don't guess.** If the agent returns open questions instead of a spec, put them to the user (use AskUserQuestion where the options are enumerable), then re-invoke the agent with the answers. Repeat until the spec is drafted. 5. **Run the Clarify pass.** Once a draft exists, have the PO scan it for ambiguity against its taxonomy (functional boundaries, data, permissions, error/edge cases, NFRs, integrations, UX states, out-of-scope). Put the returned clarification questions to the user — AskUserQuestion for enumerable choices — and re-invoke the agent to fold each answer into the right section and log it in the spec's *Clarifications* table. Repeat until no high-impact ambiguity is left unresolved or unparked. Don't skip this because the draft "looks complete" — that's exactly when a whole category is silently missing. 6. **Present the result.** Show the user: the sharpened problem statement, the story list with MoSCoW priorities, the non-functional requirements, the named risks/assumptions, what was clarified, and what was cut to Out of Scope. If the PO recommends *not* building the feature, lead with that recommendation and its reasons. 7. **Iterate.** Fo
Read more
name: story-time description: > Start the Specify phase of the SPARK loop: the Product Owner interrogates a product idea and turns it into a spec with user stories and testable acceptance criteria. Use when the user brings a new feature idea, product idea or change request that has no spec yet — or wants an existing spec challenged and reworked.
/story-time — Specify (Product Owner)
You are running the **Specify** ceremony. The Product Owner challenges the idea; the outcome is a spec — or the insight that the idea shouldn't be built.
Input
The user's feature idea, usually passed as the command argument. If no idea was provided, ask for it before doing anything else.
Instead of an idea, the argument may be a bare GitHub issue number (`/story-time 42`). Anything else — `#42`, a full issue URL, prose — is treated as the idea text itself, not as a ticket reference; only a bare number triggers the fetch below. Default when no argument is passed: unchanged from today — ask for the idea, no ticket prompt, no mention that import is possible. When an issue number **is** passed: resolve the current repo **once**, from `origin` (`git remote get-url origin` / `gh repo view`), and echo the resolved `owner/repo` to the user before fetching — this is the only network-facing step in this ceremony, and the user should see which repo it's about to read. If `origin` can't be resolved unambiguously (no `origin`, or several remotes and no `origin`), **STOP** and report that plainly — never guess a repo. Otherwise run `gh issue view <n> --repo <resolved owner/repo> --json number,title,body,url` — pinned to the same repo just echoed, never left for `gh` to re-resolve on its own. If the issue doesn't exist, the repo is private without access, or `gh` is missing or unauthenticated, **STOP**, report the real error in plain language, and ask whether to proceed with a manually supplied idea instead — never proceed silently with an empty or invented brief. On success, pass the fetched `title`+`body`+`url` into step 3 as **the idea** — everything downstream (interrogation, Clarify pass, gate) proceeds exactly as it would for a typed idea; a ticket is a seed for step 3's input, never a substitute for what steps 3–8 do with it. If the target project's `.spark/` is tracked in git, state once, before writing, that the imported title/description is about to become part of a (possibly public) committed artifact, so the maintainer can decide whether that ticket's content belongs there.
Steps
1. **Name the feature.** Derive a short kebab-case feature name from the idea (e.g. `weekly-stats-dashboard`). If `.spark/<feature-name>/` already exists, ask the user whether to rework that spec or pick a new name. Exception: a bare issue number whose existing spec has a `Gate comment` URL is a **resume**, not a rework: skip steps 3-7 and continue at step 8 with *Ticket gate question* step 3. 2. **Resolve active lenses.** The constitution is the single source of truth. If `.spark/constitution.md` has a *Project Profile & Active Lenses* section, take the active lenses from it and pass their paths in step 3. If there's **no constitution**, do **not** resolve or apply lenses for this run — only give a lightweight **nudge**: glance at the repo (signals in `${CLAUDE_PLUGIN_ROOT}/lenses/README.md`), name the likely type(s) in one line (e.g. "this looks like a public `website` — an `seo` lens would apply"), and point the user to `/charter` to record the profile so the lens activates for every phase. No lens is applied off a fallback guess; nothing is switched on without a constitution entry the user confirmed. 3. **Delegate to the Product Owner.** Pick the model first: if `.spark/constitution.md` §11 names a model for `product-owner`, pass exactly that as the agent call's `model`; if it names none, or there is no constitution or no §11, pass no model, so the agent's own default (`sonnet`) applies. Then invoke the `product-owner` agent with: the user's idea verbatim (or the fetched title+body, if this run started from an issue number — say so explicitly to the agent, don't let it rediscover the source), the feature name, the path `.spark/<feature-name>/spec.md`, and the spec template from `${CLAUDE_PLUGIN_ROOT}/templates/spec.md`. Point it at `.spark/constitution.md` if that file exists — the spec must live within it. Pass the paths of any active lenses (`${CLAUDE_PLUGIN_ROOT}/lenses/<name>.md`) so the PO captures their concerns as measurable NFRs. If this run started from an issue number, also tell it to cite the reference in the spec's `Ticket` row and state once, in §1, that the spec was seeded from that issue, with its URL. 4. **Relay, don't guess.** If the agent returns open questions instead of a spec, put them to the user (use AskUserQuestion where the options are enumerable), then re-invoke the agent with the answers. Repeat until the spec is drafted. 5. **Run the Clarify pass.** Once a draft exists, have the PO scan it for ambiguity against its taxonomy (functional boundaries, data, permissions, error/edge cases, NFRs, integrations, UX states, out-of-scope). Put the returned clarification questions to the user — AskUserQuestion for enumerable choices — and re-invoke the agent to fold each answer into the right section and log it in the spec's *Clarifications* table. Repeat until no high-impact ambiguity is left unresolved or unparked. Don't skip this because the draft "looks complete" — that's exactly when a whole category is silently missing. 6. **Present the result.** Show the user: the sharpened problem statement, the story list with MoSCoW priorities, the non-functional requirements, the named risks/assumptions, what was clarified, and what was cut to Out of Scope. If the PO recommends *not* building the feature, lead with that recommendation and its reasons. 7. **Iterate.** Fo
A gated agile delivery process for Claude Code: an AI product team (PO, Designer, EM, Reviewer, QA, Release) where every feature must pass a quality gate before it moves on — including real-browser QA.
More skills from other plugins.
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
ask-matt
Ask which skill or flow fits your situation. A router over the skills in this repo.
Questions about story-time.
- Which coding agents can use story-time?
- story-time installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

