Skip to content
Changelog

CompanyOS keeps Routines linked to their Products

October 20, 20261 min read

Agno's CompanyManager.update now copies a Product's stored Routine ids into the new metadata inside the update transaction, under the same write lock that links a new Routine, and drops any routine_ids the caller sends. That routine_ids list is how CompanyOS ties a Routine to its Product. It feeds the Routine count, the failed-Routine count in /company/attention and project auto-completion for refresh Routines.

In earlier releases a metadata edit replaced the whole dict and dropped the list. An agent with SchedulerTools or Studio's update_schedule could also delete a Routine and leave its id behind on the Product, re-enable one whose Product is archived or rewrite its message. We ran the same scenario on both releases against an AgentOS with CompanyConfig on SQLite.

Real output from an AgentOS with CompanyConfig on SQLite, one Product with one intake Routine. Step 1, PATCH /company/products with metadata team b: before, routine_ids is empty; now, routine_ids still holds the Routine. Step 2, SchedulerTools.delete_schedule on the Routine: before, status deleted and the Product still lists the deleted id; now, error_type company_routine and the Routine stays linked.

The refusal reads Schedule <id> is a Company Routine. Change it through Company Routines. Triggering a Routine from the tools still works, and plain schedules behave as before.

OS Manager now sends Company work to the right member. Its Company add-on delegates Products, Projects, Tasks, Sources and Routines, setup and status questions included, to Product Manager, so a request like "set up a daily routine for Docs" reaches the member that links the Routine to its Product.

Under user_isolation=True, the Company tools now follow the same ownership rules as the Company HTTP routes:

  • Routines declared in code or YAML have no owner. Their Company tool calls used to fail with Caller identity is required under user isolation, and now run unscoped on their own Product.
  • edit_company_project and edit_company_task let any writer edit, as the PATCH routes do.
  • refresh_company_product archives only the caller's finished work.
  • Any writer can add a Routine to a Product, and a new Routine from a /company/setup retry belongs to the caller.

See the cookbook, and learn more about Scheduler tools in the documentation.

Frequently asked questions

Earlier releases replaced the whole metadata dict on a Product update, and the routine_ids list lives inside it. This release copies the stored Routine ids into the new metadata inside the update transaction on SQLite and Postgres, sync and async. CompanyManager.update also drops any routine_ids a caller sends.

No. delete_schedule, enable_schedule and disable_schedule return an error with error_type company_routine, and Studio update_schedule returns the same code. Agents can still trigger a Routine, and ordinary schedules stay editable.

Yes. A Routine declared in code or YAML has no owner, and this release runs its Company tool calls unscoped, limited to its own Product. Earlier releases failed those calls because the run had no caller identity.

Shipped around the same time