Agents on your stack, scoped to the job.
An agent asks for what it needs; you decide what it gets. Before you run anything — your own app or one a colleague sent you — you can read the whole ask against what you have actually granted. The runtime resolves the same intersection at run time, so what you read is what will happen.
Connect what you already run — or write the missing one.
Slack, Notion, Gmail and Discord come in the box: name the service, put its credential in your keychain once, and the runtime dials it, asks what it can do, and writes the answer down. When the thing you need is not there, one command scaffolds a working connector with a fake mode, so you can build and test it before a real credential exists.
One line is the whole dependency graph.
Say what runs after what, and what can run at the same time. A name used twice is the same step, which is how a line becomes a graph rather than a list — and the same expression compiles identically from the CLI, Python and TypeScript.
kx chain run "plan > [build & test] > review" --tasks tasks.json --wait> runs after · [a & b] run together · a name used twice is the same step
On a schedule, and still stopping to ask.
Put the work on a clock or behind a webhook and it runs while nobody is watching — a duplicate event still runs it once. It reads the material you gave it, decides for itself when to search and when to call a tool, and then holds: anything it cannot take back waits for your yes. If a step fails it runs that step again, and the work already finished is not redone.
One binary, and no cluster to keep warm.
Runs end to end as a managed service, and there is nothing to provision before it does.
It is also v0.1.0, and we would rather you found the limits here than in your own week.