Reference

What exact interface or behavior do I need?

Deterministic product truth, presented without changing its owner.

Compatibility

Backstop exposes a repository-oriented CLI, YAML artifacts, JSON-capable output, and process exit codes. A runtime integration must invoke the pinned binary from the intended working directory and propagate blocking exits. That proves operability; artifact order and role separation require additional harness behavior.

A harness can invoke Backstop, but operability alone does not preserve artifact ordering, review separation, or enforcement of a blocking verdict.

Invocation proves that the binary runs. A trustworthy integration separately proves that the harness preserves lifecycle order and stops on failure.

Runtime-neutral does not mean runtime-guaranteed. Backstop cannot make a harness respect a result it chooses to discard.

Follow compatibility guidance

Artifact schema catalog

Scrollable data table
Artifact typeSchema path versionDocument versionSchema IDTitleSource
basebase1.1.0backstop-artifact-base-v1Backstop Base Artifact Schema v1artifacts/base/schema.json
adrv11.0.0backstop-adr-v1Backstop ADR Schema v1artifacts/adr/v1/schema.json
adrv22.0.0backstop-adr-v2Backstop ADR Schema v2artifacts/adr/v2/schema.json
backstop-ymlv1not-declaredbackstop-yml-v1Backstop Project Manifest Schema v1artifacts/backstop-yml/v1/schema.json
bundlev11.0.0backstop-bundle-v1Backstop Context Bundle Schema v1artifacts/bundle/v1/schema.json
bundlev22.0.0backstop-bundle-v2Backstop Context Bundle Schema v2artifacts/bundle/v2/schema.json
capabilityv11.0.0backstop-capability-v1Backstop Capability Schema v1artifacts/capability/v1/schema.json
directivev11.0.0backstop-directive-v1Backstop Directive Schema v1artifacts/directive/v1/schema.json
issuev11.1.0backstop-issue-v1Backstop Issue Schema v1artifacts/issue/v1/schema.json
planv11.0.0backstop-plan-v1Backstop Plan Schema v1artifacts/plan/v1/schema.json
specv11.1.0backstop-spec-v1Backstop Implementation Spec Schema v1artifacts/spec/v1/schema.json

Artifact schemas live under artifacts/<kind>/v1/schema.json. The CLI reserves IDs, scaffolds valid records, validates references and state, and excludes terminal historical artifacts where policy declares that behavior.

Configuration

The repository root contains backstop.yml. Its project, packs, and enforcement.policy fields declare versioned standards and policy levels. The lock under .backstop/ binds resolved pack bytes.

CLI conventions

Backstop commands return 0 for success, 1 for blocking violations or broken promises, and 2 for configuration failure. The global --json flag selects structured output where supported, while backstop commands provides machine-readable command discovery.

Troubleshooting

backstop doctor diagnoses configuration discovery and loading, Git repository state, installed packs, build identity, toolchain execution, engine-tool availability, and artifact layout. A failing check returns 1; an unknown check identifier is a configuration error.

Gate

backstop gate evaluates changed files by default. backstop gate --file <path> bounds verification explicitly, while backstop gate --all runs the repository-wide kill chain. Exit zero means every blocking step passed; a nonzero exit is a verdict to preserve, not suppress.

Pack commands

Use backstop pack install, backstop pack list, backstop pack update, and backstop pack relock to manage declared versions and resolved locks. Inspect findings before accepting an update.

Pack artifact

A pack declares identity, version, claims, engines, fixtures, tools, applicability, and findings. Commands are direct argv contracts; tool pins are trust declarations rather than installers.

Path-filter diagnostics

When an engine receives explicit changed-file arguments, do not assume a slash-bearing include or exclude pattern behaves as it does during directory traversal. Use pack check and pack test to surface path-scope advisories, preserve production-relative fixture paths, and prefer a slash-free single-segment pattern only when it retains the intended scope.

Artifact lifecycle and closure

Status is a declared field. Authors set it. It is not inferred from git or CI. Per-noun status vocabularies are defined in their owning artifact schemas (issue, spec, bundle, and plan). Directive, ADR, and Capability schemas carry separate status fields. This section is the machine: legal moves, what must be true, what starts being enforced, and what that move enables.

Live states

Bundle
idea → exploring → defined → ready
Spec
draft → ready-for-implementation → implemented
Issue
open → ready → in-progress
blocked waits on named work
Plan
draft → ready → implementing → completed

Terminal states distinguish delivered or implemented work from replacement, cancellation, deprecation, and obsolescence. Successor fields are required where the schema names one.

Feature work uses bundle → spec → plan. Bounded work uses issue → plan. Both tracks meet at a plan. Each spec has exactly one plan. An issue does not get a spec. Product code is not written until a plan is ready.

Bundles progress through idea, exploring, defined, and ready.

Coupled states

Feature
bundle ready → spec ready-for-implementation → plan ready → plan completed → spec implemented
bundle delivered is declared separately
Bounded
issue ready → plan ready → plan completed → issue closed via delivered_by

delivered_by requires a completed PLAN-ISSUE-NNN. Spec implemented is declared; it is not inferred from the plan. A delivered bundle cited by a non-implemented spec fails the gate.

Issue

Live: open → ready → in-progress. blocked waits on named work.

Scrollable data table
StateBefore you can enter itValidator / gateEnables
openScaffolded issue, Problem sectionSchema only. Requirements and claims are optional.Issue exists but cannot produce a plan
readyRequirements, claims, verification, implementation, and contractsFull spec-parity traceability.Plan creation
in-progressSame rigor as readySame.Plan implementation or issue close-out
blockedSame rigor as ready, plus blocked_bySame, plus the blocker must be named.Work remains open with a named blocker
closed## Resolution, and exactly one close pointer unless the issue carries its own requirements and claimsClose traceability.No further issue work

Closing an issue requires a ## Resolution section and at most one traceability field: delivered_by names a completed plan, while resolved-by names a direct typed artifact reference, commit SHA, or pull-request URL when no plan lineage applies.

delivered_by and resolved-by on the same close is illegal. replaced requires replaced-by. obsoleted requires obsoleted-by. canceled is abandoned work.

Spec

Live: draft → ready-for-implementation → implemented.

Scrollable data table
StateBefore you can enter itValidator / gateEnables
draftSpec exists from a bundle; required live-work shapeSpec schema/completenessAuthoring
ready-for-implementationRequirements, claims, verification, implementation, contracts complete; review/validation passedFull live-work completeness/traceabilityPlan creation
implementedWork delivered through its planDelivery/closure requirementsNo further implementation work

Terminals: replaced, canceled, deprecated, obsoleted. Retired specs are exempt from live-work completeness.

Bundle

Live: idea → exploring → defined → ready. Success terminal: delivered.

The user drives promotion. Do not self-promote.

Scrollable data table
StateBefore you can enter itValidator / gateEnables
ideaNamed bundleIdentity and maturity enum.Bundle exists but cannot produce a spec
exploringReal open questions, unresolvedSame.Exploration
definedproblem.summary, problem.user_story, solution.approach, requirements[], and sections Current Thinking, Draft Requirements, Draft Design Decisions, Spec Seeds, Version HistoryMaturity gates. Placeholders are illegal.Promotion to ready
readyEverything defined requires, plus problem.success_criteria and solution.assumptionsSame, tighter.Spec generation
deliveredThe work shipped. requirements[] still required.Success terminal.No further bundle work

Terminals without delivery: replaced, canceled, deprecated. replaced requires replaced-by.

Plan

Live: draft → ready → implementing → completed.

draft, ready, and implementing are the same shape to the validator: phases, tasks, tests before implementation, every source claim mapped. Terminal plans (replaced, canceled, obsoleted) are exempt from phase and task completeness.

Scrollable data table
StateBefore you can enter itValidator / gateEnables
draftSource is an issue or a spec. Phases and tasks are present.Plan schema and completeness.Authoring
readySame shape. Reviewer has passed.Same.Implementation
implementingAn implementer is executing it.Same.Plan execution
completedThe work was delivered. Mandated tests exist.Validator may accept a completed plan whose mandated tests are missing. The gate does not.Source artifact close-out

Issue-sourced (PLAN-ISSUE-NNN): permits delivered_by on that issue. Spec-sourced (PLAN-SPEC-NNN): permits setting the spec to implemented. Bundle delivered is a separate declared status. Spec and bundle status are not inferred from the plan.

replaced requires replaced-by. obsoleted requires obsoleted-by.

Directive, ADR, and Capability each carry their own status vocabularies in their artifact schemas. They are not paths into implementation.

Source traceability

A gate result is useful evidence only when its command, prerequisites, and captured artifact are named.

A literal Liquid-shaped {{ ... }} expression is currently interpreted as an undeclared recipe parameter and rejected before any write; ISSUE-182 tracks the missing literal-escape capability.

Linux CI exposed a contracts-pack fixture false negative, and commit f8b3846fe5d4c2bc6465efc6eb5e4594e1b591da repaired it with checked-in before-and-after evidence.

Durable references use repository paths, immutable commits, or published versions. Execution evidence includes the exact command and prerequisites; observation evidence identifies its checked-in artifact and provenance.

CLI command catalog

Scrollable data table
CommandPathDescriptionFlags
artifactartifactArtifact lifecycle commands--json
newartifact newScaffold a new artifact--json
--slug
--source
validateartifact validateValidate artifacts against schemas--adr
--all
--bundle
--directive
--issue
--json
--plan
--spec
baselinebaselineBaseline cache and artifact commands--json
generatebaseline generateGenerate baseline JSON from full-scope gate--json
pullbaseline pullFetch latest successful main baseline artifact--json
commandscommandsList all available commands for agent discovery--help
--json
--json
doctordoctorDiagnose a backstop setup, including the conditions that make other commands refuse--check
--json
gategateRun full verification gate--all
--base
--file
--json
--json-out
--pack-sandbox
initinitTake a project from nothing to a first gated run--ci
--json
--no-baseline
--no-git
--no-gitignore
--no-observe
--no-packs
--no-sdlc
--no-toolchain
--only
--pack
--scaffold
packpackEnforcement content commands--json
addpack addAdd an enforcement pack to the project--json
--version
checkpack checkValidate pack manifest and constraints--format
--json
installpack installRestore packs from backstop.lock--cache
--json
listpack listList installed enforcement packs--json
newpack newScaffold a new enforcement pack--json
--language
--slug
--type
relockpack relockRefresh a local pack's lock entry after editing it in place--json
removepack removeRemove an enforcement pack from the project--json
testpack testRun full pack validation including fixture execution--format
--json
updatepack updateUpdate a pack to the latest compatible minor/patch version--acknowledge
--json
upgradepack upgradeUpgrade a pack to a new major version--json
reciperecipeRecipe adoption commands--json
applyrecipe applyApply a pinned recipe from an installed pack--json
--param
versionversionPrint version and schema cohort information--json
waiverwaiverInspect backstop waivers (read-only)--json
listwaiver listList active, expiring-soon, and unused/dangling waivers--json

The command families cover initialization, diagnosis, gates, packs, artifacts, recipes, baselines, waivers, version reporting, and command discovery. Use --help on the pinned release for exact flags and --json where a command exposes structured output.

Check release history