Find unhealthy agents and capability gaps in five minutes
Write down your fleet as a snapshot file and ask Control Tower which agents are unhealthy, which are missing a DeepAgentLabs capability and where versions have drifted. No server, token or network is needed.
| For | Platform and on-call engineers who want a quick inventory check |
| Difficulty | Beginner |
| Time | ~5 minutes |
| Capabilities | Fleet health and filters, Capability discovery, Offline snapshots |
| Status | Stable |
The problem
Agents run in different places (Kubernetes, Docker, Lambda) and each team knows only its own. Before an incident review or an upgrade, someone has to answer three questions by hand: which agents are not healthy, which ones lack a guardrail such as Agentic Sidecar, and which are on older versions of a tool. Spreadsheets go stale and nobody trusts them.
Architecture
research-bot is unhealthy; triage-bot is degraded, has no Agentic Sidecar and runs AgenticLens 0.9.0; checkout-agent is healthy.
Static diagram
flowchart LR
F[my-fleet.json<br/>registrations + heartbeats] -->|--snapshot| CLI[agenticops-control-tower CLI]
CLI --> API[ControlTowerAPI<br/>in memory]
API --> O1[status: health + coverage]
API --> O2[agents list filters]
API --> O3[capabilities list: versions]
The CLI loads the file into the same ControlTowerAPI the server uses and
answers read commands directly. Nothing is written anywhere.
Prerequisites
- Python 3.10 or newer.
-
Control Tower 0.2.1 or newer, installed from the repository for this walkthrough. The tested 0.8.0 version is also available on PyPI:
git clone https://github.com/DeepAgentLabs/agenticops-control-tower.git cd agenticops-control-tower python -m venv .venv && source .venv/bin/activate python -m pip install . -
No
apiextra, server, token or sibling package.
Walkthrough
1. Describe your fleet
Save this as my-fleet.json. Each registration is one deployment; each heartbeat
reports its latest status. Replace the values with your own agents.
{
"captured_at": "2026-10-21T09:00:00Z",
"registrations": [
{
"agent_id": "checkout-agent",
"name": "checkout-agent",
"environment": "production",
"runtime": "kubernetes",
"framework": "langgraph",
"capabilities": {
"agenticlens": "0.10.0",
"agentic-sidecar": "0.9.0"
},
"registered_at": "2026-10-20T10:00:00Z"
},
{
"agent_id": "triage-bot",
"name": "triage-bot",
"environment": "staging",
"runtime": "docker",
"framework": "crewai",
"capabilities": {
"agenticlens": "0.9.0"
},
"registered_at": "2026-10-20T10:00:00Z"
},
{
"agent_id": "research-bot",
"name": "research-bot",
"environment": "staging",
"runtime": "aws-lambda",
"framework": "openai-agents",
"capabilities": {
"agenticlens": "0.10.0",
"agentic-sidecar": "0.9.0"
},
"registered_at": "2026-10-20T10:00:00Z"
}
],
"heartbeats": [
{
"agent_id": "checkout-agent",
"heartbeat": {
"status": "healthy",
"last_seen": "2026-10-21T08:59:30Z"
}
},
{
"agent_id": "triage-bot",
"heartbeat": {
"status": "degraded",
"last_seen": "2026-10-21T08:58:10Z"
}
},
{
"agent_id": "research-bot",
"heartbeat": {
"status": "unhealthy",
"last_seen": "2026-10-21T08:41:00Z"
}
}
]
}
2. Check fleet health
agenticops-control-tower --snapshot my-fleet.json status
3. List the agents that are down
agenticops-control-tower --snapshot my-fleet.json agents list --unhealthy
4. Find staging agents without Agentic Sidecar
Filters combine with AND:
agenticops-control-tower --snapshot my-fleet.json agents list --environment staging --missing-capability agentic-sidecar
5. Look for version drift
agenticops-control-tower --snapshot my-fleet.json capabilities list
Expected output
Step 2 (status):
{
"total_agents": 3,
"healthy_agents": 1,
"degraded_agents": 1,
"unhealthy_agents": 1,
"unknown_agents": 0,
"capability_count": 2,
"status_buckets": {
"healthy": [
"checkout-agent"
],
"degraded": [
"triage-bot"
],
"unhealthy": [
"research-bot"
],
"unknown": []
},
"capabilities": [
{
"capability": "agentic-sidecar",
"installed_agents": 2,
"missing_agents": 1,
"versions": [
"0.9.0"
],
"agent_ids": [
"checkout-agent",
"research-bot"
],
"missing_agent_ids": [
"triage-bot"
]
},
{
"capability": "agenticlens",
"installed_agents": 3,
"missing_agents": 0,
"versions": [
"0.10.0",
"0.9.0"
],
"agent_ids": [
"checkout-agent",
"research-bot",
"triage-bot"
],
"missing_agent_ids": []
}
]
}
Step 3 (agents list --unhealthy):
[
{
"agent_id": "research-bot",
"name": "research-bot",
"environment": "staging",
"runtime": "aws-lambda",
"framework": "openai-agents",
"status": "unhealthy",
"capabilities": {
"agenticlens": "0.10.0",
"agentic-sidecar": "0.9.0"
},
"runtime_metadata": {},
"package_metadata": {},
"registered_at": "2026-10-20T10:00:00Z",
"last_seen": "2026-10-21T08:41:00Z",
"heartbeat_count": 1
}
]
Step 4 (staging agents missing Sidecar):
[
{
"agent_id": "triage-bot",
"name": "triage-bot",
"environment": "staging",
"runtime": "docker",
"framework": "crewai",
"status": "degraded",
"capabilities": {
"agenticlens": "0.9.0"
},
"runtime_metadata": {},
"package_metadata": {},
"registered_at": "2026-10-20T10:00:00Z",
"last_seen": "2026-10-21T08:58:10Z",
"heartbeat_count": 1
}
]
Step 5 (capabilities list). AgenticLens runs two versions across the fleet:
{
"agentic-sidecar": [
"0.9.0"
],
"agenticlens": [
"0.10.0",
"0.9.0"
]
}
Verify it worked
- Every command exits with status
0(echo $?). total_agentsin step 2 equals the number of registrations in your file, and the four bucket lists together contain every agent ID exactly once.- Each agent in step 4's output has
"environment": "staging"and noagentic-sidecarkey incapabilities. -
A quick automated check:
agenticops-control-tower --snapshot my-fleet.json status \ | python -c "import json,sys; s=json.load(sys.stdin); assert s['total_agents']==3 and s['unhealthy_agents']==1; print('ok')"ok
Clean up
Nothing was installed system-wide or written by Control Tower. Remove the file and the virtual environment:
rm my-fleet.json
deactivate && rm -rf .venv
Variations and next steps
- Use the sample fleet:
--snapshot examples/sample_fleet_snapshot.jsonfrom the repository includes pushed evidence, soposturealso works. - Filter by status:
agents list --status degraded. - Check a minimum version: offline snapshots have no versions command; in Python,
load_snapshot("my-fleet.json").assess_versions("agenticlens", "0.10.0")reportstriage-botasoutdated. On a server, useGET /versions. - Go live: run
agenticops-control-tower serveand have agents register and send heartbeats; the same commands then work without--snapshot. See Getting started.
Tested with
- agenticops-control-tower 0.8.0 (source, commit
36c5eb6), Python 3.13.16, Linux, base dependencies only, verified 2026-10-21. Commands were run throughpython -m agenticops_control_tower.cli.main, the same entry point as the installedagenticops-control-towerscript.