name: "OPSX: Explore" description: "Enter explore mode - think through ideas, investigate problems, clarify requirements" category: "Workflow"
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, and investigate the codebase, 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 OpenSpec artifacts (proposals, designs, specs) if the user asks—that's capturing thinking, not implementing. 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, 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.
Input: The argument after /opsx:explore is whatever the user wants to think about. Could be:
Depending on what the user brings, you might:
Explore the problem space
Investigate the codebase
Compare options
Visualize
┌─────────────────────────────────────────┐
│ Use ASCII diagrams liberally │
├─────────────────────────────────────────┤
│ │
│ ┌────────┐ ┌────────┐ │
│ │ State │────────▶│ State │ │
│ │ A │ │ B │ │
│ └────────┘ └────────┘ │
│ │
│ System diagrams, state machines, │
│ data flows, architecture sketches, │
│ dependency graphs, comparison tables │
│ │
└─────────────────────────────────────────┘
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.
If the user mentioned a specific change name, read its artifacts for context.
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:
There's no required ending. Discovery might:
When things crystallize, you might offer a summary - but it's optional. Sometimes the thinking IS the value.
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.