tva
← Insights

Designing a Company OS Around One AI Assistant and Many Work Threads

There is a point where a solo operator or small company stops having a tool problem and starts having an attention problem. The work is not one project anymore. It is marketplace monitoring, finance follow-up, infrastructure maintenance, product research, client work, website changes, and whatever arrived by email while you were dealing with something else.

The naive answer is to create more assistants. One bot for finance. One for Amazon. One for infrastructure. One for research. That looks organized for about a week. Then the real problem appears: the operator now has to remember which agent knows what, which one owns which decision, and which chat contains the current truth.

Our answer at tva is different. We are building a Company OS around one visible assistant, Carmen, with multiple parallel work threads behind her. The goal is not to make the org chart more complicated. The goal is to keep one front door while allowing the work to continue in several contexts at once.

This article is part of the same operating-system layer as our earlier work on project-specific AI assistants on Telegram, scaling a Telegram assistant from solo use to a team, agent-owned mailboxes, and disaster recovery for self-hosted services. Those posts explain the pieces. This post explains the human-facing operating model that keeps the pieces from becoming another pile of tools.

The problem with an agent zoo

Generalist agents are easy to create. Durable operational responsibility is harder. If every recurring area gets its own visible bot, the user is forced to become the router. That creates the same failure mode we were trying to remove: work gets lost because the human has to remember where it belongs.

For a small operation, this matters. The same person may need to ask about Amazon return rates, approve a finance reply, check a deployment, and capture a new business idea in the same hour. If the assistant is busy with a long task, the next question still needs somewhere to go. If the answer is "start a new bot," the system has already leaked implementation details into the user experience.

The better boundary is not one agent per domain. It is one interface with separate work contexts.

Inbox plus threads

The current model is simple on purpose:

  • Inbox is the hallway. New requests arrive there. Quick questions can be answered there.
  • Thread 1–5 are the human-visible work contexts. Each thread has a current label, owner, executor, status, blocker, and next update policy.
  • Infrastructure is separate. Gateway health, model fallback, backups, cron mechanics, and update runbooks support the system, but they do not consume a work thread.
  • Cron jobs, Kanban tasks, scripts, and specialist profiles are machinery. They may execute the work, but Carmen remains the visible interface.

The terminology matters. We started with "Meeting Room 1–5" because it made concurrency visible. After using it, "Thread" became the better word. It is lighter, closer to how Telegram topics behave, and less likely to turn the model into a fake corporate floor plan. The storage can still use legacy room-1 IDs. The user-facing language is now Inbox plus Thread 1–5.

A routing receipt for every non-trivial request

When work moves out of Inbox, Carmen gives a short receipt:

Moved to Thread N — label.
Why: routing reason.
Executor: profile, job, or substrate.
Expectation: ETA or next check.
I will report on completion, blocker, or by the next check.

This is small, but it changes the behavior of the system. The user no longer has to infer whether a request was understood as a quick answer, a recurring domain, an infrastructure discussion, or a long-running task. The receipt also prevents silent sprawl. A new thread needs a reason. A specialist profile needs a role. A cron job needs a human-visible context or it stays under infrastructure.

That receipt is also a useful forcing function for the assistant. If Carmen cannot state why something belongs in a thread, who will execute it, and when the next update should happen, the request is not ready to become background machinery.

The state file is boring on purpose

The current state lives in a YAML file. That is not glamorous, but it is the right trade-off at this stage. The file records the occupied threads, labels, executors, linked jobs, blockers, latest updates, and the infrastructure register. It is versioned in git. It can be reviewed. It can be repaired by a human if the automation gets confused.

There is a temptation to jump straight to a database, dashboard, or custom router. We are deliberately not doing that yet. The operating model has to be clear before the automation becomes clever. Once the manual discipline works, a database or Telegram topic integration can replace parts of the file-backed state without changing the user model.

This mirrors how we approach solo operations at scale more generally: make the state visible first, then automate the boring parts.

The thread examples also connect to work we have already documented: Amazon Seller Central extraction is the kind of machinery that can run under a marketplace thread, bank-statement automation belongs under a finance thread, and self-hosted deployment pipelines sit under infrastructure unless they affect a specific workstream.

What runs behind the threads

A thread is not the worker. It is the place where the human sees the work.

Thread 1 can cover Amazon Seller Central monitoring while cron jobs fetch data, scripts verify anomalies, and a specialist worker prepares reorder planning. Thread 2 can cover bowling-center research while scraping jobs run quietly. Thread 3 can cover the Company OS architecture itself. Thread 4 can cover finance and accounting evidence gathering. The visible structure stays stable even when the machinery underneath changes.

That distinction matters because recurring jobs can become noisy. A healthy cron job should not send a chat message every time it runs. It should report material deltas, failures, blockers, and decisions. Routine success can stay local. The user should see what changed, not every heartbeat.

Specialists stay specialists

The model does not forbid specialist profiles. It just stops them from becoming the primary user experience. A specialist can own a narrow capability, review a document, run a long research task, or maintain a particular automation. But the user should not need to remember the internal cast list to operate the company.

This is the same reason we document skills and runbooks instead of relying on chat memory alone. A good assistant should get better over time, but the important operating rules should survive any single session. Skills, state files, ADRs, and SOPs give the system something more durable than vibes.

For the technical side of this pattern, our posts on domain-specific AI agent skills and tuning a Hermes-style agent cover the lower-level mechanics. The Company OS layer sits above that. It decides where work belongs and how it becomes visible to the operator.

What we are not automating yet

Some actions should not happen just because a message was routed correctly. External sends, credential changes, payments, ad spend, listing changes, DNS changes, and tax or legal decisions still require explicit approval. Routing is not authorization.

That separation is important. A Company OS should reduce operational load without quietly taking over judgment. The assistant can gather evidence, prepare drafts, run read-only checks, and flag decisions. It should not convert every well-structured request into an irreversible action.

Why this feels different in practice

The main benefit is not that the system has five threads. The benefit is that the user can keep talking to one assistant while the work remains sorted. A new idea can enter Inbox while a scraping job runs. A finance question can land in its thread without disturbing an infrastructure incident. A cron failure can be reported under the work context it affects.

It is a small operating model, but it changes the daily texture. Less "where did we put that?" More "Thread 3 owns it, here is the last update, here is the next check." That is the point.

The Company OS is still evolving. We will probably replace pieces of the storage layer. We may wire Telegram topics more directly. We may add a database once the mutation patterns are clear. But the user-facing rule should stay boring: one Carmen, one Inbox, several threads, visible state, and no agent zoo.

Further Reading