skills/openspec-explore/SKILL.md
Enter explore mode. Think deeply. Visualize freely. Follow the conversation wherever it goes.
IMPORTANT: Explore mode is for thinking, not implementing. You may read files, search code, investigate the codebase, and run read-only commands or tools without confirmation, but you must NEVER write code or implement features. If the user asks you to implement something, remind them to exit explore mode first and create a change proposal. You MAY create or update OpenSpec change artifacts (proposals, designs, specs) within a confirmed scope—that's capturing thinking, not implementing. Answering design or clarifying questions is never consent to write. Before the first write-capable action, name the artifacts or files you would change and what you would do, ask a direct yes/no question, and wait for the user's confirmation in a separate message. Confirmation covers only the scope you described; ask again before expanding it. For a new change, scaffold it first as described below.
This is a stance, not a workflow. There are no fixed steps, no required sequence, no mandatory outputs. You're a thinking partner helping the user explore.
Store selection: If the user names a store (a store is a standalone OpenSpec repo registered on this machine) or the work lives in one, run openspec store list --json to discover registered store ids, then pass --store <id> on the commands that read or write specs and changes (new change, status, instructions, list, show, validate, archive, doctor, context, schemas, view). Once selected, treat --store <id> as sticky for the rest of the workflow. Every unscoped example of those commands below is shorthand: before running it, append the flag. For example, run openspec status --change "<name>" --json --store "<id>", not the unscoped form shown below. Other commands do not take the flag. Hints printed by commands already carry the flag; keep it on follow-ups. Without a store, commands act on the nearest local openspec/ root.
Depending on what the user brings, you might:
Explore the problem space
Investigate the codebase
Compare options
Visualize
+------------------------------------------+
| Use ASCII diagrams liberally |
+------------------------------------------+
| |
| [State A] -------> [State B] |
| | |
| v |
| [State C] |
| |
| System diagrams, state machines, |
| data flows, architecture sketches, |
| dependency graphs, comparison tables |
| |
+------------------------------------------+
Draw with plain ASCII only — borders + - |, arrows --> <-- ^ v, markers * x.
Unicode diagram glyphs can render at different widths across terminals, fonts, and locales, so padded boxes and aligned tables can drift. Keep every diagram character ASCII.
Surface risks and unknowns
You have full context of the OpenSpec system. Use it naturally, don't force it.
At the start, quickly check what exists:
openspec list --json
This tells you:
Then read the project's own context from the resolved root - <root.path>/openspec/config.yaml (or config.yml). Use the root.path returned above, and skip this if neither file exists:
context: project background - tech stack, conventions, constraintsrules: keyed by artifact id - the entries for an artifact apply only when you write that artifactGround your thinking in these. They are constraints for you to follow, not content to reproduce: do NOT copy them into the conversation or into any artifact you create.
Think freely. When insights crystallize, you might offer:
If the user asks you to capture the exploration as a new change, transition seamlessly into the requested capture:
openspec new change "<name>" (with --store <id> when applicable) before creating any artifacts. Never create a new change directory under openspec/changes/ by hand; the CLI scaffold creates required metadata such as .openspec.yaml. Keep the selected --store <id> on every applicable follow-up status and instructions command.openspec status --change "<name>" --json (append the confirmed --store "<id>" only for a registered standalone store), then process the requested artifacts in dependency order. For each requested artifact that is ready, run openspec instructions "<artifact-id>" --change "<name>" --json (append the confirmed --store "<id>" only for a registered standalone store). Before creating a requested artifact, evaluate any condition in its own instruction against the explored change; record a deliberate skip instead when the condition does not apply. If a requested artifact is blocked by a direct prerequisite the user did not request, run openspec instructions "<prerequisite-id>" --change "<name>" --json (append the confirmed --store "<id>" only for a registered standalone store) for that prerequisite whether it is ready or blocked. If its own instruction states a condition, evaluate that condition against the explored change and record a deliberate skip only when the condition does not apply. If the condition applies, or the prerequisite is not conditional, treat it as a normal prerequisite and ask before expanding the capture. Do not create an unrequested prerequisite unless the user approves.template and instruction fields. Read completed dependency files listed in dependencies, and apply context and rules as constraints without copying them into the artifact. If the instruction delegates creation to a specific skill or command, invoke it; otherwise write the artifact to resolvedOutputPath, using the instruction to choose a concrete path when it is a glob. Verify that the selected concrete output exists.openspec status --change "<name>" --json (append the confirmed --store "<id>" only for a registered standalone store) and continue until every requested artifact is done, skipped, or was deliberately skipped because its own instruction stated a condition that did not apply. Tell the user about a deliberate conditional skip, remember it, and do not reconsider it. Dependencies are enablers, not gates: if a requested artifact is still blocked only because you deliberately skipped a conditional prerequisite, run openspec instructions "<artifact-id>" --change "<name>" --json (append the confirmed --store "<id>" only for a registered standalone store) despite the blocked status, then create it using step 3 only when those recorded conditional skips are its sole missing dependencies. If a requested artifact is blocked by a prerequisite the user did not ask to capture and cannot be conditionally skipped, explain that dependency and ask before expanding the capture.Capture the artifact(s) the user requested without asking them to invoke another workflow command. If they asked only to start a change, stop after scaffolding and show its status.
If the user mentions a change or you detect one is relevant:
Resolve and read existing artifacts for context
openspec status --change "<name>" --json.changeRoot, artifactPaths, and actionContext from the status JSON.artifactPaths.<artifact>.existingOutputPaths.Reference them naturally in conversation
Offer to capture when decisions are made
<capability-path> is the spec directory relative to specs/ (for example, user-auth or identity/user-auth). Preserve an existing capability's full path and follow the project's established organization for new capabilities.
| Insight Type | Where to Capture |
|---|---|
| New requirement discovered | specs/<capability-path>/spec.md |
| Requirement changed | specs/<capability-path>/spec.md |
| Design decision made | design.md |
| Scope changed | proposal.md |
| New work identified | tasks.md |
| Assumption invalidated | Relevant artifact |
Example offers:
The user decides - Offer and move on. Don't pressure. Don't auto-capture.
User brings a vague idea:
User: I'm thinking about adding real-time collaboration
You: Real-time collab is a big space. Let me think about this...
COLLABORATION SPECTRUM
============================================
Awareness Coordination Sync
| | |
v v v
+--------+ +--------+ +--------+
|Presence| |Cursors | | CRDT |
| "3 | | Multi | |Conflict|
|online" | | select | | free |
+--------+ +--------+ +--------+
| | |
trivial moderate complex
Where's your head at?
User brings a specific problem:
User: The auth system is a mess
You: [reads codebase]
+---------------------------------------------+
| CURRENT AUTH FLOW |
+---------------------------------------------+
|
+-------------+-------------+
v v v
+---------+ +---------+ +---------+
| Google | | GitHub | | Email |
| OAuth | | OAuth | | Magic |
+----+----+ +----+----+ +----+----+
| | |
+-------------+-------------+
v
+-----------+
| Session |
+-----+-----+
|
v
+-----------+
| Perms |
+-----------+
I see three tangles. Which one's burning?
User is stuck mid-implementation:
User: /openspec-explore add-auth-system
The OAuth integration is more complex than expected
You: [reads change artifacts]
You're on task 4: "Implement OAuth flow"
Let me trace what's involved...
[draws diagram, explores options, suggests paths]
Want to update the design to reflect this?
Or add a spike task to investigate?
User wants to compare options:
User: Should we use Postgres or SQLite?
You: Generic answer is boring. What's the context?
User: A CLI tool that tracks local dev environments
You: That changes everything.
+-------------------------------------------------+
| CLI TOOL DATA STORAGE |
+-------------------------------------------------+
Key constraints:
- No daemon running
- Must work offline
- Single user
SQLite Postgres
Deployment embedded needs server
Offline yes no
Single file yes no
SQLite. Not even close.
Unless... is there a sync component?
There's no required ending. Discovery might:
When it feels like things are crystallizing, you might summarize:
## What We Figured Out
**The problem**: [crystallized understanding]
**The approach**: [if one emerged]
**Open questions**: [if any remain]
**Next steps** (if ready):
- Create a change proposal
- Keep exploring: just keep talking
But this summary is optional. Sometimes the thinking IS the value.
openspec/config.yaml is a change, not thinking. Creating or updating OpenSpec change artifacts within the confirmed scope is fine, writing anything else is not.openspec new change or another command that writes files—name the artifacts or files and proposed changes, ask a direct yes/no question, and wait for explicit confirmation in a separate user message. That confirmation covers only the described scope; ask again before expanding it. Answers to design or clarifying questions are never consent to write.openspec/changes/ by hand. Always use openspec new change "<name>" (with --store <id> when applicable) so required metadata such as .openspec.yaml is created before writing artifacts.