Declare a flow. Observe the data through it.
Flow is the signal-flow registry on WAVE, media infrastructure for the agentic internet. A flow is a declared chain of nodes and gated transitions, and the registry stores it only when every stage cites where it came from.
"nodes": [{ "id": "asr" }]
{"error":"node[0] is missing
a valid origin { source, year }"}
"nodes": [{ "id": "asr", "origin":
{ "source": "Wiener", "year": 1949 } }]
{"ok":true,"id":"voice-agent"}
The registry will not store a stage that cannot say where it came from. That refusal is the product.
example flow: voice-agent · 6 nodes · 6 origins · read it back at GET /v1/flow/voice-agent
What a flow is
Nodes, transitions between them, and a lifecycle. Declare it once and the shape becomes readable: any surface, any agent, one GET. The declaration is data, so a flow can be diffed, reviewed, and versioned like the code that runs it.
Every node carries a receipt
An origin is a source, a year, and a note. It is required, not encouraged: the validator rejects the declaration and names the offending index. A flow you read back therefore tells you not only what the pipeline does but which idea each stage rests on.
$ curl -s https://flow.wave.online/v1/flow/healthz
{"ok":true,"failClosed":true,"scopes":["flow:read","flow:write"]}
A 200 with failClosed:true is the honest answer: the route is live and it refuses anything the gateway has not authenticated.
Federated, like the rest of WAVE
Auth, entitlement, and metering run through api.wave.online. This spoke owns the registry and the observation buffer, and nothing else. One key reaches it and every other WAVE surface, and an agent with no account pays per call at the same door.