Process format
The YAML schema every process is written in. Stable from opensop: "0.1" onward.
Anatomy
customer-onboarding.sop.yaml
opensop: "0.1" process: name: customer-onboarding version: "1.0" owner: banking-team description: Onboard a new business customer trigger: type: api # api | schedule | webhook inputs: - { name: company_name, type: string, required: true } - { name: country, type: enum, values: [US, MX], required: true } outputs: - { name: account_id, type: string } - { name: status, type: enum, values: [approved, rejected] } steps: - id: collect-business-info name: Collect business information type: form # form | automated | judgment | webhook timeout: 7d - id: review-application name: Review application type: judgment judgment: allow_agent: true confidence_threshold: 0.8 escalate_to: human
Step types
| Type | Resolved by | Notes |
|---|---|---|
| form | human | Collects structured inputs. Use for kickoff and HITL. |
| automated | worker | An external worker polls /steps/pending and submits outputs. |
| judgment | agent or human | If allow_agent: true, an LLM decides. Below the confidence threshold, escalates. |
| webhook | third party | Engine creates a callback URL; the step waits until something POSTs to it. |
References
Anywhere a value is expected, you can use the ${...} syntax to pull from upstream context:
REFERENCES
# Pull a prior step's output into the next step's input inputs: applicant_name: "${steps.collect-business-info.outputs.company_name}" # Map a webhook trigger payload field to a process input inputs: company_name: "${trigger.payload.data.company}"