The canonical rule format, in Python. Entities and rules carry an id, a revision and a lifecycle state, are validated against JSON schemas, and are released as an immutable, hashed rule set. The core rule set is published on this site.
SteerSpec
One source of truth for AI configuration — from a single repo to the whole organization.
Your CLAUDE.md drifts. .claude/agents/ mutates. Teams patch configs manually and drift goes undetected until it breaks something. Reconciling AI configuration files across dozens of repos is pure toil.
SteerSpec is a formal specification and toolset that treats AI configuration files the same way you treat infrastructure—as code, versioned, templated, and automatically synchronized. Define once in a central manifest. Propagate everywhere via pull request. Detect drift on a schedule. The toolchain is released and Apache 2.0.
Because vibe coding without a spec is just vibing — and it stops working the moment there is more than one of you.
A project by Consulare, Switzerland.
// Solo vs. at scale
One developer, one repo
- A single CLAUDE.md, edited by hand
- You remember what you told the agent
- Vibe coding works
Many teams, many repos, many agents
- Dozens of copies, each slightly different
- A convention fixed in one repo never reaches the rest
- Nobody can say which rules an agent was actually given
- Changes to agent behaviour have no review and no history
SteerSpec is built for the second column. Rules are versioned, schema-validated data, not prose scattered across repos. The same rules reach every repo by reviewable pull request, drift is detected rather than discovered, and agents behave the same way everywhere — which is what makes their output reliable enough to scale on.
// How it fits together
Rules are validated against a published schema and released as an immutable, hashed rule set. The Sync Action renders them into each repository’s agent configuration, one pull request at a time. The monitor compares what is deployed with what is defined and feeds differences back. Vocabulary: key concepts.
// From one Action to a core principle adopt as far as you need
- Drop in the Sync ActionOne central repo, one workflow. Standalone — no spec required.
- Centralize templatesCLAUDE.md, agents, skills and settings defined once and rendered per repo.
- Write rules as versioned specsEntities and rules with lifecycle states, validated by schema and linted in CI.
- Run a realmPublish your organization’s rule set on top of the core one, pinned and verifiable by hash.
Step one, from the strspc-sync README:
name: SteerSpec Sync
on:
push:
branches: [main]
paths: ['templates/**', 'steerspec-sync.yml']
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: SteerSpec/strspc-sync/sync@v0.2.1
with:
token: ${{ secrets.STEERSPEC_TOKEN }}
// Core tools the spec and what enforces it
The enforcement engine, in Go: lint, diff, eval and resolve over a rule set. Its docs hold the format specification.
Rule authoring and static checking, in Go: render, lint, diff and check, where check runs an AI evaluation with Claude.
brew install --cask SteerSpec/tap/strspc
Recent Homebrew asks you to trust a third-party tap first:
brew trust steerspec/tap, then retry. Other platforms:
GitHub Releases.
The rules that span every SteerSpec repository, written as a SteerSpec realm
(dev.steerspec.platform). Six rules cover what no single component
can own: dependencies point downward only, releases land upstream first, every
repository owns a realm validated in CI, published rules are superseded rather
than edited, and rule logic lives in the manager.
Also: the GitHub Actions that deliver and gate the config, and shared Claude Code settings — see companion products.
// The format how to read the JSON
Four concepts, all expressed through a single object type — the Entity.
- EntityAn object with a unique identity and lifecycle. The unit of organization.
- RuleA single-phrase behavioral constraint or property definition attached to an entity.
- Rule SetThe collection of all rules for a given entity, versioned as a unit.
- NoteA supplemental annotation attached to a specific rule.
Rule identifier
The JSON stores id, revision and state as separate
fields. The displayed form is assembled from them:
[ENT-001.0/D]
- ENT-001
"id": "ENT-001" - 0
"revision": 0 - D
"state": "D"
Which brackets and separators to use is itself specified by the RLIFRMT
entity, so the display form is a rendering decision rather than part of the data.
The core realm declares no override, so the documented defaults apply —
that is what /spec renders.
Lifecycle states
Transitions are forward-only. No state is skipped, and each applies at most once.
- DDraftThe only state in which a rule’s body can be edited.
- PPublishedValidated and approved, but not yet enforced.
- IImplementedIn force. The rule is actively enforced.
- RRetiredStill present but scheduled for removal. Superseded by a newer rule.
- TTerminatedNo longer in force. Terminal state.
- AAbandonedTerminal state for rules that never left Draft.
Keywords
Rule bodies use RFC-2119 keywords. SteerSpec extends MUST with
HAS, IS and DEFINE — which is why a rule reads
IS an object that has a unique identity rather than MUST be.
Defined by KWRD-002, itself a rule in the set.
Full definition: SteerSpec Rule Manager — Specification ↗
// Spec endpoints
- /schemas/entity/v1.json Entity schema — full
- /schemas/entity/bootstrap.json Entity schema — bootstrap
- /schemas/realm/v1.json Realm schema
- /schemas/config/v1.json Config schema
- /rules/latest/index.json Rules manifest — current
Every release is also served immutably at
/rules/v<version>/index.json.
For the rules themselves in readable form, see /spec.
// Implementation status
- [✓] Specification — core realm, machine-readable
- [✓] Sync GitHub Action
- [✓] Monitor GitHub Action
- [✓] Conflict detection
- [✓] PR auto-approve Action
- [✓] CLI tool — render, lint, diff, static check, realm and rule authoring
- [·] Cloud API
strspc-sync v0.2.1 was proven end to end (sync, monitor, conflict detection) against a test organization on 2026-10-20. The CLI evaluates pull-request diffs with Claude in the CI of strspc-CLI, strspc-manager and strspc-sync.