“Why does the AI only work when someone types?”
Every run needs a person at a keyboard and a chat left open. When they log off, the work stops.
Unattended runs are ConvOps workflows that start on a schedule, without anyone typing. Every run is on the record. People keep the approvals and the stop button.
schedules · one pod per run · tokens and cost per run · gates still hold
Give the workflow a schedule. Each run starts without anyone typing, works in its own pod, pushes to a task branch and stops at any approval gate for a person.
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
AI that only runs while someone types is a tool, not a team. And what runs unwatched is rarely on any record.
“Why does the AI only work when someone types?”
Every run needs a person at a keyboard and a chat left open. When they log off, the work stops.
“What ran last night?”
A script fired on someone's machine. Whether it finished, failed or never started, nobody can say.
“What did it cost?”
Tokens disappear into one monthly bill. No run, no model and no task carries its own number.
One bug sweep, start to finish. Nobody typed a word until the review.
The bug sweep has a rule: every weekday at 01:00 UTC. Nobody is awake. The schedule creates the task and starts the run.
FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=1One pod for this run: the agent, its tools beside it, a volume for the task and a secret for this run only. It works the workflow step by step.
The sweep is long. At the executor's time limit the run stops cleanly. Nothing is thrown away: the volume holds every file it touched.
The run stops cleanly at the limit. The task volume, and every file on it, stays.
A new run starts on the same volume and carries on. The record links it to the run it continued, so the night reads as one story.
The fixes go to a branch named for the task, ready for review. Had the run failed, the work would sit on a rescue branch instead.
Two runs, the tokens, the cost per model, the duration. The workflow waits at the review gate. You read the branch and approve.
Bug sweep 2026-10-02
step 5 of 6 · review
convops/task/8c1e
FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=1None of them needs a person at a keyboard. All of them land on the same record.
A recurrence rule on the task, such as every weekday at 01:00 UTC. You can also fire it by hand.
rule-based
A run can dispatch the next task it finds, within a per-run limit, so one night's work can lead to the next.
bounded
A run that reaches its time limit starts again on the same volume and carries on from where it stopped.
same volume
Your own product creates scheduled work through the SDK, when your customers or your data say so.
through the SDK
Every weekday at 01:00. Mondays at 05:00. Each schedule says when it fires, in UTC, and you can fire it by hand.
Tokens, cost per model, turns, duration and how it ended. For every run, whoever or whatever started it.
Finished, stopped by a person, resumed after the time limit, or failed with the work kept. Each one is recorded.
where the work lands
A schedule starts the work. It does not approve it. Gates hold for unattended runs, and any run can be stopped.
Bug sweep 2026-10-02
step 5 of 6 · review
convops/task/8c1e
example · the workflow does not move on until a person decides
the trust ladder
Start with approvals on every step. As trust grows, let the work run on its own.
How autonomy growsAn RFC 5545 rule on a scheduled task. Each fire creates a child task that inherits the title, project and executor, then runs it. Times are UTC.
{
"tool": "schedule_create",
"arguments": {
"title": "Bug sweep {date}",
"vertical": "development",
"project": "checkout",
"rrule": "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=1;BYMINUTE=0",
"executor": "claude-opus",
"description": "Pick open bugs, fix, test, push the task branch."
}
}Each run keeps its trigger, outcome, error class and stats: tokens in total and per model, turns, duration and cost, with where the cost came from.
{
"run_id": "run_4f2a",
"task": "Bug sweep 2026-10-02",
"executor_name": "claude-opus",
"agent": "claude-code",
"trigger": "resume",
"resume_of": "run_9b71",
"status": "succeeded",
"outcome": "succeeded",
"stats": {
"tokens": { "total": 71000, "by_model": { "opus": 64200, "haiku": 6800 } },
"turns": 38,
"duration_ms": 1330000,
"cost_usd": 0.82,
"cost_source": "computed"
}
}The first run of the night ended at the time limit. Its error class says so, and the resume above points back to it.
{
"run_id": "run_9b71",
"trigger": "schedule",
"status": "failed",
"outcome": "time_limit",
"stats": {
"tokens": { "total": 341000, "by_model": { "opus": 341000 } },
"turns": 214,
"duration_ms": 14400000,
"cost_usd": 4.36,
"cost_source": "reported"
}
}The time limit is set per executor, four hours by default. A run may dispatch follow-up tasks, within a per-run limit, and any run can be stopped.
{
"name": "claude-opus",
"backend": "isolated",
"isolated": {
"agent": "claude-code",
"model": "opus",
"time_limit_s": 14400
}
}Four things. A schedule with a recurrence rule, such as every weekday at 01:00 UTC. A run dispatching a follow-up task, within a per-run limit. An automatic resume after a time limit. And your own app, creating scheduled work through the SDK. You can also trigger any schedule by hand.
Every executor has a time limit, four hours by default. When a run reaches it, the run stops and resumes automatically on the same volume, so the files it was working on are still there. The record shows both runs and links the resume to the one it continued.
The run pushes its commits to a task branch for review, or fast-forwards the target branch when the history is clean. If a run fails, its work is pushed to a rescue branch, so nothing it did is lost.
Only if your workflow lets it. Approvals in the workflow hold whether a person or a schedule started the run. The run waits at the gate until someone with the right role approves. Start with approvals on every step and remove them as trust grows.
Every run is recorded with its tokens, a per-model split, cost, turns, duration and, when it fails, an error class. Cost is either reported by the agent or computed from tokens, and the record says which.
Yes. Any running run can be stopped from the runs view or through the API. The record keeps it as stopped, with what it used up to that point.
No laptop. Runs execute in isolated pods, one per run, on our cloud or on your own Kubernetes cluster. Enterprise customers can self-host with a Helm chart, so nothing has to leave the cluster.