Libar Software Delivery Protocol is a typed, executable, self-validating meta-model of software
delivery: author Spec documents in the repository, derive one graph, and check conformance and
honesty.
Carrier rule: Specs and Packs default to Markdown; the TS DSL survives as import source and a lawful per-ID option, while behavior and example Specs may use Gherkin canonically per ID (the carrier ruling, MD-18, the Pack syntax ruling, MD-25, and the Gherkin carrier option, MD-27).
Read the concept, the ubiquitous language, and the checkout-v1 walkthrough.
Install from the committed lockfile and build the CLI:
npm ci
npm run buildThen query this repository's self-hosting graph with either supported script runner:
npm run --silent sdp:q -- 'return g.specs().length'
pnpm --silent sdp:q 'return g.specs().length'The sdp:q script supplies this repository's required fixture exclusions. Use the
sixteen graph-first recipes for backlog, drift, verifier, impact,
Pack, readiness, and promotion queries.
The full CLI is available in the checkout through the sdp script; graph-deriving verbs at this
root need the same three fixture exclusions the sdp:q script supplies:
pnpm --silent sdp --help
npm run --silent sdp -- --help
pnpm --silent sdp validate . --exclude explorations --exclude examples --exclude test/fixtures/import/parityDo not use pnpm exec sdp (or npx sdp) in the Protocol's own checkout. pnpm exec resolves
dependency binaries, but a package does not install or link itself into its own
node_modules/.bin; on macOS the unresolved name selects Apple's unrelated /usr/bin/sdp, which
fails with xcode-select: error: tool 'sdp' requires Xcode. The checked-in pnpm setting also
disables pnpm 11's dependency auto-reconciliation for repository scripts, so the supported
pnpm sdp / pnpm sdp:q forms do not rewrite an npm-installed dependency tree.
In an adopter repository where the Protocol is installed as a dependency, its binary is linked
into node_modules/.bin, so the package runner resolves it:
pnpm exec sdp --help
pnpm exec sdp build .
pnpm exec sdp validate .
pnpm exec sdp view .
pnpm exec sdp q 'return g.specs().map((spec) => spec.id)'build derives the graph and executable contracts, validate adds conformance and honesty
checks, view generates the Design Review, import converts TypeScript Spec carriers to Markdown,
and q evaluates a local JavaScript query body against a freshly derived graph. Run sdp --help
for the complete option contract. Adopters own their root and exclusion policy.
Behavior and example Specs may use a .sdp.gherkin file as their one canonical surface.
Bare .feature is not discovered. It stays ordinary Cucumber / import-source territory.
@spec.orders.submit
@altitude.feature
@readiness.defined
Feature: Submit an order
@example-space
Scenario: Vocabulary
Given an order {orderId:string}
When the order is submitted
Then the order is accepted
@spec.orders.submit.accepted
@altitude.story
@readiness.defined
Scenario: A valid order is accepted
Given an order {orderId: "order-42"}
When the order is submitted
Then the order is acceptedBuild the graph and generated contracts:
pnpm exec sdp build .Bind the generated step contract to code-side handlers and a resolving test anchor:
import { ref, specTest, testAnchorId } from "@libar-dev/software-delivery-protocol";
import { bindExample } from "@libar-dev/software-delivery-protocol/vitest";
import { acceptedContract } from "../generated/contracts/orders.submit.accepted.contract.js";
const acceptedAnchor = specTest({
id: testAnchorId("test:orders.submit.accepted"),
label: "valid order acceptance",
verifies: ref(acceptedContract.spec),
});
void acceptedAnchor;
bindExample(acceptedContract, createWorld, handlers);Cucumber execution is not part of the design. Generated contracts and anchored code-side handlers remain the execution boundary.
Editors do not recognize *.sdp.gherkin as Gherkin by default. Associate the suffix with Gherkin
(often the cucumber language id) for highlighting and formatting. This repository ships the VS
Code mapping:
{
"files.associations": {
"*.sdp.gherkin": "cucumber"
}
}Copy the same files.associations entry into an adopter .vscode/settings.json, or apply the
equivalent association in another editor.
Extraction always loads the pinned Cucumber parser stack as ordinary runtime dependencies of
@libar-dev/software-delivery-protocol, even when a corpus is Markdown-only:
@cucumber/gherkin42.0.1@cucumber/messages34.2.1
Install the Protocol package once; do not add a parallel Gherkin parser or re-pin those packages for carrier support.
The package installs three agent on-ramps as SKILL.md files under
node_modules/@libar-dev/software-delivery-protocol/.agents/skills/. Use sdp-agent-surface to read
the graph, sdp-authoring to author intent, and sdp-sessions for advisory delivery-session
routing. The same package includes the sixteen recipe bodies at docs/agent-surface/recipes.md.