Reference / blueprint

Musher Blueprint Document

A composition of one or more components into a single deployable application.

JSON Schema · Specification · Examples · Source

This reference is generated from the schema bundle and is informative. Where it differs from the specification, the specification governs. A documented default is an annotation: no validator inserts it.

Structural and type validation only: cross-document reference resolution, slug/directory agreement, and platform capability checks are separate validation layers. See spec.md.

Contents

blueprint document

A composition of one or more components into a single deployable application.

Authoring note

Structural and type validation only: cross-document reference resolution, slug/directory agreement, and platform capability checks are separate validation layers. See spec.md.

kind required

string — always BLUEPRINT

Document kind discriminator. Must be BLUEPRINT.

metadata required

BlueprintMetadata

spec required

BlueprintSpec

specVersion required

string — one of v1

Version of the Musher specification this document is written against.

BlueprintBinding

Where one receiving input’s value comes from.

Used as a map value, keyed by inputName.

Authoring note

spec.md §4.2 / ADR 0031 §1. The key that is present says where the input’s value comes from: a parameter, another node’s output, or a literal value. Exactly one; node goes with output. Values from outside the documents enter only through parameters.

Forms

Exactly one of parameter, node with output, or value is present. The key present selects the form.

node requires output.

output requires node.

node optional

string

Node whose output supplies the value.

maxLength 63 · pattern "^[a-z][a-z0-9-]{0,61}[a-z0-9]$"

output optional

string

Output of that node.

maxLength 64 · pattern "^[a-z][a-zA-Z0-9]{0,63}$"

parameter optional

string

Installation parameter supplying the value.

maxLength 64 · pattern "^[a-z][a-zA-Z0-9]{0,63}$"

value optional

any value

Logical non-secret literal value.

BlueprintCompute

The compute a workload node runs on: a compute profile, and optional placement pins that narrow where it is placed. Required on a node whose component runs, forbidden on one whose component is EXTERNAL. See spec.md §4.3.

placement optional

BlueprintPlacement

Optional pins narrowing the eligible hosts. Absent and a block with no pin set mean the same thing.

profile required

string

Compute profile slug in family.tier.size form, for example general.standard.small. The profiles actually on offer are published at https://api.musher.dev/v1/reference/compute-profiles.

maxLength 64 · pattern "^(general|compute|memory|storage|gpu|accelerator)\\.(economy|standard|performance|premium)\\.(nano|small|medium|large|xlarge)$"

Authoring note

Lookahead-free, so it compiles under RE2 as well as ECMA-262. Only the grammar is here; membership is a capability check (spec.md §4.3).

BlueprintExposure

Exposure of one endpoint in the object form: its visibility, whether the platform authenticates viewers, how the workload learns who they are, which of their claims it receives, and which requests pass without a viewer. Bare PUBLIC or PRIVATE is the object form with only visibility.

Authoring note

spec.md §4.5 / ADR 0034 §1-§2 / ADR 0035 §2, §4. A bare PUBLIC or PRIVATE, or the object form. Bare PUBLIC is { visibility: PUBLIC } with every default: access OPEN, viewerIdentity NONE. Every member but visibility applies only to PUBLIC; an identity mode and accessExemptions require AUTHENTICATED; viewerClaims requires an identity mode (BP-NODE-006).

Conditional rules

When visibility is PRIVATE, access must not be present.

When visibility is PRIVATE, accessExemptions must not be present.

When visibility is PRIVATE, viewerClaims must not be present.

When visibility is PRIVATE, viewerIdentity must not be present.

Otherwise, accessExemptions must not be present.

Otherwise, viewerIdentity must be "NONE".

spec.md §4.5 BP-NODE-006. A released claim travels in an identity mode, so viewerClaims requires a viewerIdentity other than NONE.

Under the condition above, viewerClaims must not be present.

access optional

string — one of OPEN, AUTHENTICATED

Whether the platform authenticates and authorizes a viewer before forwarding: OPEN forwards every request, and AUTHENTICATED admits only viewers the installation's access policy authorizes. PUBLIC only; AUTHENTICATED requires an HTTP, HTTPS or WS endpoint.

documented default "OPEN"

accessExemptions optional

array of string — one of PATHS, BEARER

Requests an AUTHENTICATED endpoint forwards without a viewer, each one the component declares: PATHS, a request under one of its accessExemptions paths, and BEARER, a request with no viewer session that carries a bearer token.

minItems 1 · uniqueItems true

viewerClaims optional

array of string — one of EMAIL, NAME

Facts about the viewer released to the workload beside the subject: EMAIL, the viewer's verified email address, and NAME, their display name. Requires a viewerIdentity other than NONE.

minItems 1 · uniqueItems true

viewerIdentity optional

string — one of NONE, HEADER, ASSERTION, OIDC

How the workload learns who the viewer is: NONE; HEADER, a plain request header; ASSERTION, a signed JWT in a request header; or OIDC, the workload signs viewers in as an OpenID Connect client of the platform. Every value but NONE requires access AUTHENTICATED.

documented default "NONE"

visibility required

string — one of PUBLIC, PRIVATE

Whether the endpoint can be reached from outside the installation.

BlueprintMetadata

Identity and description of a blueprint document. The blueprint carries the item’s revision; its sibling listing carries none. See spec.md §3.

description optional

string

What this application is, in one or two plain-text sentences. Required to publish.

minLength 1 · maxLength 280

Authoring note

spec.md §3 BP-ID-004. Plain text, never rendered as Markdown, bounded like a listing summary. It describes the deployable application to the people who install and operate it; the sibling listing’s summary remains the storefront copy. Structurally optional so a blueprint can be stored while it is being written; BP-ID-005 requires it of a published one.

revision required

integer

Item revision: the position of this release in the catalog item's lineage. Orders releases and nothing more.

minimum 1

slug required

string

Item slug, which must equal the item's directory name.

maxLength 63 · pattern "^[a-z][a-z0-9-]{0,61}[a-z0-9]$"

BlueprintNode

Used as a map value, keyed by nodeName.

Conditional rules

When componentRef matches ^\.{1,2}/, revision must not be present.

Otherwise, revision is required.

bindings optional

mapping, keyed by inputName matching ^[a-z][a-zA-Z0-9]{0,63}$, to BlueprintBinding

Explicit supplier for each receiving input, keyed by the component’s input name.

componentRef required

one of 2 forms: pattern ^(?:\./|(?:\.\./)+)(?:[A-Za-z0-9][A-Za-z0-9._-]*/)*[A-Za-z0-9][A-Za-z0-9._-]*\.ya?ml$, or pattern ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$

Reference to the component document this node deploys, in one of two forms. A repo-local reference begins ./ or ../ and ends .yaml or .yml, and resolves relative to the directory holding this blueprint document; its version is the referenced document's metadata.revision. A published reference is the component's UUID, which names the component across all its revisions, and requires revision to select the one deployed. The relative-path prefix is what tells the two apart: a bare slug is not distinguishable from a UUID.

maxLength 256

Authoring note

Both patterns are lookahead-free so they compile under RE2 as well as ECMA-262. A path segment must begin with a letter or digit, which is how . and .. are excluded as interior segments without a negative lookahead; that leaves one spelling per target and keeps the containment check in the semantic phase from having to normalise first.

compute optional

BlueprintCompute

Compute profile and placement for a node whose component runs. Omitted, and forbidden, where the component is EXTERNAL; that agreement is a semantic check against the component (spec.md §4.3).

exposure optional

mapping, keyed by endpointName matching ^[a-z][a-z0-9]{0,19}$, to one of string — one of PUBLIC, PRIVATE, BlueprintExposure

Exposure of each of the component’s endpoints, keyed by endpoint name; an endpoint left out is PRIVATE. A WORKER endpoint is never PUBLIC.

revision optional

integer

Lineage version pinned by a published reference. Required on a published reference and rejected on a repo-local one, where the referenced document's own metadata.revision supplies it.

minimum 1

volumes optional

mapping, keyed by volumeName matching ^[a-z][a-z0-9-]{0,61}[a-z0-9]$, to BlueprintVolumeAllocation

Storage allocated to each of the component’s volumes, keyed by the component’s volume name.

BlueprintParameter

Named installation value, bound explicitly by the nodes that consume it.

Used as a map value, keyed by parameterName.

Authoring note

spec.md §5 / ADR 0031 §4 / ADR 0035 §5, §6. A parameter is supplied in one way: submitted (with an optional default), generated, hashed from a generated parameter, or read from outside the documents through from. At most one of default, generator, from and hash, and a hash is never offered in a form.

Conditional rules

When generator is present, default must not be present.

When generator is present, from must not be present.

When from is present, default must not be present.

When hash is present, default must not be present.

When hash is present, from must not be present.

When hash is present, generator must not be present.

When hash is present, ui must not be present.

default optional

any value

Logical default, replaced by a submitted value. No interpolation.

from optional

string

One whole reference to a value outside the documents: ${{ variables. }} for an organization variable, ${{ connections. }} for an atomic connection, or ${{ deployment.installer. }} for a fact about the person who created the installation. Never submitted; a connection is replaced whole through acquisition instead.

minLength 1 · maxLength 512

generator optional

BlueprintParameterGenerator

Persisted credential generation; a submitted value is rejected.

hash optional

BlueprintParameterHash

A hash of a generated parameter, computed once and kept beside it; a submitted value is rejected.

ui optional

BlueprintParameterUi

Optional install-form presentation.

BlueprintParameterGenerator

byteLength optional

integer

Number of random bytes generated for the value.

minimum 16 · maximum 64 · documented default 32

encoding optional

string — one of HEX, BASE64, BASE64URL

Encoding applied to securely generated random bytes.

documented default "HEX"

BlueprintParameterHash

Password hash of a generated parameter.

Authoring note

spec.md §5.2 BP-PARAM-012 / ADR 0035 §6. The algorithms and their parameters are fixed: BCRYPT is $2b$ with cost 12, and ARGON2ID is m=19456, t=2, p=1 with a 16-byte salt and a 32-byte hash.

algorithm required

string — one of BCRYPT, ARGON2ID

BCRYPT ($2b$, cost 12) or ARGON2ID (PHC string, m=19456, t=2, p=1).

parameter required

string

The generated parameter hashed.

maxLength 64 · pattern "^[a-z][a-zA-Z0-9]{0,63}$"

BlueprintParameterUi

Presentation metadata for an install-form parameter.

Authoring note

spec.md §5.4. The control is derived from the logical schema of the inputs the parameter is bound to rather than declared, so this carries only what a derivation cannot supply.

enumLabels optional

mapping, keyed by enumMember, to string

Human-readable label for each enum member, keyed by the member it names. A member left unlabelled is offered as it is spelled.

examples optional

array of string

Example values illustrating the form a value takes. Never submitted; parameter.default supplies an omitted submission.

label required

string

Human-readable label shown on the install form.

order optional

integer

Relative position of the field within the form. Lower sorts first; a parameter declaring no order sorts after every parameter that declares one.

prominence optional

string — one of PRIMARY, SECONDARY

Standing of the field in the form: PRIMARY is offered directly, SECONDARY behind a disclosure the deploying user opens.

documented default "PRIMARY"

BlueprintPlacement

Optional pins that narrow the hosts eligible for the node’s compute profile. A pin never changes the compute the profile names. See spec.md §4.4.

Authoring note

Every term pin is a lowercase token rather than a member of a closed set: the grammar is fixed by this contract, the vocabularies are versioned catalog context, not part of this contract (spec.md §4.4). cpuDedication is the exception: two values are the whole concept.

acceleratorInterconnect optional

string

Required accelerator interconnect, such as nvlink or pcie. Omit to pin nothing. The permitted terms are not a vocabulary this contract defines; see spec.md §4.4.

maxLength 64 · pattern "^[a-z0-9][a-z0-9_-]*$"

acceleratorRuntimes optional

array of string

Required accelerator runtimes, such as cuda. An empty array pins nothing, and a term may not repeat. The permitted terms are not a vocabulary this contract defines; see spec.md §4.4.

uniqueItems true

acceleratorSKUClass optional

string

Exact accelerator SKU class to pin. Omit to pin nothing. The permitted terms are not a vocabulary this contract defines; see spec.md §4.4.

maxLength 64 · pattern "^[a-z0-9][a-z0-9_-]*$"

cpuArchitectures optional

array of string

Permitted CPU architectures, such as x86_64 or arm64. An empty array pins nothing, and a term may not repeat. The permitted terms are not a vocabulary this contract defines; see spec.md §4.4.

uniqueItems true

cpuDedication optional

string — one of shared, dedicated

Whether the node's vCPU must be dedicated rather than shared. Omit to pin nothing. This is the one pin whose vocabulary this contract closes; see spec.md §4.4.

minAcceleratorMemoryGiB optional

integer

Minimum accelerator VRAM in GiB. Omit to pin no floor.

minimum 1

networkClass optional

string

Required network class. Omit to pin nothing. The permitted terms are not a vocabulary this contract defines; see spec.md §4.4.

maxLength 64 · pattern "^[a-z0-9][a-z0-9_-]*$"

BlueprintResolutionRecord

blueprintDigest required

string

pattern "^[0-9a-f]{64}$"

components required

mapping, keyed by nodeName, to BlueprintResolvedComponent

minProperties 1

credentials required

mapping, keyed by parameterName, to BlueprintResolvedCredential

installationSnapshot required

BlueprintVersionedIdentity

Opaque identity and immutable version of the private installation snapshot; never a secret-derived hash.

specifications required

BlueprintResolvedSpecifications

variables required

mapping, keyed by variablePath, to BlueprintVersionedIdentity

Identity and version of each organization variable the installation read.

version required

always 1

BlueprintResolvedComponent

Conditional rules

When source is EXTERNAL, compute must not be present.

When source is EXTERNAL, gitCommit must not be present.

When source is EXTERNAL, imageDigest must not be present.

When source is EXTERNAL, exposure is required.

When source is EXTERNAL, volumes is required.

Otherwise, compute is required.

Otherwise, imageDigest is required.

When source is GIT, gitCommit is required.

Otherwise, gitCommit must not be present.

compute optional

BlueprintVersionedIdentity

digest required

string

pattern "^[0-9a-f]{64}$"

exposure required

mapping, keyed by endpointName, to one of string — one of PUBLIC, PRIVATE, BlueprintExposure

gitCommit optional

string

pattern "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"

identity required

string

minLength 1

imageDigest optional

string

pattern "^sha256:[0-9a-f]{64}$"

revision required

integer

minimum 1

source required

one of EXTERNAL, IMAGE, GIT

volumes required

mapping, keyed by volumeName, to BlueprintVolumeAllocation

BlueprintResolvedCredential

identity required

string

minLength 1

rotation required

integer

minimum 0

BlueprintResolvedSpecifications

blueprint required

string

pattern "^[0-9]+\\.[0-9]+\\.[0-9]+$"

component required

string

pattern "^[0-9]+\\.[0-9]+\\.[0-9]+$"

core required

string

pattern "^[0-9]+\\.[0-9]+\\.[0-9]+$"

listing optional

string

pattern "^[0-9]+\\.[0-9]+\\.[0-9]+$"

BlueprintSpec

Composition, explicit input suppliers, allocation and installation parameters.

components required

mapping, keyed by nodeName matching ^[a-z][a-z0-9-]{0,61}[a-z0-9]$, to BlueprintNode

Named component instances. At least one is required to publish.

Authoring note

spec.md §4 BP-GRAPH-001. Structurally it may be empty so a blueprint can be stored before its first node is chosen, or after its last one is removed; BP-GRAPH-001 requires at least one node of a published blueprint.

parameters optional

mapping, keyed by parameterName matching ^[a-z][a-zA-Z0-9]{0,63}$, to BlueprintParameter

Every value the installation takes from outside the documents: submitted, generated, organization variables and connections. Nothing binds by name.

BlueprintVersionedIdentity

An opaque identity and an immutable version.

identity required

string

minLength 1

version required

string

minLength 1

BlueprintVolumeAllocation

Used as a map value, keyed by volumeName.

minIOPS optional

integer

Minimum provisioned IOPS for this volume. Omit to pin no floor.

minimum 1

sizeGiB required

integer

Allocated size, at or above the component’s minSizeGiB.

minimum 1

storageClass optional

string

Required storage class for this volume, such as local-nvme. Omit to pin nothing. The permitted terms are not a vocabulary this contract defines; see spec.md §4.3.

maxLength 64 · pattern "^[a-z0-9][a-z0-9_-]*$"