Krishnendu Biswas

Multi agent operations platform: 9 agents, one job each, and my approval on risky steps

The platform runs on Hermes Agent, an open source agent runtime from Nous Research. The design is mine: which agent owns what, how work is handed between them, and where it stops for me. Private system; architecture and verified telemetry shown here.

Agents
9 agents
1 router + 8 domain agents
Recurring Jobs
57 recurring jobs
counted 1 Nov 2026
Logged Hours
331.6 h
logged with the agents over 46 active days
Human Gate
Human gate
sends, deletes and public pushes wait for me

Why nine agents and not one

One agent that does everything carries every instruction at once and holds every key at once. The agent drafting an email does not need deployment credentials; the agent parsing receipts does not need my LinkedIn drafts. Mixed instructions produce mixed behaviour, and shared access turns one mistake into a wide one.

So the work is partitioned the way a company partitions departments: mutually exclusive, collectively exhaustive. Each agent has one domain, its own workspace, its own memory, and only the tools that domain needs. A router decides who owns a request. The infrastructure agent checks hourly that nobody has drifted out of lane.

Topology

Nine agents, one owner per domain, no overlap. Alongside these agents, a typed decision model answers narrow questions for them; details on Fast decisions.

Who owns what One router, eight domain agents, one gate. Dashed lines are audit and planning paths, not request paths. Me dictate, check, send Hermes Gateway Discord & Telegram Kanban Board task card dispatch Router (default) classifies & assigns Fable Planning maximum reasoning Academics Career prep Finance Personal ops Socials Consulting Infrastructure Private (institute) Human Gate waits for me Google Tasks action ledger 9Router Model Gateway & Direct Claude Calls approve or send back needs me
Who owns what: one router, eight domain agents, one gate. Dashed lines are audit and planning paths, not request paths.
ComponentRolePermissions and Policy
MeDictate, check, sendReviews risky steps
Hermes GatewayIngestionDiscord and Telegram gateways
Router (default)Central dispatcherClassifies intent, assigns task cards
Kanban BoardCoordinationTask card hand offs, parent child tasks
AcademicsCoursework and researchIIM Ranchi and IIT Madras
Career prepApplications and prepResume and interview preparation
FinanceReceipts and accountingRule based parsing to Firefly III
InfrastructureSystem maintenanceServices, backups, secrets, drift audits and cleanup proposals
Personal opsDaily operationsBriefings, reminders, habits
SocialsContent draftingDrafts reviewed by human
ConsultingCommercial projectsClient work in isolated workspaces
PrivateInstitute workOne agent for institute work, private
Human GateApproval checkpointMandatory approval for sends, deletes, pushes
Google TasksAction ledgerSyncs what needs me
FablePlanning passMaximum tier reasoning before build
9RouterModel gatewayModel routing and fallback

Router

The default agent receives every message from Discord or Telegram, classifies it, and hands it to the owning domain agent as a kanban card. It does small lookups itself only when routing would cost more than the task.

Domain agents

  • Academics: Coursework at IIM Ranchi and IIT Madras, research reading and deadlines.
  • Career prep: My own applications, resume and interview prep.
  • Finance: Receipts to ledger, self hosted Firefly III.
  • Infrastructure: Declared system state, services, backups, secrets. Houses the hourly drift audit engine and cleanup engine.
  • Personal ops: Tasks, briefings, reminders, habits.
  • Socials: LinkedIn and personal posts, drafted by the agent, published by me.
  • Consulting: Commercial go to market consulting.
  • Private: One agent for institute work, not described here.

Kanban hand offs

Work moves as cards: objective, context, acceptance criteria, owner. The router writes the card, the owner session writes the artifact, and a card can spawn read only children for research or critique. Cross domain jobs are separate cards linked by a parent, never one mixed artifact.

Planning at maximum effort

Some tasks need a specification before anyone writes code: multi file architecture, design direction, fact audits. Those go to a planning pass I call Fable: the strongest available model at its highest reasoning tier, asked for an executable plan. Builders then follow the plan.

Upkeep

The infrastructure agent audits configuration drift every hour and files findings rather than silently fixing them. Its janitor engine batches cleanup proposals and waits for my approval before deleting anything.

How a request moves

I dictate, check the text, then send it. What needs me lands in Google Tasks.

How a request moves Read only steps happen before the approval gate. Anything that sends, deletes or publishes waits for me, with no timeout. LANE: ME ROUTING & KANBAN EXECUTION 1 Dictate & check FreeFlow / Dictate 2 Deliver message Discord / Telegram 3 Classify intent writes task card 4 Dispatch card to domain worker 5 Read only work research & drafts 6 Send, delete or push? Parked no timeout Inspect diff approve / send back 7 Apply change close task card 8 Google Tasks sync ledger no yes approve send back
How a request moves: read only steps happen before the gate. Risky steps wait for approval.
StepStageActorActionGating
1InputMeDictate and check transcriptSelf review
2IngestionGatewayDeliver message via Discord or TelegramAutomated
3TriageRouterClassify intent and write kanban cardAutomated
4DispatchKanbanRoute card to domain agentAutomated
5ExecutionDomain agentRead only work: research, drafts, diffsAutomated
6ReviewMeInspect diff or artifact at the human gateApproval required
7ApplyDomain agentApply change and close task cardGated
8SyncGoogle TasksSync open actionables that need meAutomated

Input

I dictate with FreeFlow on Mac or Dictate on Android, both free and open source, read the transcript, and send it as text on Discord or Telegram. I skip the runtime's own voice plugins on purpose: I want to see what got written before an agent acts on it.

The gate

Sends, deletes and public pushes wait for my approval. Outbound email, file deletion and public git pushes stop at the gate until I have inspected the diff or the artifact. A question to me has no timeout. An unanswered card parks; it does not proceed.

Output

Important actionables that need me are synced to Google Tasks by an idempotent ledger, and a watcher logs what I complete or edit so the agents learn what I actually did.

Hours with my agents

Time I spent working with the agents on Discord, Telegram, the command line and Claude Code.

Total hours
331.6 h
Active days
46
Avg / active day
7.2 h
Longest day
13.5 h
15 Oct 2026
Hours with my agents, by day Daily hours logged with agents from 13 Sep 2026 to 1 Nov 2026. Hours 0 4 8 12 16 13 Sep 2026: 0.2 hours 14 Sep 2026: 0.0 hours 15 Sep 2026: 0.2 hours 16 Sep 2026: 0.0 hours 17 Sep 2026: 0.0 hours 18 Sep 2026: 0.0 hours 19 Sep 2026: 3.3 hours 20 Sep 2026: 1.2 hours 21 Sep 2026: 1.8 hours 22 Sep 2026: 5.1 hours 23 Sep 2026: 5.4 hours 24 Sep 2026: 5.3 hours 25 Sep 2026: 9.2 hours 26 Sep 2026: 3.5 hours 27 Sep 2026: 4.5 hours 28 Sep 2026: 11.9 hours 29 Sep 2026: 5.7 hours 30 Sep 2026: 11.6 hours 1 Oct 2026: 8.9 hours 2 Oct 2026: 12.0 hours 3 Oct 2026: 9.5 hours 4 Oct 2026: 7.7 hours 5 Oct 2026: 12.3 hours 6 Oct 2026: 9.7 hours 7 Oct 2026: 12.2 hours 8 Oct 2026: 10.1 hours 9 Oct 2026: 7.0 hours 10 Oct 2026: 10.6 hours 11 Oct 2026: 10.9 hours 12 Oct 2026: 10.0 hours 13 Oct 2026: 10.0 hours 14 Oct 2026: 2.5 hours 15 Oct 2026: 13.5 hours Peak: 13.5 hours on 15 Oct 2026 16 Oct 2026: 7.6 hours 17 Oct 2026: 11.0 hours 18 Oct 2026: 10.9 hours 19 Oct 2026: 5.1 hours 20 Oct 2026: 6.3 hours 21 Oct 2026: 4.9 hours 22 Oct 2026: 10.2 hours 23 Oct 2026: 11.7 hours 24 Oct 2026: 7.6 hours 25 Oct 2026: 7.8 hours 26 Oct 2026: 12.5 hours 27 Oct 2026: 9.0 hours 28 Oct 2026: 3.7 hours 29 Oct 2026: 2.7 hours 30 Oct 2026: 1.4 hours 31 Oct 2026: 3.1 hours 1 Nov 2026: 0.3 hours 13 Sep 20 Sep 27 Sep 4 Oct 11 Oct 18 Oct 25 Oct 1 Nov
Hours with my agents, by day: 46 active days of 50 since the first message. Sessions are messages less than 15 minutes apart plus a 5 minute tail.
DateHours
13 Sep 20260.2 h
14 Sep 20260.0 h
15 Sep 20260.2 h
16 Sep 20260.0 h
17 Sep 20260.0 h
18 Sep 20260.0 h
19 Sep 20263.3 h
20 Sep 20261.2 h
21 Sep 20261.8 h
22 Sep 20265.1 h
23 Sep 20265.4 h
24 Sep 20265.3 h
25 Sep 20269.2 h
26 Sep 20263.5 h
27 Sep 20264.5 h
28 Sep 202611.9 h
29 Sep 20265.7 h
30 Sep 202611.6 h
1 Oct 20268.9 h
2 Oct 202612.0 h
3 Oct 20269.5 h
4 Oct 20267.7 h
5 Oct 202612.3 h
6 Oct 20269.7 h
7 Oct 202612.2 h
8 Oct 202610.1 h
9 Oct 20267.0 h
10 Oct 202610.6 h
11 Oct 202610.9 h
12 Oct 202610.0 h
13 Oct 202610.0 h
14 Oct 20262.5 h
15 Oct 202613.5 h
16 Oct 20267.6 h
17 Oct 202611.0 h
18 Oct 202610.9 h
19 Oct 20265.1 h
20 Oct 20266.3 h
21 Oct 20264.9 h
22 Oct 202610.2 h
23 Oct 202611.7 h
24 Oct 20267.6 h
25 Oct 20267.8 h
26 Oct 202612.5 h
27 Oct 20269.0 h
28 Oct 20263.7 h
29 Oct 20262.7 h
30 Oct 20261.4 h
31 Oct 20263.1 h
1 Nov 20260.3 h

How hours are counted

Counted from the timestamps of messages I sent to my agents in Discord, Telegram, the command line and Claude Code, whether dictated or typed. Messages less than 15 minutes apart form one session, each session gets a 5 minute tail, and automated notifications are excluded.

Tokens and models

Combined daily token throughput across three paths: 9Router, a local model gateway that routes each call to a provider and falls back when one fails; direct Hermes calls to Claude; and the Claude Code CLI.

Total tokens
12.47 B tokens
Cache hit rate
89.9%
Top token day
773 M
23 Oct 2026
Tokens processed by day Daily token throughput across 9Router, direct Hermes calls and Claude Code from 13 Sep 2026 to 1 Nov 2026. Million 0 200 400 600 800 13 Sep 2026: 0 thousand 14 Sep 2026: 0 thousand 15 Sep 2026: 11 thousand 16 Sep 2026: 40.8 million 17 Sep 2026: 65.0 million 18 Sep 2026: 48.7 million 19 Sep 2026: 32.0 million 20 Sep 2026: 10.1 million 21 Sep 2026: 52.5 million 22 Sep 2026: 171.3 million 23 Sep 2026: 199.9 million 24 Sep 2026: 154.9 million 25 Sep 2026: 78.4 million 26 Sep 2026: 23.2 million 27 Sep 2026: 65.2 million 28 Sep 2026: 340.1 million 29 Sep 2026: 191.1 million 30 Sep 2026: 140.8 million 1 Oct 2026: 217.6 million 2 Oct 2026: 389.3 million 3 Oct 2026: 515.4 million 4 Oct 2026: 251.4 million 5 Oct 2026: 498.2 million 6 Oct 2026: 593.3 million 7 Oct 2026: 758.5 million 8 Oct 2026: 448.0 million 9 Oct 2026: 364.1 million 10 Oct 2026: 487.1 million 11 Oct 2026: 350.4 million 12 Oct 2026: 388.5 million 13 Oct 2026: 589.9 million 14 Oct 2026: 30.5 million 15 Oct 2026: 279.1 million 16 Oct 2026: 415.4 million 17 Oct 2026: 203.9 million 18 Oct 2026: 309.0 million 19 Oct 2026: 505.0 million 20 Oct 2026: 146.2 million 21 Oct 2026: 249.2 million 22 Oct 2026: 597.6 million 23 Oct 2026: 773.0 million Peak: 773 million on 23 Oct 2026 24 Oct 2026: 79.5 million 25 Oct 2026: 326.3 million 26 Oct 2026: 314.5 million 27 Oct 2026: 389.0 million 28 Oct 2026: 153.1 million 29 Oct 2026: 36.8 million 30 Oct 2026: 41.5 million 31 Oct 2026: 134.1 million 1 Nov 2026: 24.9 million 13 Sep 20 Sep 27 Sep 4 Oct 11 Oct 18 Oct 25 Oct 1 Nov
Tokens processed by day: 12.47 B tokens in total; 89.9% of input tokens were served from cache.
DateTokens
13 Sep 20260 k
14 Sep 20260 k
15 Sep 202611 k
16 Sep 202640.8 M
17 Sep 202665.0 M
18 Sep 202648.7 M
19 Sep 202632.0 M
20 Sep 202610.1 M
21 Sep 202652.5 M
22 Sep 2026171.3 M
23 Sep 2026199.9 M
24 Sep 2026154.9 M
25 Sep 202678.4 M
26 Sep 202623.2 M
27 Sep 202665.2 M
28 Sep 2026340.1 M
29 Sep 2026191.1 M
30 Sep 2026140.8 M
1 Oct 2026217.6 M
2 Oct 2026389.3 M
3 Oct 2026515.4 M
4 Oct 2026251.4 M
5 Oct 2026498.2 M
6 Oct 2026593.3 M
7 Oct 2026758.5 M
8 Oct 2026448.0 M
9 Oct 2026364.1 M
10 Oct 2026487.1 M
11 Oct 2026350.4 M
12 Oct 2026388.5 M
13 Oct 2026589.9 M
14 Oct 202630.5 M
15 Oct 2026279.1 M
16 Oct 2026415.4 M
17 Oct 2026203.9 M
18 Oct 2026309.0 M
19 Oct 2026505.0 M
20 Oct 2026146.2 M
21 Oct 2026249.2 M
22 Oct 2026597.6 M
23 Oct 2026773.0 M
24 Oct 202679.5 M
25 Oct 2026326.3 M
26 Oct 2026314.5 M
27 Oct 2026389.0 M
28 Oct 2026153.1 M
29 Oct 202636.8 M
30 Oct 202641.5 M
31 Oct 2026134.1 M
1 Nov 202624.9 M
Where the tokens went, by model Model token distribution: Gemini Flash 68.4 percent, Claude Opus 18.2 percent, Claude Sonnet 13.1 percent. Gemini Flash: 68.4 percent Claude Opus: 18.2 percent Claude Sonnet: 13.1 percent Gemini Flash 68.4 percent Claude Opus 18.2 percent Claude Sonnet 13.1 percent
Where the tokens went, by model.
Model FamilyShare
Gemini Flash72.5%
Claude Opus19.5%
Claude Sonnet7.7%

Most volume goes to a fast, cheap model for routine steps; the expensive models are reserved for planning and review.

Messages and leverage

Messages from me
44,023
Agent replies
230,386
Tool results
232,595
Total messages
507,004

About 5 agent replies for every message I send. That ratio is the point of the design: I write instructions, not code.

How replies are counted

Assistant messages across every agent conversation database, including scheduled jobs and subagents, counted once each after removing copies created when long conversations are compacted (same role, timestamp and opening text). Tool results and my own messages are counted separately.

Access from any device

I can run the whole platform from my phone, so work continues when my laptop is closed or not with me. Three pieces make that work.

  • Private mesh: Tailscale, a WireGuard based private network, joins three devices: the server (an Azure VPS, Linux), my MacBook Pro (macOS) and my phone (Android). I reach the server over the mesh, from those three devices.
  • Termius: I sometimes SSH in via Termius from my phone or laptop over Tailscale. It connects over the mesh, so I can check a service or restart one from the phone.
  • Dictation: I dictate on my phone or Mac (Dictate on Android, FreeFlow on Mac), read the transcript, then send it on Discord or Telegram. The router agent picks it up from there.
Access path to the Azure server Phone and laptop connect over the Tailscale mesh to the Azure VPS, which hosts isolated agent workspaces. Phone (Termius, Dictate) Laptop (SSH, FreeFlow) Tailscale mesh WireGuard network Azure VPS isolated workspaces
Access path to the Azure server: devices reach the server over the private mesh.
DeviceToolsDestination
PhoneTermius, DictateAzure VPS via Tailscale mesh
LaptopSSH, FreeFlowAzure VPS via Tailscale mesh

Host, isolation and secrets

Every agent runs on one rented cloud server and stays inside its own workspace. The host is an Azure VPS running Ubuntu 24.04, and the runtime moved there from a MacBook Linux VM on 20 Sep 2026, so the agents run around the clock.

  • systemd services: Each long running piece, such as the model gateway and the chat gateway, runs as a system service that restarts on its own after a reboot.
  • Workspace isolation: Each agent has its own working directory, persistent memory, scoped tools and skills. Each domain keeps its own data in its own workspace.

Secrets and backups

Secrets live in locked down files and a credential vault that fills only at its own origin; nothing secret is ever pasted into chat. Guard scripts check the context files each agent reads. State is backed up hourly, encrypted capsules go offsite daily to GitHub Releases, the offsite copy is verified weekly, and a scripted restore to a fresh server exists.

What the review step has taught me

This page is built through the same pipeline: a planning card at maximum effort, a builder agent in the consulting profile, and a review gate before release. The review step is how stale figures on this very page were found: counts had been typed into prose and the system had moved on. The rebuild binds every number to the data file the agents maintain, so the gate now checks a script, not a memory.

Hermes Agent · Python · systemd · 9Router · Discord · Telegram · SQLite