Client-agnostic canonical source for a small set of shared tooling
primitives: /spec, /verify, drift-control, and (as of V2) the
DocOps Protocol (doc_sync). This repository holds only the primitives
themselves — no client-specific integration code lives here.
ToolTempest exists to give these primitives one canonical home, independent of any particular AI coding tool or client. It was split out of the Article Pipeline project, where the same three files were previously kept as local, client-specific configuration.
Seven mechanism files, across two kinds of content:
Markdown primitives (V1, unchanged):
skills/spec/SKILL.mdskills/verify/SKILL.mdrules/drift-control.md
DocOps Protocol (V2, added by ADR-0001 — docs/adr/0001-docops-protocol.md):
scripts/doc_sync.pyscripts/doc_sync_tier2.pyschemas/execution-record.schema.jsonskills/doc-sync/SKILL.md
This is a real change in kind, not just in count. V1 was exclusively
markdown — passive instructional text a client interprets on its own
terms, by reading it. scripts/doc_sync.py is the first executable
code in ToolTempest: a Python script meant to be invoked directly from
a consuming project's git hooks, carrying its own runtime logic
(structural reconciliation, snapshot-before-modify, exit codes, a JSON
Schema for its own audit record). Composition (V2) now includes
executable tooling, not only markdown-based primitives. Consuming this
repository now means, for a project that opts in, executing pinned code
via git hooks — not only copying instructional text into a client's
config directory. See docs/adr/0001-docops-protocol.md for the full
protocol contract and the scope-boundary reasoning for why this addition
does not compromise client independence (below).
A separate category from the seven mechanism files above:
docs/reference/ holds shared reference documents meant to be read and
followed by a consuming project's Claude Code sessions, but not
copied into a client config directory the way rules/ files are —
there is no ~/.claude/ destination for anything in this directory.
A consuming project either points to the pinned copy in this
repository, or vendors its own copy into its own repo; either way the
document is consulted in place, not installed as a rule.
docs/reference/documentation-rules.md— structural and style rules forCONSTITUTION.md/ARCHITECTURE.md/ROADMAP.md/BACKLOG.md/docs/adr/, intended to apply across every project in this ecosystem (article-pipeline, tooltempest, Radar, future Brain).
See docs/adr/0008-reference-documentation-category.md for why this
category exists as distinct from rules/.
The canonical identity of any version of this content is the full 40-character Git commit SHA that introduced it — not a tag. Tags, if used, are human-readable aliases only; they are not the source of truth. When pinning or recovering a specific version, always record and match on the full commit SHA.
Staying client-agnostic is an architectural commitment for this
repository: it does not and will not contain .claude/, .cursor/,
or any other client-specific directory. Isolating the differences
between consuming tools (Claude Code, and potentially others such as
Cursor, Codex, or Windsurf in the future) is expected to be the job of
a separate CLI adapter layer. That adapter has not been built yet —
its design is a separate, future task and is out of scope for this
repository as it stands today.
The intended lifecycle separates two concerns:
- Discovery — noticing that a newer version exists — is expected to happen automatically.
- Install / activation — actually adopting a new version in a consuming project — is expected to always require an explicit action. Silent auto-update is not an acceptable behavior under this contract.
This is an architectural commitment for how consumers of ToolTempest should behave. No discovery or update mechanism is implemented in this repository itself.
If a consumer has a specific commit SHA cached locally, that cached copy remains usable without network access. This is not the same as general offline reproducibility — recovering a version you have not previously cached still requires reaching GitHub.
There is currently no CLI or adapter tooling. Until one exists, using ToolTempest in a consuming project is a manual process, and differs by which part of the composition a project adopts.
V1 markdown primitives — copied into place for your client, e.g. for Claude Code:
- Clone this repository and check out the specific commit SHA you intend to use (do not float on a branch).
- Copy the three files:
skills/spec/SKILL.md→~/.claude/skills/spec/SKILL.mdskills/verify/SKILL.md→~/.claude/skills/verify/SKILL.mdrules/drift-control.md→~/.claude/rules/drift-control.md
- Record the full commit SHA you used in your consuming project's
.tooltempest.lockfile, so the exact version in use is reproducible later.
V2 DocOps Protocol — opt-in, per project, wired through local git hooks rather than copied into a client config directory:
- Same clone-and-pin step as above;
scripts/doc_sync.pyis run from wherever the consuming project's own tooling makes it available (for example,scripts/sync-tooling.shinmikkiola/article-pipelinecopies it in alongside the V1 primitives). - The consuming project's
.git/hooks/pre-commitand.git/hooks/pre-pushcalldoc_sync.py pre-commit/doc_sync.py pre-pushrespectively, and carry a header comment citingADR-0001plus the pinned.tooltempest.lockSHA — seedocs/adr/0001-docops-protocol.mdfor the full contract. schemas/execution-record.schema.jsonandskills/doc-sync/SKILL.mdare reference material for the resulting.tempest/runs/audit records; neither needs to be copied anywhere to be useful — read them directly from the pinned checkout or this repository.
A step-by-step checklist for wiring up a brand-new ToolTempest
consumer. This restates "Usage today" above as a linear sequence; for
why each step exists, see ADR-0001
(docs/adr/0001-docops-protocol.md) and ADR-0002
(docs/adr/0002-tier2-doc-sync.md) in this repository.
- Pin
.tooltempest.lock. Create (or update) the consuming project's.tooltempest.lockwith the full 40-character commit SHA you intend to use — never a branch name or tag. See "Version identity" above. - Initial install. ToolTempest itself ships no installer script —
a consuming project needs its own, following the pattern already
proven in
mikkiola/article-pipeline'sscripts/sync-tooling.sh: clone this repository, check out the pinned SHA, and copy the V1 primitives plusscripts/doc_sync.py/schemas/execution-record.schema.jsoninto place, per "Usage today" above. - Activate the git hooks. Again following article-pipeline's
pattern (
scripts/install-hooks.sh, also not part of this repository): installpre-commitandpre-pushhooks that calldoc_sync.py pre-commit/doc_sync.py pre-push, with a header comment citingADR-0001and the pinned SHA, per "Usage today" above. Re-run this after every resync so.git/hooks/picks up any hook-source changes. - Optional but recommended: Drift Warning. ToolTempest does not
provide this — it is not part of Composition (V2) and does not come
for free just by adopting
doc_sync.py. It lives entirely inmikkiola/article-pipeline's ownscripts/hooks/pre-push, not in this repository, so each consumer that wants it has to replicate the pattern into its own pre-push hook independently. Seemikkiola/article-pipeline'sdocs/adr/0032-drift-warning.mdfor the design and that repository'sscripts/hooks/pre-pushfor the reference implementation (agit ls-remotecheck against this repository'sorigin/main, compared against the consumer's own.tooltempest.lockpin). - Reading a HARD BLOCK or WARNING. Both come from
doc_sync.pyor the consumer's ownscripts/verify.py, printed directly to the terminal at commit/push time — read that output first, not "ask whoever set this up":- A HARD BLOCK (
doc_sync.py pre-commitorpre-pushexits non-zero) means either a staged file is genuinely structurally invalid, orscripts/verify.pyitself failed to run — the printed message states which, and what to do about each case. See ADR-0001 for the underlying RECONCILE/VALIDATE contract. - A WARNING (Drift Warning, if replicated per step 4 above, or
any similar consumer-side check) never blocks anything — it's
informational. Read the printed line for which command to run
next (e.g.
scripts/sync-tooling.sh).
- A HARD BLOCK (
This repository holds two kinds of content: the seven mechanism files
described in "Composition (V2)" above, and shared reference
documentation under docs/reference/ (see "Reference documentation"
above, added by ADR-0008). Project-specific content (for example, a
given project's own CHECKPOINT.md, or its own scripts/verify.py)
does not belong here and is not included. doc_sync.py calls a
consuming project's scripts/verify.py as a subprocess but contains no
knowledge of any specific project's domain, components, or content.