Team & Capacity Tab — Feature Guide

What it's for
The Team & Capacity tab is where the team's roster, base capacity, time off, holidays, and per-project allocations are kept. Every other capacity-aware feature in the app — the forecast, the cascade chart, the feasibility score, sprint pre-mortem, weekly demand vs capacity, Auto-Level — reads its inputs from here.
The tab does four things: lets the user manage the team roster (add, edit, remove members); set base capacity in story points per sprint or hours per week, optionally with per-week overrides; track time off (PTO) and company holidays; and allocate each member's effort across multiple projects when programmes are configured.
The data is local-only — there is no Jira write-back for capacity. Removing a member, however, does unassign that person's open issues in Jira so the work doesn't silently stay on a person who is no longer on the team.
Header / Toolbar
Period selector
Five buttons across the top of the team table — Weekly, Biweekly, Monthly, Quarterly, Yearly. The choice changes how the table aggregates per-week capacity and how the table reads as bulk-edit input. Underneath, capacity is always stored per ISO week; the period view is a convenience for setting many weeks at once and for reading totals at the right granularity.
Period navigation arrows
Left/right arrows step the visible window forward or backward by one period. The current period label sits between the arrows.
"Populate weeks from legacy" banner
Appears once per team configuration. Offers to backfill the per-week capacity map from the team's legacy hoursPerWeek and pointsPerSprint defaults so existing setups keep working when they upgrade. After clicking, the banner dismisses for that team.
Add Member button
A + Add Member button opens a dialog asking for a name and (optionally) hours-per-week, utilisation %, and points-per-sprint. New members default to 40 hours, 100% utilisation, and a points value derived from the team-wide default.
Show total / Show per selected project toggle
Visible only when programme projects are configured. Show total (the default) shows each member's full capacity. Show per selected project scales every capacity column by that member's allocation factor for the project currently selected in the main app's project picker. In project view, capacity and utilisation become read-only — they are scaled values, not stored values, so editing them would be ambiguous. Time off, holidays, and demand still display unscaled.
Team Members table
One row per member. Sticky-header table with the columns listed below.
Selection
- Select — a checkbox per row. Selecting a row filters the table to that single member; selecting again clears. A small bar appears above the table while a member is selected reading Showing 1 of N members with a Show All button.
Identity
- Name — the member's avatar (deterministic-colour circle with initials), the display name, and a view time off link that opens the per-member modal (described below).
Capacity (period bulk)
- Hrs/Pts per [Period] — the column header adapts to the period and estimation mode (e.g., Hrs/Wk, Pts/Mo). Editing this field sets every week in the period to the new value. When weeks differ already, the field shows a varies placeholder until the user types a replacement; committing a value re-flattens all weeks to that value. Internally still stored per ISO week.
- Total — sum of capacity across the period after utilisation but before time-off deduction. The unit suffix is h for hours (or d for days when configured) and p for points.
- Util % — utilisation as 0–100. Uses the same per-week storage and bulk-edit pattern as capacity.
Allocation (programme projects only)
- Alloc — a button labelled with two stacked totals,
Hrs: X% / 100%andPts: Y% / 100%. The totals are colour-coded grey when ≤ 100% and red when over-allocated. Clicking opens an inline popover (see Allocation popover below).
Time off and holidays
- Time Off — total hours deducted in the period for PTO + holidays, summed. The cell is a button when the value is non-zero; clicking it expands an inline detail row (described below).
Net capacity
- Net Pts / Net Hrs — capacity after both utilisation and time off subtractions, floored at zero. This is the value forecasts and feasibility scores read.
Demand
- Demand — sum of the member's assigned-and-not-done estimates that overlap the visible period.
Issue count and inline expand
- Issues — count of non-done assigned issues. A button when non-zero; clicking expands an inline detail row listing each assigned issue with key, summary, and points.
Status badge
- Status — one of OVERLOADED (red), OPTIMAL (green), AVAILABLE (yellow), UNDERLOADED (grey). The decision compares total demand against net available capacity using the
LOAD_THRESHOLDSconstants — broadly: > 115% OVERLOADED, 90–115% OPTIMAL, 60–90% AVAILABLE, < 60% UNDERLOADED.
Removal
- Remove — a small
×button. Click confirms a dialog; on confirm the member is removed from the team and any non-done issues currently assigned to them are unassigned in Jira.
Per-member detail rows
Three independent inline expansions:
Issues detail
Lists every non-done issue assigned to the member that overlaps the period, with Jira key, summary, and points.
Time off detail
Lists every PTO entry and holiday in the period grouped by date. PTO entries have a × to delete them inline. Holidays have no delete button — they are managed in the Holidays section.
Allocation popover
A floating panel anchored to the Alloc button. Lists every programme project by key in a four-column grid (rows wrap when more than four projects exist). Each project card has two fields: a percent input (the share of this member's capacity dedicated to that project) and an editable "= X pts/hrs" line that shows the computed absolute. Edit either field and blurring persists the change; the other field recomputes from the member's current capacity. The popover header shows Project allocations and a close button. Two Σ chips at the bottom row sum the percents per unit — Σ Hrs: X% / 100% and Σ Pts: Y% / 100% — both turning red with a ⚠ marker when totals exceed 100%. Switching out of the Show per selected project mode while the popover is open auto-closes it.
Percent storage is the source of truth: when the member's Pts/Wk or Hrs/Wk is edited in the row above, every "= X" computed value in their popover updates immediately without any allocation edit. A 60% allocation stays 60% across capacity changes — that's the intent the planner expressed, not the absolute value.
Zero-allocation confirm
When the user edits an allocation cell down to zero (in either the matrix on the Projects tab or this popover) and the affected member still has unfinished work assigned to that project, a ConfirmDialog opens before the change saves. The title reads Zero allocation with assigned work; the message names the member, the project key, and the count of unfinished issues, then asks whether to continue (e.g., "Sarah Chen has 3 unfinished issues assigned in AUTH. Setting allocation to 0 will leave them with no capacity for this project. Continue?"). The user picks Cancel (allocation reverts to the previous value) or Continue (allocation is zeroed and the forecast recomputes). It does not fire when the member has no open issues on the project — there is nothing to warn about.
Per-member time-off modal

Reached by the view time off link on the member's name. Full-screen modal with four parts:
- Header: avatar, name, Time Off label.
- Summary line counting PTO days, holidays, total hours.
- Month-grouped collapsible sections, each listing entries for that month with date, reason, hours.
- Add Time Off form at the bottom: date picker, Full Day / Half Day / 2h / 1h segmented buttons, optional reason, an Add button.
Useful for entering a year of PTO upfront or for spotting clashes with a release window.
Time Off calendar section
A collapsible section beneath the team table. Contains a month-view calendar plus controls for bulk multi-day time-off entry.

Calendar navigation
Independent period bar with left/right arrows; the calendar's month is decoupled from the team table's period. Useful for editing forward time off while reading current-quarter capacity.
Member filter
A Show checkbox row letting the user filter the calendar to one or more team members. Clear resets to all members.
Legend
Four dot colours: weekend (light grey), holiday (yellow), time off (blue), selected (darker blue).
Day selection
Click a non-weekend day to select it. Ctrl-click toggles a day in or out of the selection. Shift-click selects a range from the last clicked day to the current day, skipping weekends. While days are selected, three buttons appear: Add Time Off (opens the bulk-add modal), Delete Time Off (removes any PTO entries on selected days), Clear (deselects).
Add Time Off bulk modal
Triggered from the selection action bar. Shows the chosen date range, lists each selected day as a chip (with an H badge for any day that already has a holiday), allows the user to pick a member, set hours-per-day from segmented buttons, type a reason, and confirm. The modal also has a collapsible Mark as Company Holiday form for declaring the same selection a holiday — but only when none of the selected days already have one.
Company Holidays section

A collapsible list. Each row shows date (formatted as Mon, Jan 1), name, an optional 🔄 recurring badge for yearly holidays, and Edit / Delete buttons. The Edit button switches the row into inline edit mode (date input, name input, Yearly checkbox, Save / Cancel). The Delete button removes the holiday immediately. The Add form at the bottom takes a date, a name, and a Yearly checkbox; submitting persists the holiday. Duplicate dates are silently ignored.
Holidays apply company-wide and are deducted from every member's net capacity automatically.
Total row
The last row of the team table aggregates across the visible (filtered) members.
- Total — period capacity sum.
- Util % — capacity-weighted average of utilisation.
- Time Off — total hours of PTO + holidays across the team.
- Net — total available capacity after deductions.
- Demand — total assigned non-done estimate.
In Show per selected project mode, capacity and Net are scaled by per-member allocation factor; time-off, holidays, and demand totals remain unscaled.
Demand-vs-Capacity feed (no chart in this tab)
The Team & Capacity tab itself does not render the cascade or feasibility chart. Once configuration is saved, the weekly bucketing engine reads the same data and feeds the Plan-Risk weekly grid, the cascade bar chart in What-If, and the feasibility scores on the Sprints tab. The link is one-way: configure here, see results elsewhere.
Estimation mode and time units
The whole tab adapts to the project's estimation mode:
- Points mode — Hrs/Pts per [Period] column header reads Pts/[Period]; capacity and demand are points; the Total row uses p.
- Hours mode — header reads Hrs/[Period]; capacity and demand are hours; h (or d with a
timeUnit: 'days'config) suffix.
Per-week capacity is stored in whichever unit the project is in; switching modes does not convert stored values automatically.
Data persistence
The saveTeamCapacityConfig bridge writes the entire roster + holidays + PTO + allocations as one document into the project's persistent store. Changes are saved on blur and on dialog confirm. There is no explicit Save button.
Removing a member calls unassignIssuesForUser which is the only Jira write the tab makes. All other edits are local.
Cross-cutting modes and settings
- Demo mode / regression mode — swap the team config to fixtures; UI behaviour is unchanged.
- Estimation mode — controls units and column headers globally.
- Sprint mode on/off — when off, pointsPerSprint fields are hidden in the + Add Member dialog and the Capacity column reverts to hours-per-week semantics in the Total row.
- Programme (multi-project) mode — unlocks the Allocation column, the Show per project toggle, and the allocation popover.
programAllMode— when viewing every project at once, the allocation popover is hidden because there is no single project to scale capacity by.
How the numbers are computed
- Net available capacity formula — see ALGORITHMS Appendix → Capacity and Demand (Net Available Hours, Net Available Points).
- Utilisation bands — see ALGORITHMS Appendix → Utilisation Ratio. Bands: > 115% Overloaded, 90–115% Optimal, 60–90% Available, < 60% Underloaded.
- Allocation factor — see ALGORITHMS section 18 (Per-Member Allocation Factor) and the Allocation in Scenarios subsection.
- Weekly bucketing — section 5 and the Plan Risk Weekly Bucketing reference.
- ISO-week proration — see ALGORITHMS Foundation Utilities → ISO Week Conversion for how partial weeks are handled.
Effects on other parts of the app
- Forecast (Dashboard, Scope, What-If) — every capacity provider used by the deterministic forecast and Monte Carlo reads its hours/points and utilisation from this tab.
- Plan-Risk weekly grid and cascade chart — read holiday, PTO, weekly capacity, and per-week demand directly.
- Auto-Level — when per-developer capacity caps are configured here, Auto-Level switches to its
skill_fitstrategy automatically. - Sprints tab — the per-sprint header (Demand vs Capacity, Deliverable / Tight / Overcommitted) reads its capacity from the resolved net-capacity values for the sprint window.
- Programs tab — the team allocation matrix is the same data shown there; editing in either place updates the same store.
- Risks engine — the Single-person load, Capacity hit, and Velocity decline detectors read base capacity and PTO out of this tab.