Ten products.
One operator.
A fleet that hands work to itself.
DigitalMove is one engineer and a fleet of AI agents. Between them they run ten product lines: WordPress plugins with paying subscribers, a free learning platform, a dead-man's-switch service live since 2023.
Business OS is what makes that arithmetic work. We don't sell it. We had to build it before anything else could exist — which makes it the clearest evidence we have that we can design agent systems that survive contact with production.
- Status
- Running daily
- Kind
- Internal platform
- Scope
- 10 workspaces, 7 roles
- Stack
- Python · SQLite · Markdown
- Models
- Two tiers, by task class
- Cadence
- Scheduled + on demand
- 06:30 maya→business-os task12 failed or pending orders in 30 days — roughly seven times the expected rate. Pausing the campaign.
- 08:10 viktor-cto→business-os qa-resultDaily KPI snapshot green. Reconciliation OK.
- 10:55 healthcheck→business-os, angelreminder incidentCron stale on the dead-man's-switch. That cron is the product's heartbeat.
- 10:56 healthcheck→business-os, angelreminder resolvedRecovered. Login, register, status all answering. 59 seconds of staleness.
- 11:58 viktor→business-os escalationTwo drafts rejected twice by the reviewer. A human has to adjudicate.
- 12:36 timo→konrad, business-os decisionDownload schema spec written. Files live outside the repo — deliberately.
Real messages, trimmed for length. Every one carries a sender, addressees and a type — because a shared chat window is not a protocol.
Brief What was actually in the way § 01
The bottleneck was never the model.
One person cannot hold ten product lines in their head. Neither can an AI session, which starts blank every single time. Ask three agents the same question about pricing and you get three answers, two of them stale, and no way to tell which is which.
That is not a prompt problem, and no amount of model upgrade fixes it. It is three engineering problems wearing a trenchcoat: shared memory that outlives any one session, a protocol so agents can hand work to each other without a human relaying it, and guardrails that hold even when an agent is confident and wrong.
Business OS is our answer to those three. Everything below is how it is actually built — including the parts we got wrong first.
Ledger What is running § 02
The loop every session runs, whether it was started by a human or by a scheduled tick. Orientation is not optional: an agent that answers before it looks things up is the single most expensive failure mode in the system.
Decisions What we chose, and what it cost § 03
Four calls that shaped everything after them.
One vault. Not per-agent memory.
Every agent could have kept its own notes. That scales beautifully until two agents disagree about the price of a product and both are sincere. So facts live in one versioned markdown vault, and an agent's private memory is only allowed to hold things that are true for that agent.
Cost: a written convention about what belongs where, and the discipline to follow it.
Bought: one answer per fact, and a diff when it changes.
Hybrid search, because identifiers aren't semantic.
Vector search is very good at “what do we know about pricing” and quietly terrible at “find decision record 017”. Product slugs, version numbers and record IDs are lexical objects — near-misses are useless. So retrieval runs both a vector index and a keyword index and fuses the two ranked lists.
Cost: two indexes to keep current instead of one.
Bought: exact lookups stopped failing silently, which is the failure that teaches an agent to guess.
Agents write to an addressed inbox, not a shared window.
The tempting design is one big shared context that everybody reads. It does not survive ten workspaces. Instead every message carries a sender, addressees, a type and a seen-by list. Work handed over becomes an assignment; an assignment is closed by a reply that says what happened, including when it failed.
Cost: agents must be told to check the inbox at session start — a habit, and habits need enforcing.
Bought: handovers that survive a session ending mid-task.
Route routine text to a cheap tier with no tools.
Drafting a changelog paragraph does not need a frontier model. A second, much cheaper model handles that class of work — deliberately started with no tool access at all, one shot, hard timeout. It can produce text and nothing else, so a bad output is a bad paragraph, never a bad write to the server.
Cost: its output has to be reviewed before it ships. Every call is logged so we can judge whether the tier earns its keep.
Bought: expensive reasoning spent on judgement instead of prose.
Incidents What broke, and what it changed § 04
Both of these were design errors, not accidents.
Data integrity
Parallel writers corrupted 68 course files.
Several agents edited the same content tree at the same time. German umlauts were mangled by overlapping writes, and by the time anyone looked there were over a thousand corruption markers across the tree. Nothing crashed. That was the problem — it was still valid text, just wrong.
What we had assumed: that agents working on separate tickets were working on separate files. Nobody had written that down, so nothing enforced it.
Fix → revert to the last good commit, then add a lint gate that fails the build on corruption markers. A gate that costs seconds is cheaper than a cleanup that costs an afternoon.
Retrieval discipline
The knowledge base existed. Agents guessed anyway.
Asked where something lived, agents reasoned from context instead of searching — and reasoned plausibly, which is worse than failing. The founder's verdict was blunter than any bug report: what is the point of your own second brain if you can't use it?
What we had assumed: that making retrieval available would make it habitual. It does not. Available and reflexive are different properties.
Fix → a hard gate in the operating instructions: any structural question runs a vault search before an answer is formed. Plus a map note, because retrieval nobody can navigate is retrieval nobody uses.
Transfer What this means where you are § 05
If you are putting agents into production, these are the parts that bite.
State is the hard part, not prompts
Prompt quality plateaus quickly. What determines whether a fleet is useful in month six is whether it shares one source of truth and can find things in it under exact identifiers.
Guardrails belong in the protocol
“The agent shouldn't do that” is not a control. Ours refuse: certain paths are read-only, certain material is scoped to one role, and the rules are stated where the agent reads them first.
Cost is an architecture decision
Tiering by task class, with capability removed from the cheap tier rather than merely discouraged, is the difference between a fleet you can afford to run daily and a demo you run twice.