workflow reference names what to run — an organization, blob, revision and definition anywhere the caller
can read — separately from where it runs. Where it runs is the command’s target; every API that names a
workflow takes the same two objects:
The three shapes
orgis required exactly whenblobis an alias; given with a blob id, it must name that blob’s organization.revisionis required wheneverblobis given — no default-to-default.- Any other combination (a
revisionwithout ablob, ablobwithout arevision, anorgwithout ablob, a blob alias without anorg) is refused with 400invalid_workflow_reference. - Every value is a non-blank string of at most 64 characters; a blank, over-length or non-string value is refused
with 400
invalid_workflow_reference. - A
definitionvalue shaped like a canonical UUID is an id; anything else is an alias. - Used verbatim in both
create_execution’sworkflowfield and a schedule’sinvocation_target.workflow.
Resolution and access
A caller can run a definition exactly whendownload_definition on the definition’s own revision would
succeed: READ on the source blob, the blob is workflow-typed and readable, the revision passes data/query’s
gate, and the definition is in the workflow category. Every failure before the category check answers the
identical 403 — you can run what you could download, and no reference can become an oracle for another
organization’s contents.
An alias is looked up in the workflow category only, so a playground definition sharing it is never picked. A
definition id naming a playground definition the caller can reach is refused with 400
invalid_definition_category. An org-scoped API key reaches no other organization, so it can name definitions only
in its own.
Whose rules apply
Everything a run depends on comes from where it runs — the session, its blob, and the caller’s tenant for credentials — never from the source definition’s author:
A shared workflow only runs where the runner holds the same credential aliases and allows the same imports.
The path form
One string,/-separated, in the same three shapes: definition, blob/revision/definition (where blob must be
an id), org/blob/revision/definition. No alias grammar admits /, so the split is unambiguous. Two segments,
or more than four, are refused before anything is sent.
It exists only where one string has to hold a reference: the --definition argument of
blobhub workflow execute and the port of the playground’s
chat widget. Every request body, stored record and manifest carries
the object instead, and the API never accepts the path.

