Orkestia
Blog
Reference

Workflow Types & Registry

How the Orkestia workflow registry is structured — namespaces, dotted naming, typed schemas, prerequisites, and the discovery loop that lets humans, SDKs, and AI agents browse capabilities

Everything Orkestia can do is a workflow type — a registered, typed, versioned capability. The registry is the merged catalog of every type the platform knows about, assembled at boot from the libraries installed in your environment. This page explains how that catalog is organized and how you browse it. It does not enumerate individual workflows — the authoritative, always-current per-workflow reference lives at reference.orkestia.dev.

A workflow type is a capability (a definition in code); a workflow run is one execution of it with a unique workflow_id. This page is entirely about types and how to discover them. For the run lifecycle, see Workflows & runs.

How the registry is built

The engine has no hand-maintained list of workflows. Each library declares its workflows through a plugin entry point; at boot, the engine discovers every entry point across every installed library and merges them into a single workflow index — the runtime registry that all surfaces (REST API, MCP, SDKs, dashboard) read from.

This matters for two reasons:

  • Capabilities are additive. Installing a new library makes its namespace appear in discovery with no config change. The catalog you see reflects what is actually installed and registered, not a static document.
  • Discovery is the source of truth. Always quote a workflow by the exact name discovery returns. Names are declared by the engine — never invent dotted variants, and refresh discovery before relying on a name.
Workflows are layered into three tiers — atomic primitives (one provider operation each), business workflows (composed multi-step DAGs), and app libraries (scoped to one Orkestia app). All three register the same way and land in the same index. See Hybrid execution model for how compositions compile down to atomic steps.

Naming: dotted, namespaced, predictable

Every type has a dotted name. The canonical shape for an atomic workflow is:

{provider}.{service}.{operation}
SegmentMeaningExample
providerThe cloud or external systemaws, gcp, azure, github
serviceThe product/service within its3, ec2, ecr
operationThe single action performedcreate_bucket, list_buckets

So aws.s3.create_bucket is "create one S3 bucket on AWS" — a single, deterministic operation following the 3-state pattern (PENDING → COMPLETED | FAILED). Operation-segment style varies by library (the cloud ports use snake_case; some app libraries use kebab-case) — one more reason to quote names exactly as discovery returns them.

Higher-tier and app-scoped workflows group under a domain namespace instead of a provider — the first segment names the Orkestia app or business domain rather than a cloud:

NamespaceBelongs toShape
registry.*Aggregated Registry appcatalog sync, resolve tag→digest
network.*Network Management appmirror VPCs, save network profiles
hook.*Hook appwebhook ingress / drain queue
deployments.*Deploy appplace backend workloads
identity.*Multi-tenant identityprovision app, end-user auth
agents.*Agents appgoverned AI-agent actions
The namespace is the unit you browse by. To see everything one app can do, list types with that namespace as a prefix (registry., identity., …) rather than scanning the whole catalog.

Every type carries a typed contract

A registry entry is more than a name. Each type declares schemas the engine enforces, so bad input fails fast and outputs are a stable contract for downstream steps and callers. When you fetch a type's schema, the contract comes back as two flat arrays plus a set of capability flags:

Part of the contractWhat it isEnforced
fields[]The inputs the type accepts at start — an array of field descriptorsStrict — undeclared keys are rejected before the run starts
outputs[]The shape returned on success — the same descriptor arrayFiltered then strict-validated after each action
has_prerequisites / prerequisite_variants[]Whether setup must exist first (most commonly a provider connection) and which variants to fetchBoolean flag + variant list on the schema
per-state data_schemaIntermediate state_data shape declared on a stateOpt-in: enforced at runtime only when the workflow sets strict_state_schemas; otherwise metadata for the static validator

Each entry in fields[] and outputs[] is a descriptor — name, type, required, description, an optional default, and an optional source (where a value can be fetched from). The declared type is one of the engine's field types: string, integer, float, boolean, list, dict, json, datetime, email, uuid. A type with no declared inputs comes back with an empty fields[] and a note. For the exact descriptor JSON, see the schema contract reference and reference.orkestia.dev.

Input validation is strict: a typo like emial against a schema with email is rejected loudly rather than silently ignored. Only the platform trace-correlation fields (trace_id, span_id, external_trace_id) are exempt. Full mechanics — the filter-then-validate output rule, the underscore-key handling, and the exception model — are in the schema contract reference.

Per-state data_schema declarations are metadata to the runtime by default — they're enforced at execution time only when a workflow opts in with strict_state_schemas; otherwise they feed the static validator to catch schema drift before a workflow runs. Schema coverage across the catalog continues to expand under the platform-wide schema migration.

The discovery loop

Whichever surface you drive Orkestia from — dashboard, SDK, REST API, or an AI agent over MCP — browsing the registry is the same four-call loop. Never guess inputs; ask the registry.

1. List namespaces

See the domains available to your org — aws, github, registry, identity, …

2. List types

Filter by a namespace prefix to see the operations in that domain.

3. Get schema

Fetch a type's fields[] and outputs[]. If has_prerequisites is set, satisfy them first.

4. Get prerequisites

When has_prerequisites is true, fetch the setup guide (usually a connection) before starting.

Over MCP

The MCP server exposes the registry directly to AI agents. The catalog tools are read-only and scope to your authenticated organization automatically.

list_workflow_namespaces()            → the domains you can use
list_workflow_types(prefix="aws.")    → operations within a namespace
get_workflow_schema("aws.s3.create_bucket")
                                      → fields[] + outputs[]; has_prerequisites, prerequisite_variants
get_workflow_prerequisites("aws.s3.create_bucket", variant=...)
                                      → setup guide (e.g. the connection to create)

Data lookups (resolving IDs, listing resources) are themselves data workflows — read-only types whose names usually contain load, list, fetch, get, or query. Discover them with a namespace prefix and read their terminal output. See MCP integration.

Over the SDKs / API

The TypeScript and Python SDKs are generated from these same registry schemas, so a type's inputs and outputs arrive fully typed in your editor. The REST API exposes the equivalent catalog endpoints. Pick the surface that fits; the loop is identical.

// TypeScript SDK — discover, then start with typed inputs
const types = await client.workflows.list({ prefix: "registry." })
const schema = await client.workflows.schema("registry.image.resolve")
const run = await client.workflows.start("registry.image.resolve", {
  repository_id: "rr_01HXZ...",
  tag: "prod",
})
Your organization is resolved from your credentials and scopes every catalog query and run automatically. You don't pass an org id in initial_data unless a schema explicitly declares it. See Identity & multi-tenancy.

The aggregated registry

Beyond per-type discovery, Orkestia exposes the whole index as a browsable catalog — the merged set of namespaces and types across all installed libraries, with their schemas and prerequisite flags. This is what powers:

reference.orkestia.dev

The authoritative, always-current per-workflow reference. Look here for exact names, fields, flags, and prerequisites — never hardcode them from this page.

MCP catalog tools

Programmatic discovery for AI agents — the same index, queried live and org-scoped.

DGI composition

DGI reads the registry to design compositions from real, installed capabilities.

Generated SDKs

TS + Python types emitted from registry schemas, so inputs/outputs are typed.

Do not treat any enumeration of workflow names in the docs as exhaustive or stable. The installed catalog is the source of truth; provider and app coverage is still expanding. For a specific workflow's current schema, query discovery or reference.orkestia.dev.

Where to go next

Workflows & runs

Types vs runs, and the run lifecycle you operate on by workflow_id.

Virtual workflows

Compose registered types into deterministic multi-step compositions.

MCP integration

Drive discovery and execution from AI agents.

Reference home

Schemas, SDKs, and the rest of the technical reference.