Skip to content

Cinatra BPMN Profile 1.0

Doctrine. Workflow extensions author their template DAG as a cinatra/workflow.bpmn sidecar in Cinatra BPMN Profile 1.0 — a deliberately narrow subset of BPMN 2.0 extended with a small set of cinatra:-namespaced elements. The compiler (packages/workflows/src/bpmn/) parses + validates the sidecar and produces a lossless WorkflowSpec. Inline JSON workflow definitions are forbidden.

Namespace: xmlns:cinatra="http://cinatra.ai/schema/bpmn/profile-1.0".

The profile accepts exactly these BPMN elements:

BPMN elementWorkflowSpec mapping
bpmn:processThe workflow body.
bpmn:startEventWorkflow start.
bpmn:endEventWorkflow end.
bpmn:userTaskTaskSpec of type:"checkpoint" or "approval" (per cinatra:taskKind).
bpmn:serviceTaskTaskSpec of type:"agent_task" (per cinatra:agentRef).
bpmn:manualTaskTaskSpec of type:"manual".
bpmn:sendTaskTaskSpec of type:"send" (notification body via cinatra:messageBody).
bpmn:sequenceFlowTask dependency edge (dependsOn).
bpmn:documentationWorkflow description.

Anything else (gateways, scriptTask, callActivity, intermediateCatchEvent, …) rejects with bpmn_unsupported_construct. The narrow set is intentional — the profile ships the smallest surface that covers real customer workflows; gateways and timer events are planned for later profile revisions.

These extension elements live under <bpmn:extensionElements> inside the process or each task:

ElementScopeCarries
cinatra:workflowMetaprocessname, product attributes (sometimes templated with {{placeholder}}).
cinatra:placeholdersprocesscontainer for cinatra:placeholder children.
cinatra:placeholderprocessname, type (string|number|date|boolean), required, description, default. May carry a cinatra:placeholderHint child.
cinatra:placeholderHintplaceholderkind attribute (drives the launcher’s typed picker).
cinatra:taskKinduserTaskvalue ("checkpoint" or "approval").
cinatra:approvalConfiguserTask (approval)level, rejectionPolicy.
cinatra:agentRefserviceTaskpackage / name / version / templateId.
cinatra:taskInputserviceTaskJSON body (parsed; supports {{placeholder}}).
cinatra:taskScheduletaskmode, anchor, at, offsetIso8601, direction, localTime, tz, anchorPoint, durationIso8601.
cinatra:taskPolicytaskfailurePolicy, maxAttempts.
cinatra:messageBodysendTasknotification body (text; supports {{placeholder}}).
cinatra:transitionOutcomesequenceFlowoutcome (e.g. "success").

The compiler walks the sidecar and emits a WorkflowSpec:

  • process @idWorkflowSpec.key.
  • bpmn:documentationWorkflowSpec.description.
  • cinatra:workflowMeta@productWorkflowSpec.product.
  • cinatra:placeholders/cinatra:placeholder[]WorkflowSpec.placeholders: Record<name, PlaceholderDecl>.
  • Each cinatra:placeholder/cinatra:placeholderHint@kindWorkflowSpec.metadata.placeholderHints[name] = { kind } (the launcher reads this to pick a typed picker).
  • Each task → TaskSpec keyed by the BPMN id; type derived from BPMN element + cinatra:taskKind.
  • Each sequenceFlow → dependsOn edge on the target task.

The mapping is lossless — round-tripping BPMN → spec → BPMN preserves every construct that the profile recognizes.

  • extensions/cinatra-ai/blog-content-workflow/cinatra/workflow.bpmn — a reference example: three required placeholders with typed hints (blog-project / blog-post / wordpress-instance), an approval gate, a serviceTask invoking the @cinatra-ai/blog-wordpress-publish-agent, a manualTask, and a sendTask notification.
  • extensions/cinatra-ai/major-release-workflow/cinatra/workflow.bpmn — a second reference: a single string placeholder (product) and four tasks demonstrating cinatra:taskSchedule (absolute + relative).

The install gate (scripts/audit/workflow-bpmn-gate.mjs) and the compiler emit exactly these structured errors:

CodeCause
bpmn_unsupported_constructThe sidecar contains a BPMN element outside the supported set (e.g. exclusiveGateway).
bpmn_unsupported_workflowspec_fieldThe compiler emitted a WorkflowSpec field the live engine does not accept (e.g. a TaskSpec property new to the BPMN profile but not yet in the engine schema).
bpmn_sidecar_missingA workflow-kind extension package has no cinatra/workflow.bpmn file.
bpmn_sidecar_duplicateA workflow-kind extension package ships more than one BPMN sidecar (e.g. both cinatra/workflow.bpmn and a stray copy).
bpmn_inline_definition_forbiddenpackage.json carries an inline cinatra.workflow JSON definition (no longer allowed).