diff --git a/frontend/src/components/AgentPanel.test.tsx b/frontend/src/components/AgentPanel.test.tsx
index 324362b..e1d517c 100644
--- a/frontend/src/components/AgentPanel.test.tsx
+++ b/frontend/src/components/AgentPanel.test.tsx
@@ -70,6 +70,47 @@ describe("AgentPanel active work list removed", () => {
});
});
+describe("Running count visibility in header", () => {
+ beforeAll(() => {
+ Element.prototype.scrollIntoView = vi.fn();
+ });
+
+ beforeEach(() => {
+ mockedAgents.getAgentConfig.mockResolvedValue(ROSTER);
+ mockedAgents.listAgents.mockResolvedValue([]);
+ });
+
+ // AC1: When no agents are running, "0 running" is NOT visible
+ it("does not show running count when no agents are running", async () => {
+ render();
+
+ // Wait for roster to load
+ await screen.findByTestId("roster-badge-coder-1");
+
+ expect(screen.queryByText(/0 running/)).not.toBeInTheDocument();
+ });
+
+ // AC2: When agents are running, "N running" IS visible
+ it("shows running count when agents are running", async () => {
+ const agentList: AgentInfo[] = [
+ {
+ story_id: "99_active",
+ agent_name: "coder-1",
+ status: "running",
+ session_id: null,
+ worktree_path: "/tmp/wt",
+ base_branch: "master",
+ log_session_id: null,
+ },
+ ];
+ mockedAgents.listAgents.mockResolvedValue(agentList);
+
+ render();
+
+ await screen.findByText(/1 running/);
+ });
+});
+
describe("RosterBadge availability state", () => {
beforeAll(() => {
Element.prototype.scrollIntoView = vi.fn();
diff --git a/frontend/src/components/AgentPanel.tsx b/frontend/src/components/AgentPanel.tsx
index 6b9dc50..e1eaff9 100644
--- a/frontend/src/components/AgentPanel.tsx
+++ b/frontend/src/components/AgentPanel.tsx
@@ -268,16 +268,22 @@ export function AgentPanel({ configVersion = 0 }: AgentPanelProps) {
}}
>
Agents
-
- {Object.values(agents).filter((a) => a.status === "running").length}{" "}
- running
-
+ {Object.values(agents).filter((a) => a.status === "running").length >
+ 0 && (
+
+ {
+ Object.values(agents).filter((a) => a.status === "running")
+ .length
+ }{" "}
+ running
+
+ )}
{lastRefresh && (