> ## Documentation Index
> Fetch the complete documentation index at: https://docs.forepost.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Capacity model

> The maths behind capacity headroom, breach week, and the Headcount calculator.

The same calculation drives three surfaces, the [Headcount](/help/headcount) calculator, the capacity strip on [Horizon](/help/horizon), and the *Capacity headroom* derived signal on the [Watchlist](/help/watchlist). This document is the maths.

## The core formula

Given your inputs:

* **V**: weekly ticket volume (current)
* **g**: weekly growth rate (% per week)
* **d**: AI deflection rate (% of tickets resolved without humans)
* **N**: number of agents
* **u**: target utilisation cap (%)

Forepost computes:

```
human_now    = V × (1 − d/100)
max_per_agent = human_now / N / 0.84
team_cap     = max_per_agent × N × (u/100)
week_growth  = V × (g/100) × (1 − d/100)
breach_week  = max(0, ceil((team_cap − human_now) / week_growth))
```

If `week_growth = 0` (no volume growth) breach is treated as stable (returned as 99 internally; rendered as "no breach").

## Why 0.84

The constant `0.84` is the implicit headroom inferred from your current state. It says: *whatever utilisation you're at right now, that corresponds to 84% of an agent's true ceiling*. So `human_now / N / 0.84` is the per-agent throughput at full theoretical capacity.

This is a heuristic. It assumes you're not currently working agents past their cliff. If your team is at 95% utilisation today and CSAT is already crumbling, the model will overestimate ceiling. We chose this constant after testing against five reference workspaces; it works well in the 60-85% utilisation range that healthy teams operate in.

## Hire-by date

```
hire_by_week = max(0, breach_week − 8)
```

Eight weeks is the assumed lead time to source, sign, and ramp a support hire. It's a sensible default for most support roles in 2026; teams scaling fast might want to widen it to 10-12.

## Cost model

```
monthly_cost = round(salary × 1.25 / 12)
annual_cost  = round(salary × 1.25)
```

The `1.25` multiplier covers benefits, payroll tax, tooling, and onboarding overhead. UK payroll-loaded; US figures may need a higher multiplier (typically 1.3-1.4 with healthcare).

## What the chart shows

A 28-week projection drawn from these inputs:

* **Volume line (blue)**: `V × (1+g/100)^w` projected forward, deflection-adjusted to humans-only.
* **Current capacity line (red dashed)**: flat at `team_cap`.
* **+1 hire capacity line (green dashed)**: flat at `max_per_agent × (N+1) × (u/100)`.
* **Hire-by marker**: vertical at `hire_by_week`.
* **Breach marker**: vertical at `breach_week`.

The instant the volume line crosses *Breach*, you're past target utilisation. CSAT typically degrades 2-3 weeks after that point.

## Where it falls short

* **Doesn't model seasonality.** A January spike vs a steady base looks the same.
* **Assumes constant deflection.** If your AI rate is climbing, real breach is later than the model suggests.
* **No agent skill mix.** Two agents handling the same volume can have very different effective throughput.
* **Doesn't account for backlog burn-down.** Capacity is allocated to inbound only.

The model is intentionally simple. The point is to make capacity *visible*, not to predict it to the day.

## Where the model lives in code

Worker side: `calcBreach(ws)` in `worker.js`. SPA side: `calcHC()` in `src/App.jsx`. Both use identical maths.
