OSOP Conformance Levels

April 14, 2026 · View on GitHub

Version: 1.0.0-draft


Overview

OSOP defines four conformance levels that allow incremental adoption. A workflow at Level 0 is useful for documentation. A workflow at Level 3 is production-grade with full observability and audit capabilities.

Each level builds on the previous one. A Level 2 workflow satisfies all Level 0 and Level 1 requirements.

Conformance levels are not declared in the OSOP file. They are inferred by validators based on which fields are present and well-formed. A validation tool examines the document and reports which level it satisfies.


Level 0 — Descriptive

Purpose: Document a process so humans can understand it.

Use cases:

  • Onboarding documentation
  • Runbook drafts
  • Process discovery and mapping
  • Architecture decision records that describe workflows

Required fields:

FieldDescription
osop_versionProtocol version
idUnique process identifier
nameHuman-readable name
nodes[].idUnique identifier for each node
nodes[].typeOne of the 4 Core node types (agent, api, cli, human) + 8 Extended types
nodes[].nameHuman-readable node name
edges[].fromSource node ID
edges[].toTarget node ID

Minimum viable example:

osop_version: "1.0"
id: "incident-response"
name: "Incident Response Process"
description: "How we respond to production incidents."

nodes:
  - id: "detect"
    type: "system"
    name: "Alert Fires"
  - id: "triage"
    type: "human"
    name: "On-Call Triages Severity"
  - id: "mitigate"
    type: "human"
    name: "Team Mitigates Issue"
  - id: "postmortem"
    type: "human"
    name: "Write Postmortem"

edges:
  - from: "detect"
    to: "triage"
  - from: "triage"
    to: "mitigate"
  - from: "mitigate"
    to: "postmortem"

What you can do at Level 0:

  • Render the process as a visual graph
  • Generate documentation from the OSOP file
  • Search and catalog processes across an organization
  • Validate that the graph structure is acyclic and connected

What you cannot do:

  • Validate data flowing between nodes
  • Execute the process automatically
  • Audit past executions

Level 1 — Validatable

Purpose: Define precise data contracts so the process can be statically validated without executing it.

Use cases:

  • API contract testing
  • CI/CD schema validation gates
  • Cross-team interface agreements
  • Pre-deployment validation checks

Additional requirements (beyond Level 0):

FieldDescription
nodes[].inputsJSON Schema for node inputs
nodes[].outputsJSON Schema for node outputs
contractsAt least one message contract between nodes
inputsWorkflow-level input schema

What Level 1 adds:

inputs:
  environment:
    type: string
    enum: [staging, production]
  service_name:
    type: string
    minLength: 1

nodes:
  - id: "build"
    type: "docker"
    name: "Build Image"
    inputs:
      service_name:
        type: string
    outputs:
      image_uri:
        type: string
        format: uri
      digest:
        type: string
        pattern: "^sha256:[a-f0-9]{64}$"

  - id: "deploy"
    type: "infra"
    name: "Deploy to Cluster"
    inputs:
      image_uri:
        type: string
        format: uri
      environment:
        type: string

contracts:
  build-to-deploy:
    description: "Container image reference passed from build to deploy"
    schema:
      type: object
      required: [image_uri, digest]
      properties:
        image_uri:
          type: string
          format: uri
        digest:
          type: string

What you can do at Level 1:

  • Everything from Level 0
  • Validate that node outputs satisfy downstream node inputs
  • Validate contracts between connected nodes
  • Detect schema mismatches before runtime
  • Generate type-safe client stubs
  • Produce data flow documentation automatically

Level 2 — Executable

Purpose: Provide enough configuration for an engine to execute the process end-to-end.

Use cases:

  • Automated CI/CD pipelines
  • AI agent orchestration
  • Scheduled data pipelines
  • Infrastructure provisioning workflows

Additional requirements (beyond Level 1):

FieldDescription
nodes[].runtimeRuntime configuration for every non-human node
edges[].modeExplicit edge modes where not sequential
edges[].whenCEL expressions for conditional/loop/event edges
retryAt least one retry policy (global or per-node)
timeoutAt least one timeout (global or per-node)
securityAuthentication and/or secrets configuration

What Level 2 adds:

security:
  secrets:
    provider: "env"

retry:
  max_attempts: 3
  backoff:
    type: exponential
    initial_delay: "2s"

timeout: "30m"

nodes:
  - id: "build"
    type: "docker"
    name: "Build Image"
    timeout: "10m"
    inputs:
      service_name:
        type: string
    outputs:
      image_uri:
        type: string
      digest:
        type: string
    runtime:
      dockerfile: "./Dockerfile"
      context: "."
      image: "registry.example.com/${inputs.service_name}"
      tag: "${inputs.version}"
      build_args:
        NODE_ENV: "production"

  - id: "deploy"
    type: "infra"
    subtype: "k8s"
    name: "Deploy to Cluster"
    timeout: "5m"
    retry:
      max_attempts: 2
      backoff:
        type: fixed
        initial_delay: "10s"
    inputs:
      image_uri:
        type: string
      environment:
        type: string
    runtime:
      manifest: "./k8s/deployment.yaml"
      namespace: "${inputs.environment}"
      wait: true

edges:
  - from: "build"
    to: "deploy"
    mode: "conditional"
    when: "outputs.build.digest != ''"

What you can do at Level 2:

  • Everything from Level 1
  • Execute the workflow via a compatible engine
  • Handle failures with retry and timeout
  • Resolve secrets and credentials
  • Evaluate conditional routing at runtime

Requirements for human nodes at Level 2:

Human nodes do not require a runtime block in the traditional sense. Instead, they must specify enough information for an engine to route the task to the correct person and collect their response:

- id: "approve"
  type: "human"
  subtype: "approval"
  name: "Production Approval"
  runtime:
    assignees: ["platform-lead"]
    channel: "slack"
    timeout: "24h"
    prompt: "Approve deployment of ${inputs.service_name} v${inputs.version} to production?"
    options: ["approved", "rejected"]

Level 3 — Observable

Purpose: Add full observability, audit, and evolution support for production-grade workflows.

Use cases:

  • Regulated environments (SOC 2, HIPAA, PCI-DSS)
  • Mission-critical production pipelines
  • Workflows requiring post-incident forensics
  • Processes under active evolution and deprecation

Additional requirements (beyond Level 2):

FieldDescription
ledgerAudit trail configuration
observabilityTracing, metrics, and/or logging configuration
evolutionChangelog and/or deprecated nodes

What Level 3 adds:

ledger:
  enabled: true
  storage:
    type: "append-only-log"
    backend: "s3"
    config:
      bucket: "osop-audit"
      prefix: "deploy-web-service/"
  retention: "365d"
  fields:
    - run_id
    - timestamp
    - node_id
    - status
    - duration_ms
    - actor
    - inputs_hash
    - outputs_hash
    - error

observability:
  tracing:
    enabled: true
    exporter: "otlp"
    endpoint: "https://otel-collector.internal:4317"
    sampling_rate: 1.0
    propagation: "w3c"
  metrics:
    enabled: true
    exporter: "prometheus"
    prefix: "osop_deploy_"
    labels:
      service: "${inputs.service_name}"
      environment: "${inputs.environment}"
  logging:
    level: "info"
    format: "json"
    destination: "stdout"

evolution:
  deprecated_nodes:
    - id: "old-deploy-step"
      reason: "Replaced by blue-green deployment strategy"
      replacement: "deploy"
      sunset_date: "2026-09-01"
  changelog:
    - version: "2.1.0"
      date: "2026-03-15"
      changes:
        - "Added security scan step"
        - "Increased deploy timeout to 5m"
    - version: "2.0.0"
      date: "2026-01-10"
      changes:
        - "BREAKING: Switched from ECS to Kubernetes deployment"
        - "Added production approval gate"

What you can do at Level 3:

  • Everything from Level 2
  • Query an immutable audit log of every execution
  • Trace requests across nodes with distributed tracing
  • Emit metrics for dashboards and alerting
  • Track process evolution over time
  • Identify and plan migration away from deprecated nodes
  • Meet compliance and regulatory audit requirements

Conformance Validation

A conformance validator inspects an OSOP document and reports the highest level it satisfies.

$ osop validate deploy-web-service.osop.yaml

Conformance Report: deploy-web-service.osop.yaml
-------------------------------------------------
Level 0 (Descriptive):   PASS
Level 1 (Validatable):   PASS
Level 2 (Executable):    PASS
Level 3 (Observable):    PASS  (2 warnings)

Warnings:
  - evolution.deprecated_nodes[0].sunset_date is in the past (2026-09-01)
  - observability.metrics.exporter "prometheus" requires pull endpoint configuration

Result: Level 3 (Observable)

A document that passes Level 2 but not Level 3 is still a valid, executable OSOP workflow — it simply does not include production observability features.


Choosing a Conformance Level

ScenarioRecommended Level
Documenting an existing manual processLevel 0
Defining API contracts between teamsLevel 1
Automating a CI/CD pipelineLevel 2
Running a regulated production workflowLevel 3
Starting with OSOP for the first timeLevel 0, then iterate

The levels are designed to support incremental adoption. Start at Level 0 to capture what exists today, then progressively add structure as the process matures.


See SPEC.md for the full protocol specification.