# Run CompanyOS Products, Tasks and a Product Manager inside AgentOS

> Agno's AgentOS takes company=CompanyConfig() and serves Products, Projects, Tasks, wiki pages and a decision log under /company, plus a built-in Product Manager agent that proposes Backlog work for a person to accept.

- Published: 2026-10-16
- Author: Ashpreet Bedi
- Categories: Changelog
- Canonical: https://www.agno.com/blog/run-companyos-products-tasks-and-a-product-manager-inside-agentos
- Markdown: https://www.agno.com/blog/run-companyos-products-tasks-and-a-product-manager-inside-agentos.md

Agno's `AgentOS(db=db, company=CompanyConfig())` turns on [CompanyOS](https://www.agno.com/blog/introducing-companyos) and mounts its routes under `/company`, with tables created on the first write. Leave `company` out and AgentOS adds no Company route, table or permission scope.

```python
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openai import OpenAIResponses
from agno.os import AgentOS, CompanyConfig

db = SqliteDb(db_file="company.db")
writer = Agent(id="docs-writer", model=OpenAIResponses(id="gpt-5.6-luna"), db=db)

agent_os = AgentOS(
    db=db,
    agents=[writer],
    company=CompanyConfig(model=OpenAIResponses(id="gpt-5.6-luna")),
)
app = agent_os.get_app()
```

A Product is a named area of responsibility with a purpose. Projects inside it move from `proposed` to `active` to `done`. Tasks start in `backlog` and move through `ready`, `in_progress` and `in_review` to `done`, and either record can be `cancelled` before it finishes. Every move goes through `POST /company/tasks/{id}/transitions` (or the Projects twin) with a target and a reason, and the record keeps that history. A person makes a Task Ready by naming a registered agent, team or workflow as its executor, and AgentOS checks that the caller may run it. From then on the Task's scope is frozen until someone returns it to Backlog.

Each Product also gets a playbook wiki with `brief.md` for human direction and `status.md` for current work, and the company shares one more at `/company/wiki`. A write must carry the version it read, so a stale edit gets a 409. Decisions go to `/company/decisions` as an append-only log.

The Product Manager is a reserved agent, `product-manager-internal`, served at `/agents/product-manager-internal/runs` or as an OS Manager member when OS Manager is on. Its tools read Products, Projects, Tasks and the wiki, propose and edit Backlog work, update `status.md` and log decisions. None of them can accept or finish a Task, change an owner or schedule a run, and AgentOS injects the caller's identity outside the model's tool arguments.

We drove the whole loop over HTTP on SQLite. A scripted stand-in model, built like the offline planner in the release's own tests, played the Product Manager's model.

![Real output from AgentOS on SQLite. POST /company/products creates the Docs Product with brief.md and status.md at version 1. A Product Manager run with a scripted stand-in model proposes the Task Update the quickstart for the new API in backlog and writes status.md version 2. A person moves the Task to ready with the agent docs-writer as executor. A later PATCH returns 409 Accepted task scope requires a return to Backlog.](https://www.agno.com/images/v3-1-4-company-products-pm.png)

`CompanyManager` and `AsyncCompanyManager` expose the same records from Python, and `CompanyTools` can be published to MCP clients with `MCPConfig(tools=[...])`.

See the [cookbook](https://github.com/agno-agi/agno/blob/main/cookbook/05_agent_os/30_company/03_manage_tasks.py), and learn more about [AgentOS](https://docs.agno.com/agent-os/overview) in the documentation.
