OpenSpec-practise

From Hardcoded to Dynamic Instructions: The Three Major Changes in OpenSpec v1.5.0

OpenSpec (Fission-AI/OpenSpec) accumulated 600+ commits between v1.3.1 and v1.5.0. If you’re still on v1.3.1, the most immediate impression after upgrading will be: the AI understands your project better. Behind this are three fundamental architectural changes.

1. Background: What v1.3.1 Looked Like

Before understanding the changes, let’s revisit how things worked in the v1.3.1 era.

A typical OpenSpec workflow: type /opsx:propose "build some feature" in the conversation, the AI generates proposal.md, design.md, specs/, and tasks.md under openspec/changes/, then /opsx:apply implements the tasks one by one, and finally /opsx:archive archives the change.

This flow works, but it has three pain points:

Instructions are hardcoded. The prompt telling the AI “how to write a proposal” lives in TypeScript source code. If your project needs a custom template (e.g., a mandatory “rollback plan” section), you either wait for an official release or repeatedly remind the AI in conversation — and the AI often forgets.

Phases are locked. The proposal must finish before implementation, implementation before archiving. If you discover mid-way that design.md needs adjustment, you must interrupt the flow, manually edit the document, and re-trigger apply. The AI doesn’t proactively sense these changes.

Planning belongs to one repository. openspec/ sits in the project root, naturally assuming one repo per plan. When a feature spans an API service, a frontend, and a shared library, no single repo is the right home for the plan.

The three core changes in v1.5.0 correspond exactly to these three pain points.

2. Change One: Schema-Driven — Letting AI Dynamically Sense the Project

v1.5.0 extracted instructions from code into schemas/spec-driven/schema.yaml. This file declares artifact types (proposal, specs, design, tasks), their dependencies, and generation instructions for each artifact.

v1.3.1:  AI receives a hardcoded prompt → generates documents
v1.5.0:  AI runs openspec instructions <artifact> --json
         → pulls the current project's context + template + rules
         → generates documents based on the latest information

When the AI executes /opsx:propose, it no longer receives static text; instead it first runs openspec instructions proposal --json. The JSON returned includes:

Key change: you edit the rules in config.yaml, and the next /opsx:propose takes effect immediately — no IDE restart, no waiting for a new version.

A natural consequence of Schema-driven is Fluid Workflow — since the AI queries current state every time, phase locking loses its meaning. You can go back mid-Apply to revise design.md; the next /opsx:apply will automatically sense the change. A batch of extended commands was added for this:

Command Purpose
/opsx:new Initialize directory structure only, create documents step by step
/opsx:continue Create the next artifact in dependency order
/opsx:ff Skip documents and go straight to implementation
/opsx:sync Sync delta specs to main specs without archiving
/opsx:verify Verify implementation matches the spec
/opsx:bulk-archive Archive multiple changes at once
/opsx:onboard 15-minute interactive full-flow guide

3. Change Two: Stores — Planning Becomes an Independent Git Repository

Now that Schema solved “how the AI understands the project”, the next question is “where should the plan live”.

v1.5.0 introduces the Stores concept. A store is an ordinary Git repository containing an openspec/ directory and a .openspec-store/store.yaml identity file. It does exactly one thing: holds the plan. Team code repositories point to it via --store <id> or a pointer in config.yaml.

# Create a store named team-plans
openspec store setup team-plans --path ~/openspec/team-plans

# From now on, any command can target it
openspec new change add-login --store team-plans
openspec status --change add-login --store team-plans

Other team members:

git clone git@github.com:acme/team-plans.git ~/openspec/team-plans
openspec store register ~/openspec/team-plans

A code repository only needs one line in config.yaml:

store: team-plans

After that, any openspec command run inside the repository automatically targets the team-plans store — no need to pass --store every time.

Stores are a Beta feature with known limitations: one local checkout per store id, and OpenSpec never syncs automatically (you run git pull yourself). But this is deliberate — the store’s version control is entirely Git’s responsibility; OpenSpec doesn’t intervene.

v1.4.0 introduced workspace/initiative as an attempt at cross-repository planning, which v1.5.0 completely replaced with stores. If you used workspace during v1.4.0, migrate to stores; if you upgrade directly from v1.3.1, stores are a brand-new feature with no migration needed.

4. Change Three: Explore First — Think It Through Before Acting

The first two changes address “how”, the third addresses “what”.

The standard entry point in v1.3.1 was /opsx:propose. The user describes a requirement, and the AI generates documents directly. The problem: the AI’s “understanding” often deviates from the user’s “intent”, and the deviation only surfaces once code is written.

v1.5.0 promoted /opsx:explore from an experimental feature to the recommended starting point. Explore mode creates no files; the AI first investigates the codebase, compares options, and sketches architecture — like a zero-cost brainstorming session. Once key decisions are confirmed, it moves to /opsx:propose.

v1.3.1:  propose → apply → archive
             ↑ deviation risk surfaces late

v1.5.0:  explore → propose → apply → sync → archive
           ↑                          ↑
      zero-cost intent validation   ensure spec sync before archiving

This philosophy runs through v1.5.0’s documentation design — the official docs homepage’s first guidance line is “Not sure what to build yet? Start with /opsx:explore”.

5. Supporting Upgrades

Beyond the three major changes, v1.5.0 brings a batch of infrastructure enhancements:

AI tool ecosystem. New adapters for Claude Code, Mistral Vibe, Oh My Pi, Trae, etc., supporting 25+ AI coding assistants. Each adapter implements the unified CommandContent interface — adding a tool requires just one file.

Global installation. openspec init supports global directories, so teams can share one AI instruction configuration without re-initializing per project.

Configuration enhancements. Container fields in config.yaml support JSON format. The Validator’s SHALL/MUST detection is more accurate, and header parsing is now case-insensitive.

Official documentation. A comprehensive overhaul — from “feature list” style to “scenario-guided” style: explore-first, organized by operation, emphasizing discoverability.

6. Trade-offs and Upgrading

Stores are Beta. Command names, flags, file formats, and JSON output may change in future releases. What’s explicitly not done: automatic clone/pull/push (Git handles it), and multiple checkouts per store id.

Upgrading itself is simple:

npm install -g @fission-ai/openspec@latest
cd your-project
openspec update

openspec update refreshes all AI tool configuration files — no need to re-run init.

From v1.3.1 to v1.5.0, OpenSpec’s core change is not feature stacking but an architectural rethinking: instructions went from code to data, planning went from an attachment to an independent entity, and the workflow went from push to pull. For users, the most direct experience is — the AI finally stopped “guessing”.


Based on analysis of OpenSpec diffs and changelogs from v1.3.1 to v1.5.0. Practice validation: OpenSpec Practise v1.5.0.