Skip to content
Changelog

Ship Routines that stay off until someone turns them on

October 29, 20261 min read

You can now ship a CompanyOS template with a Routine that waits for a person to switch it on. Set enabled=False on Agno's Routine, and the template's users see it in their list with no runs firing.

Routine(
    name="daily-review",
    executor_type="agent",
    executor_id="reviewer",
    instructions="Review documentation and propose useful improvements.",
    cron_expr="0 9 * * *",
    enabled=False,
)

We ran this declaration through AgentOS with FastAPI's TestClient on SQLite, with no model, on both releases. The test moved the Routine's next run into the past, so the scheduler's claim query had a due row to pick up. Real output:

Before: enabled: Extra inputs are not permitted [type=extra_forbidden, input_value=False, input_type=bool]
Now:    claim_due_schedule (disabled): None
        claim_due_schedule (resumed): documentation.daily-review

The flag defaults to True, and it works in Python and YAML declarations, POST /company/routines, POST /company/setup, CompanyManager, AsyncCompanyManager and CompanyTools. A repeated create request for the same name still returns 409 and leaves the Routine disabled.

Agno OS turns a Routine on through the existing resume endpoint, and AgentOS keeps that choice across restarts.

See the cookbook, and learn more about CompanyOS Routines in the documentation.

Frequently asked questions

Call POST /company/routines/{id}/resume. It answers 200 with enabled set to true and a computed next_run_at, and the Routine needs no recreating.

No. The flag only sets the state at creation. A paused Routine stayed enabled=False when AgentOS restarted with a declaration of enabled=True, so saved choices win over code.

No. POST /company/routines/{id}/trigger answers 409 with {"detail": "Routine is paused"} until someone resumes it.

On this release: documentation.daily-review enabled= False, then claim_due_schedule (disabled): None, then POST /trigger 409 {"detail": "Routine is paused"}, then POST /resume 200 enabled= True, then claim_due_schedule (resumed): documentation.daily-review. After a restart it printed enabled after restart= True.

Shipped around the same time