iithe labors

Workflows are data, not code.

Every automation here is a set of YAML definitions that compile into a typed graph before anything runs. They diff in review like any other file, and a mismatched pair of tasks is caught when you plan, not at three in the morning when it runs. The engine never grows a branch for your business, so your hundredth automation costs what your first did.

pipelines/audit.yamlwhat you write
kind: triggerversion: 1source: webhook---kind: taskversion: 1runner:  kind: agent  spec: audit.analyst@3input: report.request@1output: report.spec@1uses:policy:  timeout: 90s  retry: 2  idempotent: true---kind: taskversion: 1runner:  kind: script  runtime: python  entry: render.maininput: report.spec@1
ptn applywhat gets built
report.request@1trigger · webhook
derived from on:
gather@1task · agent

derived from uses:

ledgerpostgres · query
receiptsobject store · get
fx_rateshttp · request
derived from then:
render@1task · script
declared output
report.htmlvalue · file

You never drew an edge. Every arrow above came out of an on:, then:, or uses: reference — hover either side to see which.

four primitives — the whole vocabulary

Trigger
cron · webhook · manual
Task
script · agent
Resource
postgres · object store · http
Approval
approvers · timeout

five values — everything that crosses a seam

Text
a body of words
File
content-addressed blob handle
Table
columns plus a row source
Record
typed against a registered schema
Error
typed failure, routed not thrown

That is the entire vocabulary, and it is closed on purpose. All your business meaning lives in Records, checked against schemas you register, so the engine never grows a branch for your domain and your hundredth workflow type costs the same as your first.