From 202cf1b69a71d911cc0bb072a05ce5fc1c457994 Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 19:45:58 +0000 Subject: [PATCH 01/11] docs(ai-coder): consolidate Agent Time usage reporting Moves Coder Agents usage reporting into the Licensing & Usage page and updates the documentation to describe Agent Time and the hb_agent_runtime_v1 Tallyman payload. Removes the superseded Usage Data Reporting page and its manifest entry, and removes the obsolete AI Governance link to that page. --- docs/ai-coder/agents/licensing-usage.md | 102 +++++++++++++++++++----- docs/ai-coder/ai-governance.md | 11 +-- docs/ai-coder/usage-data-reporting.md | 84 ------------------- docs/manifest.json | 8 +- 4 files changed, 87 insertions(+), 118 deletions(-) delete mode 100644 docs/ai-coder/usage-data-reporting.md diff --git a/docs/ai-coder/agents/licensing-usage.md b/docs/ai-coder/agents/licensing-usage.md index 047d4aaf137..37b64ccc1e3 100644 --- a/docs/ai-coder/agents/licensing-usage.md +++ b/docs/ai-coder/agents/licensing-usage.md @@ -2,50 +2,112 @@ title: Licensing & Usage --- -Coder Agents is licensed differently depending on whether your deployment holds a Community license or an AI Premium license with a purchased Agent Time allocation. +Coder Agents licensing controls concurrent agent activity and Agent Time usage across your deployment. ## Community licenses Community licenses support up to five concurrently active agents deployment-wide. Coder doesn't limit how long those agents can run or how many tasks they complete over time. -Agents will queue when more than five agents are active at a time. +Agents queue when more than five agents are active at a time. With this agent pool, individuals and small teams can experiment with Coder Agents at no cost. ## AI Premium licenses and Agent Time AI Premium licenses include a customizable amount of Agent Time. Agent Time is shared across the deployment, allowing unlimited agents to run concurrently while consuming from a shared pool of purchased working hours. -This usage-based model is designed for enterprise workloads, where large development teams, background automation, and API-triggered tasks can create highly variable bursts of agent activity without being constrained by a concurrency limit. +This usage-based model supports enterprise workloads where large development teams, background automation, and API-triggered tasks can create variable bursts of agent activity. -## How Agent Time is measured +## Agent Time measurement -Agent Time is the cumulative duration during which an AI agent is actively processing a task for the user. -It is measured per interaction step and summed across the duration of a conversation. +Agent Time is the cumulative runtime of model invocations that produce Coder Agents chat messages. +Coder measures each invocation from immediately before the request to the model provider opens until the response stream is fully consumed. -**Includes:** +Agent Time includes: -- Large language model inference time -- Tool execution (such as file operations, terminal commands, and workspace provisioning) -- Automated error recovery attempts +- Assistant generation steps in top-level and subagent chats. +- Context compaction model calls. +- Model-provider tool execution within a model response. +- Stream retries within an invocation that produces a persisted response. +- The portion of an interrupted generation that produced a partial assistant message. -**Excludes:** +Agent Time excludes: -- Time the customer spends composing or reviewing messages -- Time between conversation turns when the agent is not processing -- Tool execution delegated to external systems outside the agent's direct control +- Time spent composing or reviewing messages. +- Time between conversation turns while an agent waits for user input. +- Local tool execution between model invocations, including file operations, terminal commands, and workspace provisioning. +- Time a parent agent spends waiting for a subagent, because the subagent records its own model invocations. +- Failed model calls whose output isn't persisted. +- Model calls that don't produce chat messages, such as title generation. -Agent Time does not accrue when a conversation is inactive or awaiting user input. -Agent Time is measured with millisecond precision and is rounded down to the nearest minute for billing purposes. +Coder records Agent Time in milliseconds and sums it across all Coder Agents chats in the deployment. ## Concurrency and usage limits -Coder handles concurrency and usage limits differently, depending on the license you use for Coder. +Coder handles concurrency and usage limits differently depending on the license you use. ### Community concurrency limit -When a Community license deployment reaches its limit of five concurrently active agents, any additional agents are placed in a queue. -As soon as an active agent completes its task, the next queued agent begins its work, so no work is lost and no action is required from the user. +When a Community license deployment reaches its limit of five concurrently active agents, Coder places additional agents in a queue. +When an active agent completes its task, the next queued agent begins its work. ### AI Premium Agent Time exhaustion -Coder sends deployment administrators an in-app soft warning message as the deployment approaches its maximum allotted Agent Time, so they can purchase additional Agent Time before the concurrency fallback takes effect. +Coder sends deployment administrators an in-app soft warning as the deployment approaches its maximum allotted Agent Time, so they can purchase additional Agent Time before the concurrency fallback takes effect. + +## Agent Time usage reporting + +Coder reports Agent Time usage to Tallyman, a Coder-managed server used for billing and reporting. +Coder sends the total Coder Agents runtime consumed per UTC hour, in milliseconds, with your deployment ID. +Coder doesn't send user-identifiable information or additional chat data to Tallyman. +Coder also shares the reported usage with [Metronome](https://metronome.com), a Stripe product and Coder partner for usage-based billing and reporting. + +Your Coder deployment must be able to make outbound HTTPS requests to `https://tallyman-prod.coder.com` to report usage. +Coder attempts to publish usage data approximately every 17 minutes. +You can monitor these requests in `coderd` logs. + +A successful request produces a debug log similar to the following example when you enable debug logging with [`CODER_LOG_FILTER=.*`](../../reference/cli/server.md#-l---log-filter): + +```sh +[debu] published usage events to tallyman accepted=1 rejected=0 +``` + +Coder sends the license JWT and deployment ID as request headers. +The request body contains one `hb_agent_runtime_v1` event for each UTC hour. +The `runtime_ms` value is the total Agent Time recorded during that hour. +Idle hours have a value of `0`. + +The following example reports 1 hour of Agent Time: + +```txt +POST /api/v1/events/ingest HTTP/1.1 +Host: tallyman-prod.coder.com +Content-Type: application/json +Coder-License-Key: +Coder-Deployment-ID: 8a4e92f1-3b7c-4d5e-9f12-abc123def456 + +{ + "events": [ + { + "id": "hb_agent_runtime_v1:2026-08-18_14:00:00", + "event_type": "hb_agent_runtime_v1", + "event_data": { + "runtime_ms": 3600000 + }, + "created_at": "2026-08-18T14:00:00Z" + } + ] +} +``` + +The event ID contains the start of the UTC hour. +The `created_at` value also identifies the start of that hour, rather than the time when Coder sends the request. +Coder sends raw milliseconds without rounding or converting the value to hours. + +A failed request produces a warning similar to the following example: + +```sh +[warn] failed to send publish request to tallyman count=1 error="Post \"https://tallyman-prod.coder.com/api/v1/events/ingest\": dial tcp: lookup tallyman-prod.coder.com: no such host" +``` + +> [!NOTE] +> Air-gapped deployments and deployments with legal restrictions around usage reporting can [contact us](https://coder.com/contact) to discuss alternative methods. diff --git a/docs/ai-coder/ai-governance.md b/docs/ai-coder/ai-governance.md index 9ffd01d95e2..28cd38a23d8 100644 --- a/docs/ai-coder/ai-governance.md +++ b/docs/ai-coder/ai-governance.md @@ -125,13 +125,10 @@ deployments include 1,000 Agent Workspace Builds, primarily for proof-of-concept use and basic workflows. Community deployments do not have access to [AI Gateway](./ai-gateway/index.md) or [Agent Firewall](./agent-firewall/index.md). -Premium deployments include a shared usage pool of Agent Workspace Builds for -automated workflows, along with limits that scale proportionately with user -count. Usage counts are measured and sent to Coder via -[usage data reporting](./usage-data-reporting.md). Coder Tasks and other AI -features continue to function normally even if the limit is breached. Admins -will receive a warning to [contact their account team](https://coder.com/contact) -to remediate. +Premium deployments include a shared usage pool of Agent Workspace Builds for automated workflows, along with limits that scale proportionately with user count. +Usage counts are measured and sent to Coder for billing and reporting. +Coder Tasks and other AI features continue to function normally even if the limit is breached. +Admins receive a warning to [contact their account team](https://coder.com/contact) to remediate. ### Tracking Agent Workspace Builds diff --git a/docs/ai-coder/usage-data-reporting.md b/docs/ai-coder/usage-data-reporting.md deleted file mode 100644 index 3c69e27ae0b..00000000000 --- a/docs/ai-coder/usage-data-reporting.md +++ /dev/null @@ -1,84 +0,0 @@ -# Usage Data Reporting - -[AI Governance](./ai-governance.md) requires reporting usage data to Tallyman, a Coder-managed server for billing and reporting purposes. Coder only captures and sends the following information, related to your deployment ID: - -- number of agent workspace builds consumed -- number of AI Governance seats consumed -- total Coder Agent runtime consumed per hour, in milliseconds - -No user-identifiable information or additional metrics are sent to Tallyman. This information is also shared with [Metronome](https://metronome.com), a Stripe product and Coder partner for usage-based billing and reporting. - -To send usage data, your Coder deployment must be able to make outbound HTTPS requests to `https://tallyman-prod.coder.com`. Usage data is sent approximately every 17 minutes and can be monitored via `coderd` logs. - -Example of a successful request (requires debug logging enabled [`CODER_LOG_FILTER=.*`](../reference/cli/server.md#-l---log-filter)): - -```sh -[debu] published usage events to tallyman accepted=5 rejected=0 -``` - -Example of a request payload: - -```txt -POST /api/v1/events/ingest HTTP/1.1 -Host: tallyman-prod.coder.com -Content-Type: application/json -Coder-License-Key: # your license JWT for verification -Coder-Deployment-ID: 8a4e92f1-3b7c-4d5e-9f12-abc123def456 # your deployment ID - -{ - "events": [ - { - "id": "550e8400-e29b-41d4-a716-446655440000", # unique event ID generated by Coder - "event_type": "dc_managed_agents_v1", # aka. agent workspace builds - "event_data": { - "count": 1 - }, - "created_at": "2025-01-15T14:30:00Z" - }, - { - "id": "hb_agent_runtime_v1:2025-01-15_14:00:00", # unique event ID generated by Coder - "event_type": "hb_agent_runtime_v1", # aka. Coder Agent runtime - "event_data": { - "runtime_ms": 3600000 - }, - "created_at": "2025-01-15T14:00:00Z" # start of the hour the runtime was consumed in - } - ] -} -``` - -Example of a failed request (e.g. Tallyman Server is blocked by your network): - -```sh -[warn] failed to send publish request to tallyman count=5 error="Post \"https://tallyman-prod.coder.com/api/v1/events/ingest\": dial tcp: lookup tallyman-prod.coder.com: no such host" -``` - -> [!NOTE] -> Air-gapped deployments and/or those with legal restrictions around usage reporting can [contact us](https://coder.com/contact) to discuss alternative methods. - -## Agent runtime measurement - -Total Coder Agent runtime is summed from per-message generation time -(`runtime_ms` on chat messages). - -A message's runtime is the wall-clock duration of the model invocation that -produced its content, measured from just before the request to the model -provider opens until the response is fully consumed. - -What counts: - -- Assistant generation steps, in both top-level chats and sub-agent chats. -- Context compaction (summarization) model calls. -- Interrupted generation: the time streamed before the interrupt is kept on - the partial assistant message. - -What does not count: - -- Local tool execution, including waiting on sub-agents. A sub-agent is its - own chat and records its own model invocations, so counting the parent's - wait would double count. -- Idle time: chats waiting for user input or external tool results. -- Failed model calls whose output was discarded. Retried and errored - attempts persist no content, so they record no runtime. -- Ancillary model calls that produce no chat messages, such as title - generation. diff --git a/docs/manifest.json b/docs/manifest.json index 9e5c1977ce7..91e85c173d3 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -1126,7 +1126,7 @@ }, { "title": "Licensing \u0026 Usage", - "description": "Licensing and usage details for Coder Agents.", + "description": "Compare Coder Agents licenses and learn how Coder measures and reports Agent Time usage.", "path": "./ai-coder/agents/licensing-usage.md" }, { @@ -1342,12 +1342,6 @@ "state": ["premium"] } ] - }, - { - "title": "Usage Data Reporting", - "description": "Learn what AI usage data AI Governance reports to Coder for billing and reporting.", - "path": "./ai-coder/usage-data-reporting.md", - "state": ["premium"] } ] }, From bf58c202d35aa33c9da9bb8676d1b7938b169a86 Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 19:52:41 +0000 Subject: [PATCH 02/11] docs(ai-coder): remove Coder Tasks usage measurement from AI Governance Removes the Coder Tasks and Agent Workspace Build usage-measurement section from the AI Governance page. AI Governance is not a prerequisite for usage-based billing, so this content doesn't belong on the governance page. --- docs/ai-coder/ai-governance.md | 59 ---------------------------------- 1 file changed, 59 deletions(-) diff --git a/docs/ai-coder/ai-governance.md b/docs/ai-coder/ai-governance.md index 28cd38a23d8..8bdcf54fb0f 100644 --- a/docs/ai-coder/ai-governance.md +++ b/docs/ai-coder/ai-governance.md @@ -81,62 +81,3 @@ generally available as part of AI Governance. To learn more about AI Governance, pricing, or trial options, reach out to your [Coder account team](https://coder.com/contact/sales). - -## How Coder Tasks usage is measured - -> [!NOTE] -> There is a known issue with how Agent Workspace Builds are tallied in v2.28 -> and v2.29. We recommend updating to v2.28.9, v2.29.4, or v2.30 to resolve -> this issue. - -The usage metric used to measure Coder Tasks consumption is called **Agent -Workspace Builds** (prev. "managed agents"). - -An Agent Workspace Build is counted each time a workspace is started -specifically for a coding agent to independently work on a Coder Task. Most of -the work in this workspace is performed by the agent, not a human developer. -Each Coder Task starts its own workspace, and the usage meter counts one Agent -Workspace Build. - -Traditional Coder Workspaces started manually by developers or scheduled to -auto-start do not count as an Agent Workspace Build. These are considered -daily-driver development environments where developers co-exist with their IDEs -and coding assistants. - -### Scenarios - -| Scenario | Consumes Agent Workspace Build | -|---------------------------------------------------------------------------------------------------|--------------------------------| -| Developer creates a Coder Task to write end-to-end tests | Yes | -| Automated pipeline creates a task via Coder Tasks CLI (with Claude Code) to review a pull request | Yes | -| Developer resumes an old Coder Task order to continue prototyping | Yes | -| Developer starts a workspace for use with VS Code and Jupyter | No | -| Developer creates a workspace for use with Cursor and Claude Code CLI | No | -| Developer creates a workspace for use with Coder AI Gateway and Agent Firewall | No | - -In the future, additional capabilities for managing agents (beyond Coder Tasks) -may also consume agent workspace builds. - -### Agent Workspace Build Limits - -Without proper controls and sandboxing, it is not recommended to open up Coder -Tasks to a large audience in the enterprise. Both Community and Premium -deployments include 1,000 Agent Workspace Builds, primarily for proof-of-concept -use and basic workflows. Community deployments do not have access to -[AI Gateway](./ai-gateway/index.md) or [Agent Firewall](./agent-firewall/index.md). - -Premium deployments include a shared usage pool of Agent Workspace Builds for automated workflows, along with limits that scale proportionately with user count. -Usage counts are measured and sent to Coder for billing and reporting. -Coder Tasks and other AI features continue to function normally even if the limit is breached. -Admins receive a warning to [contact their account team](https://coder.com/contact) to remediate. - -### Tracking Agent Workspace Builds - -Admins can monitor Agent Workspace Build usage from the Coder dashboard. -Navigate to **Deployment** > **Licenses** to view current usage against your -entitlement limits. - -![Agent Workspace Build usage](../images/admin/ai-governance-awb-usage.png) - -Agent Workspace Build usage showing current consumption against -entitlement limits in the Licenses page. From d1a62f9386d14f0246b9646591ed71f140565b20 Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 20:07:19 +0000 Subject: [PATCH 03/11] docs(ai-coder): address review feedback on Agent Time measurement Rephrases the Agent Time definition to avoid the word runtime, and removes the stream-retries, local-tool-execution, and failed-model-call bullets per review feedback. --- docs/ai-coder/agents/licensing-usage.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/ai-coder/agents/licensing-usage.md b/docs/ai-coder/agents/licensing-usage.md index 37b64ccc1e3..d86a9828c96 100644 --- a/docs/ai-coder/agents/licensing-usage.md +++ b/docs/ai-coder/agents/licensing-usage.md @@ -19,7 +19,7 @@ This usage-based model supports enterprise workloads where large development tea ## Agent Time measurement -Agent Time is the cumulative runtime of model invocations that produce Coder Agents chat messages. +Agent Time is the cumulative duration of model invocations that produce Coder Agents chat messages. Coder measures each invocation from immediately before the request to the model provider opens until the response stream is fully consumed. Agent Time includes: @@ -27,16 +27,13 @@ Agent Time includes: - Assistant generation steps in top-level and subagent chats. - Context compaction model calls. - Model-provider tool execution within a model response. -- Stream retries within an invocation that produces a persisted response. - The portion of an interrupted generation that produced a partial assistant message. Agent Time excludes: - Time spent composing or reviewing messages. - Time between conversation turns while an agent waits for user input. -- Local tool execution between model invocations, including file operations, terminal commands, and workspace provisioning. - Time a parent agent spends waiting for a subagent, because the subagent records its own model invocations. -- Failed model calls whose output isn't persisted. - Model calls that don't produce chat messages, such as title generation. Coder records Agent Time in milliseconds and sums it across all Coder Agents chats in the deployment. From a2c5304530d237cf9be0be2793c3b40982eb76cb Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 20:35:17 +0000 Subject: [PATCH 04/11] docs: fix dangling Agent Workspace Build references after AI Governance cleanup Update glossary, tasks, and index pages to stop pointing readers to ai-governance.md for Agent Workspace Build details that were removed. Delete the orphaned ai-governance-awb-usage.png screenshot. --- docs/ai-coder/index.md | 3 --- docs/ai-coder/tasks.md | 2 +- docs/images/admin/ai-governance-awb-usage.png | Bin 71391 -> 0 bytes docs/reference/glossary.md | 4 ++-- 4 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 docs/images/admin/ai-governance-awb-usage.png diff --git a/docs/ai-coder/index.md b/docs/ai-coder/index.md index 0381687a3ce..541cf536844 100644 --- a/docs/ai-coder/index.md +++ b/docs/ai-coder/index.md @@ -48,8 +48,5 @@ Coder deployment. It includes: - [Agent Firewall](./agent-firewall/index.md) for process-level network and command policies that restrict what agents can reach and do inside a workspace. -- Expanded Agent Workspace Build allowances for teams running AI-driven - background work at scale. - [Learn more about AI Governance](./ai-governance.md) for use cases, entitlements, and how to enable it in your deployment. diff --git a/docs/ai-coder/tasks.md b/docs/ai-coder/tasks.md index ccec810e64d..a612fb425f9 100644 --- a/docs/ai-coder/tasks.md +++ b/docs/ai-coder/tasks.md @@ -22,7 +22,7 @@ The Task details view shows the user's complete chat, workspace status and, buil ![VS Code IDE Extension Details View](../images/guides/ai-agents/vs_code_tasks_extension_details.png) > [!NOTE] -> Both Community and Premium deployments include 1,000 Agent Workspace Builds for proof-of-concept use. Community deployments do not have access to [AI Gateway](./ai-gateway/index.md) or [Agent Firewall](./agent-firewall/index.md). To scale beyond the 1,000 build limit or use AI Governance features, [AI Governance](./ai-governance.md), included with a Premium license, provides expanded usage pools that grow with your user count. [Contact us](https://coder.com/contact) to discuss pricing. +> Both Community and Premium deployments include 1,000 Agent Workspace Builds for proof-of-concept use. Community deployments do not have access to [AI Gateway](./ai-gateway/index.md) or [Agent Firewall](./agent-firewall/index.md). A Premium license expands the Agent Workspace Build allowance to scale with your user count and unlocks [AI Governance](./ai-governance.md) features. [Contact us](https://coder.com/contact) to discuss pricing. ## Supported Agents (and Models) diff --git a/docs/images/admin/ai-governance-awb-usage.png b/docs/images/admin/ai-governance-awb-usage.png deleted file mode 100644 index 48e185830867453558b56e88af9e2d3d5b53c11f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71391 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 Date: Tue, 18 Aug 2026 20:38:36 +0000 Subject: [PATCH 05/11] docs: remove AWB and Coder Tasks references from glossary, revert tasks.md Remove the Agent Workspace Build and Coder Tasks glossary entries and the Coder Tasks mention from the Coding agent entry. Revert the tasks.md note to its original text since the Coder Tasks page removal is handled by a separate PR. --- docs/ai-coder/tasks.md | 2 +- docs/reference/glossary.md | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/docs/ai-coder/tasks.md b/docs/ai-coder/tasks.md index a612fb425f9..ccec810e64d 100644 --- a/docs/ai-coder/tasks.md +++ b/docs/ai-coder/tasks.md @@ -22,7 +22,7 @@ The Task details view shows the user's complete chat, workspace status and, buil ![VS Code IDE Extension Details View](../images/guides/ai-agents/vs_code_tasks_extension_details.png) > [!NOTE] -> Both Community and Premium deployments include 1,000 Agent Workspace Builds for proof-of-concept use. Community deployments do not have access to [AI Gateway](./ai-gateway/index.md) or [Agent Firewall](./agent-firewall/index.md). A Premium license expands the Agent Workspace Build allowance to scale with your user count and unlocks [AI Governance](./ai-governance.md) features. [Contact us](https://coder.com/contact) to discuss pricing. +> Both Community and Premium deployments include 1,000 Agent Workspace Builds for proof-of-concept use. Community deployments do not have access to [AI Gateway](./ai-gateway/index.md) or [Agent Firewall](./agent-firewall/index.md). To scale beyond the 1,000 build limit or use AI Governance features, [AI Governance](./ai-governance.md), included with a Premium license, provides expanded usage pools that grow with your user count. [Contact us](https://coder.com/contact) to discuss pricing. ## Supported Agents (and Models) diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index d1c30af86bb..b320fa320f0 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -24,12 +24,6 @@ It was previously named Agent Boundaries and uses a sandbox backend, `nsjail` by This feature requires a Premium license. Refer to [Agent Firewall](../ai-coder/agent-firewall/index.md). -### Agent Workspace Build - -A metered workspace build performed on behalf of an AI agent. -Community and Premium deployments include 1,000 for proof-of-concept use, and a Premium license expands the allowance. -Refer to [Coder Tasks](../ai-coder/tasks.md). - ### AI Gateway An LLM gateway in `coderd` that authenticates users, forwards traffic to providers such as OpenAI and Anthropic, audits prompts and tool invocations, and centralizes MCP administration. @@ -126,12 +120,6 @@ Refer to [Coder Desktop](../user-guides/desktop/index.md). The editor extension that connects VS Code, and forks such as Cursor and Devin Desktop (formerly Windsurf), to Coder workspaces. Refer to [VS Code](../user-guides/workspace-access/vscode.md). -### Coder Tasks - -An earlier interface for running coding agents such as Claude Code and Aider inside workspaces. -Coder Tasks is deprecated: it moves to a 12-month Extended Support Release for Premium customers and is removed from new releases starting with v2.37, with [Coder Agents](#coder-agents) as the long-term replacement. -Refer to [Coder Tasks](../ai-coder/tasks.md). - ### `coder_agent` The Terraform resource that declares a [workspace agent](#workspace-agent) inside a template. @@ -165,7 +153,7 @@ Refer to the [`codersdk` package](https://pkg.go.dev/github.com/coder/coder/v2/c ### Coding agent -An AI agent that reads and writes code on a developer's behalf, such as Claude Code, run through Coder Tasks or Coder Agents. +An AI agent that reads and writes code on a developer's behalf, such as Claude Code, run through Coder Agents. Refer to [AI in Coder](../ai-coder/index.md). ### Community From 924a4b3e9bdeb6201b249dd04f476d96b313aa8c Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 20:43:02 +0000 Subject: [PATCH 06/11] docs: remove Claude Code conflation from Coding agent glossary entry Coder Agents is a native harness, not a runner for third-party agents like Claude Code. The Coding agent entry now defines the term without tying it to the Coder Agents product. --- docs/reference/glossary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index b320fa320f0..8b39b790424 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -153,7 +153,7 @@ Refer to the [`codersdk` package](https://pkg.go.dev/github.com/coder/coder/v2/c ### Coding agent -An AI agent that reads and writes code on a developer's behalf, such as Claude Code, run through Coder Agents. +An AI agent that reads and writes code on a developer's behalf, such as Claude Code. Refer to [AI in Coder](../ai-coder/index.md). ### Community From ad5a1ec760906751f5dfb8004f43d20a2583f92c Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 21:05:44 +0000 Subject: [PATCH 07/11] docs(ai-coder): convert gerund headings to imperative in AI Governance Auditing, Restricting, Centralizing, Standardizing, and Measuring headings now use imperative mood per the style guide. --- docs/ai-coder/ai-governance.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/ai-coder/ai-governance.md b/docs/ai-coder/ai-governance.md index 8bdcf54fb0f..586deb3c6f4 100644 --- a/docs/ai-coder/ai-governance.md +++ b/docs/ai-coder/ai-governance.md @@ -42,33 +42,33 @@ or without Coder's AI Governance features. Organizations adopting AI coding tools at scale often encounter operational and security challenges that traditional developer tooling doesn't address. -### Auditing AI activity across teams +### Audit AI activity across teams Without centralized monitoring, teams have no way to understand how AI tools are being used across the organization. AI Gateway provides audit trails of prompts, token usage, and tool invocations, giving administrators insight into AI adoption patterns and potential issues. -### Restricting agent network access +### Restrict agent network access AI agents can make arbitrary network requests, potentially accessing unauthorized services or exfiltrating data. Agent Firewall enforces process-level policies that restrict which domains agents can reach and what actions they can perform, preventing unintended data exposure and destructive operations like `rm -rf`. -### Centralizing API key management +### Centralize API key management Managing individual API keys for AI providers across hundreds of developers creates security risks and administrative overhead. AI Gateway centralizes authentication so users authenticate through Coder, eliminating the need to distribute and rotate provider API keys. -### Standardizing MCP tools and servers +### Standardize MCP tools and servers Different teams may use different MCP servers and tools with varying security postures. AI Gateway enables centralized MCP administration, allowing organizations to define approved tools and servers that all users can access. -### Measuring AI adoption and spend +### Measure AI adoption and spend Without usage data, it's hard to justify AI tooling investments or identify high-leverage use cases. AI Gateway captures metrics on token spend, adoption From 583dccdf894d26dcc1847691996b3741612235b9 Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Tue, 18 Aug 2026 17:12:55 -0400 Subject: [PATCH 08/11] Update definition of coding agent in glossary --- docs/reference/glossary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index 8b39b790424..3305e70602b 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -153,7 +153,7 @@ Refer to the [`codersdk` package](https://pkg.go.dev/github.com/coder/coder/v2/c ### Coding agent -An AI agent that reads and writes code on a developer's behalf, such as Claude Code. +An AI agent that reads and writes code on a developer's behalf, such as Claude Code or Coder Agents. Refer to [AI in Coder](../ai-coder/index.md). ### Community From ec1fcc8489dd974a1bf1f4074e55050bc0d26d28 Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Wed, 19 Aug 2026 13:22:53 +0000 Subject: [PATCH 09/11] docs(ai-coder): refine Agent Time includes per review feedback Clarify context compaction as summarization and describe interrupted generation as time streamed or spent executing tools before the interrupt, kept on the partial assistant messages. --- docs/ai-coder/agents/licensing-usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ai-coder/agents/licensing-usage.md b/docs/ai-coder/agents/licensing-usage.md index d86a9828c96..0345cdf5414 100644 --- a/docs/ai-coder/agents/licensing-usage.md +++ b/docs/ai-coder/agents/licensing-usage.md @@ -25,9 +25,9 @@ Coder measures each invocation from immediately before the request to the model Agent Time includes: - Assistant generation steps in top-level and subagent chats. -- Context compaction model calls. +- Context compaction (summarization) model calls. - Model-provider tool execution within a model response. -- The portion of an interrupted generation that produced a partial assistant message. +- The time streamed or spent executing tools before an interrupt, kept on the partial assistant messages. Agent Time excludes: From 52cd32a72d596563333964df42ce78ca8e9c66c0 Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Wed, 19 Aug 2026 13:24:52 +0000 Subject: [PATCH 10/11] docs(ai-coder): add failed calls and external handoff to Agent Time excludes Add abbreviated bullets for failed/retried model calls and client-executed tools handed off to external coding agents, per review feedback. --- docs/ai-coder/agents/licensing-usage.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ai-coder/agents/licensing-usage.md b/docs/ai-coder/agents/licensing-usage.md index 0345cdf5414..b35890c7b8e 100644 --- a/docs/ai-coder/agents/licensing-usage.md +++ b/docs/ai-coder/agents/licensing-usage.md @@ -35,6 +35,8 @@ Agent Time excludes: - Time between conversation turns while an agent waits for user input. - Time a parent agent spends waiting for a subagent, because the subagent records its own model invocations. - Model calls that don't produce chat messages, such as title generation. +- Failed or retried model calls, which persist no content and record no runtime. +- Client-executed tools and chats handed off to external coding agents, since that work happens outside the server. Coder records Agent Time in milliseconds and sums it across all Coder Agents chats in the deployment. From 2906a3607132ee3fa1ea011bb0951a4ae09817ee Mon Sep 17 00:00:00 2001 From: Matt Vollmer Date: Wed, 19 Aug 2026 13:32:36 +0000 Subject: [PATCH 11/11] docs(ai-coder): clarify Tallyman publish cadence and backfill behavior Distinguish the hourly event generation cadence from the 17-minute publish check interval, and document the 7-day backfill window with its 100-event batch size. --- docs/ai-coder/agents/licensing-usage.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/ai-coder/agents/licensing-usage.md b/docs/ai-coder/agents/licensing-usage.md index b35890c7b8e..035ba8e9d60 100644 --- a/docs/ai-coder/agents/licensing-usage.md +++ b/docs/ai-coder/agents/licensing-usage.md @@ -61,7 +61,8 @@ Coder doesn't send user-identifiable information or additional chat data to Tall Coder also shares the reported usage with [Metronome](https://metronome.com), a Stripe product and Coder partner for usage-based billing and reporting. Your Coder deployment must be able to make outbound HTTPS requests to `https://tallyman-prod.coder.com` to report usage. -Coder attempts to publish usage data approximately every 17 minutes. +Coder generates one `hb_agent_runtime_v1` event for each UTC hour shortly after the hour ends, then checks for unpublished events approximately every 17 minutes. +In steady state, each hour's usage typically reaches Tallyman within about 25 minutes of the hour closing. You can monitor these requests in `coderd` logs. A successful request produces a debug log similar to the following example when you enable debug logging with [`CODER_LOG_FILTER=.*`](../../reference/cli/server.md#-l---log-filter): @@ -74,6 +75,8 @@ Coder sends the license JWT and deployment ID as request headers. The request body contains one `hb_agent_runtime_v1` event for each UTC hour. The `runtime_ms` value is the total Agent Time recorded during that hour. Idle hours have a value of `0`. +If the deployment was offline, Coder backfills missed hours for up to seven days, batching up to 100 events per request. +Hours missing beyond seven days aren't reported. The following example reports 1 hour of Agent Time: