Engineering

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.

granted = what it asked for ∩ what you hold ∩ what this runtime can actually fire
kortecx :: manifestan example app
$ kx app manifest apps/local/repo-warden
apps/local/repo-warden — capability manifest
model: (served default) [served]
tools (reach: explicit):
fs-read@1 [satisfied]
text-summarize@1 [satisfied]
fs-write@1 [MISSING — not granted or not fireable]
connections:
slack [satisfied]
it asked for three · you granted two · the third will refuse
The connectors that ship, and the one you writeA shelf of connectors. Slack, Notion, Gmail and Discord come bundled with the runtime. Beneath them is one more slot, empty, which one command scaffolds into a working connector of your own. Every one of them makes its calls through the same gate.in the boxslacknotiongmaildiscordand the one that isn'tacmeevery call through the same gate
It reaches your stack

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.

kx connections add --provider slack · kx new connector acme
Connections and MCP
Describe the shape

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

It runs without you

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.

kx triggers add --kind cron --cron "0 9 * * 1-5" --timezone America/New_York --require-approval
Scheduling and triggers
One unattended run, from the clock to the recordA timeline of one unattended run. At nine in the morning, with nobody watching, it wakes. It reads the material it was given, decides for itself what to call, and then holds: the step it cannot take back waits for your approval. You say yes, it finishes, and what is left behind is its record rather than a running process.a duplicate event still runs it once09:00it workswaits for youyou say yesa recordnothing irreversible happened while you were away
Start

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.