Skip to content
Changelog

CompanyOS Routines read a Product's Sources and file evidence-backed Tasks

ContributorAshpreet BediFounder & CEO

October 19, 20262 min read

Agno's CompanyOS Products now take sources and routines, and each Routine you declare becomes an ordinary AgentOS schedule that /company/routines lists, edits, pauses and triggers. A Routine runs on its cron, or only when someone triggers it if you leave the cron out.

Diagram of a CompanyOS Routine. A Source returns a link and content hash, a Routine runs a template or custom instructions, Intake verifies the evidence, a Backlog Task waits in a Project, and a person or an auto_accept policy moves it to Ready

A Source is a git repository, a markdown file or folder, or a single website page. Readers return a file index first, then one document at a time with a link and a SHA-256 hash of its content. The executor picks the evidence worth acting on and hands Intake a title, a brief and a stable proposal_key. Intake rereads those links, refuses changed content and keeps one Task per key, so the next scan of the same issue returns the Task it already filed. Agents can also save website Sources they discover through add_company_source, stamped with their agent and run ids.

Each Routine runs either a packaged template or your own instructions. intake proposes Tasks, refresh proposes Project completion and archives Done or Cancelled work older than metadata.archive_window_days, and summary writes summary.md and sends it to an interface such as Slack.

We declared a Documentation Product with a markdown Source, a weekday intake Routine and a custom watch Routine with no cron. A real Routine run would let an agent read the Source and call Intake. No model key was available, so the script made those calls through CompanyManager directly, as the release's 07_heartbeat.py cookbook does. Real output:

docs.intake  scheduled  cron=0 9 * * 1-5  template=intake  managed_by=company
docs.watch   on_demand  cron=None         template=None    managed_by=company
first scan:  'Document the new API' -> backlog
stale hash:  Proposal evidence changed; read the Source again before proposing work
repeat scan: same Task True, Tasks in Product 1
Product metadata: {'archive_window_days': 14, 'routine_ids': 2}

Routine Tasks wait in Backlog until a person accepts them, or until an auto_accept policy on the Routine does. The policy names one executor, must carry limits.expires_at, accepts one distinct Task by default and always runs at least one server-side check, such as project_active, has_source_evidence or executor_registered. With scheduler=True, a managed Company automation schedule checks every minute for Ready Tasks and authorized proposals. In the release's 06_execute_tasks.py cookbook, run against an embedded Postgres queue, that tick accepted an Intake proposal with the reason "Authorized Routine proposal" and ran it to In review.

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

Frequently asked questions

Declare it in code with Routine(name=..., executor_type=..., executor_id=..., template=... or instructions=...) inside Product(routines=[...]), list the Product in CompanyConfig(products=[...]), or POST to /company/routines. The executor must already be registered with AgentOS.

Intake reads Sources and proposes evidence-backed Tasks. Refresh proposes Project completion, archives old Done and Cancelled work after metadata.archive_window_days (14 by default) and updates status.md. Summary writes summary.md and delivers it through an interface named in Product metadata.

Only under a human-authored auto_accept policy. The policy names one executor and requires limits.expires_at. It accepts one distinct Task unless max_acceptances says otherwise, and it runs the executor_registered check unless you choose other checks.

Intake rereads each selected link and compares its content hash with the hash the executor observed. A mismatch raises "Proposal evidence changed; read the Source again before proposing work" and creates no Task.

Shipped around the same time