“Can I let it run while I sleep?”
Most tools ask you to jump straight to autonomous, before you have ever watched it get the work right.
ConvOps runs the same governed workflow attended or on its own. Start with approvals on every step. As trust grows, let the work run on its own. Same workflow, same rules, with or without you watching.
attended by default · schedules · work pools · a record for every run
Yes, once they have earned it. The same governed workflow runs attended in your client or unattended on a schedule, and its approval gates hold either way.
ConvOps is the operations layer for AI agents: an MCP server that holds your team's process as workflows, with approval gates, a shared memory and an audit trail. It runs no AI models.
updated
Starting an agent on a timer takes a minute. Knowing it did the right thing, and what it cost, is the real work.
“Can I let it run while I sleep?”
Most tools ask you to jump straight to autonomous, before you have ever watched it get the work right.
“What did it do at 3am?”
A script on a timer leaves a log line on some box. Nobody can tell what ran, or why.
“What is this costing us?”
Runs nobody watches, with no cost per run, are a bill you discover at the end of the month.
One workflow, four levels of trust. Watch which steps still wait for a person, and what starts the run.
You watch every step and give each one an OK. Your AI tool is connected, and that is the whole setup.
drag, or use the arrow keys
The same bug sweep, run with you on Monday and on its own at 02:00 a few weeks later.
In Claude Code you type "run the bug sweep". A task starts with its workflow attached. Nothing to install: your AI tool asks ConvOps for each step.
Payment webhook returns 500 first. OK?You read what it picked, what it recalled and what it changed, and approve each step. Slow on purpose. This is how trust is earned.
pick work: approve and continue?
approvals this run · 0 of 5
The routine steps never needed a correction. You keep one approval, before bugs are closed, and let the rest run straight through.
one approval left, before bugs are closed
Every night at 02:00. Each time it fires, a fresh task starts with the same workflow, the same rules and the same approval.
The schedule fires. The run asks a pool for the next bug worth fixing and a runner you chose does the work.
The close waited for you. The run left its log, its retries and its cost, on the task where you can read them.
Bug sweep · nightly
example data
Payment webhook returns 500 first. OK?A pool is a saved question about your work, answered live. Each run takes one task, or learns there is nothing to do.
Bugs nobody touched for 3+ days
asking the pool
asking the poolasking the pool
asking the poolevery run keeps its session, log, retries and cost
Your AI tool asks for the step, does it, and moves on. No backend, no runner, nothing to deploy.
connect and go
Calendar rules, not cron strings. Start a fresh task each time, or pick the same task back up where it stopped.
two modes
A saved question about your work, answered live. The run gets one task back, or nothing to do.
pulled, never pushed
Named profiles for where runs happen: your machines, ConvOps cloud, your own OpenCode server or your own runner.
swap without touching tasks
# every night, whatever the state
0 2 * * * agent --prompt "$(cat sweep.md)"RRULE (RFC 5545), not cron. Spawn creates a new child task each fire, carrying the whole workflow. Resume-attach picks the same task back up at its current step.
{
"rrule": "FREQ=WEEKLY;BYDAY=MO;BYHOUR=9",
"mode": "spawn",
"creates": "task -> workflow: bug-sweep"
}A pool is a typed, validated filter over tasks, resolved live on every call. pools_next returns exactly one task or an empty object, so a workflow can branch on emptiness.
{
"slug": "rotting-bugs",
"filter": {
"op": "AND",
"nodes": [
{ "field": "type", "eq": "bug" },
{ "field": "stale_days", "gte": 3 }
]
}
}Named execution profiles. ConvOps dispatches to an isolated run on Kubernetes or your OpenCode server, or hands the envelope and a lease to your own runner. Precedence: step, then task, then workspace default.
{
"executors": [
{ "slug": "local", "is_system": true,
"description": "claude code on your machine" },
{ "slug": "opencode", "is_system": true },
{ "slug": "isolated-sonnet", "backend": "isolated",
"description": "one pod per run, your kubernetes" },
{ "slug": "gpu-box", "runner": "custom",
"description": "your infra" }
],
"precedence": "step > task > org default"
}The dispatch event is written in the same transaction as the task (outbox), redelivered idempotently, and orphaned runs are reaped. Each run records session id, execution log, retry count, status and cost in USD.
No. Attended execution is the default: your AI client, connected over MCP, asks for the step, does the work, and advances. A backend is only involved when a run must happen with nobody at the keyboard.
A schedule. Schedules are RRULE, the calendar standard, not cron strings, and they run in two modes: spawn a fresh task each fire carrying the whole process, or resume the same task mid-workflow at its current step.
It asks a pool: a saved, typed query over tasks that the engine resolves live on every call. pools_next hands back exactly one task or nothing, and empty is an answer the workflow can branch on. Work is pulled by capacity, never pushed onto a queue.
Wherever you point it: the local clients on your machines, a custom runner on your infra that receives an envelope and a lease, your own OpenCode server with your models, or ConvOps cloud. Execution is per-org configuration; switching backends touches zero task definitions.
The dispatch event is written in the same transaction as the task, so it cannot be lost. Delivery retries idempotently, unreachable backends degrade gracefully, and orphaned runs are reaped rather than leaking.
Each executed task records its session, execution log, retry count, and cost in dollars, queryable from your client. Autonomy without a cost column is a bill you discover later.