A sum is not an executable plan
In a fictional example, a person has 35 weekly hours. Twenty are reserved for support and already include four hours of support meetings; other commitments occupy five. Ten remain, not six. Before calculating, identify overlapping and mutually exclusive categories. A handover involving two people for 30 minutes consumes one person-hour although it lasts half an hour. The same distinction applies to supervised learning: six colleague hours and six mentor hours consume twelve person-hours. Learning outcomes need their own observation and cannot be inferred from attendance. For planning, show available time by person, specialty, and window. If a task requires two consecutive hours, four half-hour intervals do not establish feasibility. Ask whether the task can be interrupted before proposing that split. Otherwise a correct total can still support an impossible promise.
Find coverage and overlap
The exercise service requires coverage from 08:00 to 17:00 UTC. A covers 08:00–12:00 and B covers 13:00–17:00. One hour is uncovered and there is no overlap for a synchronous 30-minute handover. Service coverage and simultaneous presence are different conditions. Proposing A until 13:00 and B from 12:30 covers the window and creates 30 shared minutes, but increases total effort from 480 to 570 person-minutes. The additional 90 minutes need agreement and treatment in the remaining plan. The model checks no actual rota, employment rules, access, or competence. Keep all times in UTC for this exercise; an actual team needs to confirm applicable dates and time zones. Do not turn the proposal into an accepted commitment merely because the arithmetic works. Identify who confirms the change and its effect on other work.
Specific capacity and concentrated demand
Ana knows Oracle and is available in the afternoon. Rui is free in the morning and knows Linux. If a task requires Oracle in the morning, the team has a gap despite free hours. The exercise matrix contains declarations; it does not certify skills. Use it to locate a question needing resolution: change the window, confirm another suitably equipped person, or renegotiate the commitment. Apply the same care to demand. An unchanged weekly average can hide calls concentrated in the project window. Record informal help from colleagues because a shift apparently staffed by one person may consume several people’s capacity. Analyze requests, effort, and interruptions without turning that information into an automatic personnel ranking. The purpose is understanding required capacity and discussing choices with responsible owners, including work already started and affected commitments.
Practice with a bounded model
Copy the complete code below into team-capacity.py and run python3 team-capacity.py. No external packages are needed. Before execution, predict the gap, overlap, additional effort, and person found within each window. The script represents each minute of one UTC day as a set element; it includes the start and excludes the end. Union calculates coverage and intersection calculates simultaneous presence. Its thirteen checks also distinguish an open item’s age from a finished item’s cycle. X starts on day 2 and remains open on day 9: age seven. Y starts on day 5 and finishes on day 8: cycle three. Then change only one interval and explain the difference before adjusting assertions. These results are local and synthetic. No actual calendar was consulted, people assessed, or rota approved. Use the findings to explain questions a real planning discussion must resolve.
"""Original finite UTC-minute fixtures, not a live rota or personnel assessment."""
import hashlib
import json
from pathlib import Path
import platform
checks = []
def check(name, actual, expected):
assert actual == expected, (name, actual, expected)
checks.append(dict(name=name, actual=actual, expected=expected, passed=True))
def minutes(start, end):
assert 0 <= start <= end <= 24 * 60
return set(range(start, end)) # Start inclusive, end exclusive; one UTC day.
def coverage(shifts, required):
covered = set.union(*(minutes(a, b) for a, b in shifts))
return dict(covered=len(covered & required), missing=len(required - covered))
required = minutes(8*60, 17*60)
check('capacity_no_double_deduction', 35 - 20 - 5, 10)
check('two_person_handover_effort_minutes', 2 * 30, 60)
check('original_coverage_gap', coverage([(480, 720), (780, 1020)], required), {'covered':480, 'missing':60})
check('original_overlap_minutes', len(minutes(480, 720) & minutes(780, 1020)), 0)
# Proposed intervals require actual agreement; arithmetic is not an accepted rota.
check('proposed_coverage', coverage([(480, 780), (750, 1020)], required), {'covered':540, 'missing':0})
check('proposed_overlap_minutes', len(minutes(480, 780) & minutes(750, 1020)), 30)
check('proposed_effort_minutes', (780-480)+(1020-750), 570)
check('proposed_additional_effort_minutes', 570-480, 90)
people = [dict(name='Ana', skills=['oracle'], slots=['PM']), dict(name='Rui', skills=['linux'], slots=['AM'])]
def declared_candidates(skill, slot):
return [p['name'] for p in people if skill in p['skills'] and slot in p['slots']]
check('oracle_morning_gap', declared_candidates('oracle', 'AM'), [])
check('oracle_afternoon_candidate', declared_candidates('oracle', 'PM'), ['Ana'])
check('fragmented_total_and_longest', {'total':sum([30,30,30,30]), 'longest':max([30,30,30,30])}, {'total':120, 'longest':30})
check('age_and_completed_cycle', {'openAge':9-2, 'finishedCycle':8-5}, {'openAge':7, 'finishedCycle':3})
check('paired_learning_person_hours', 6+6, 12)
print(json.dumps(dict(groups=len(checks),checks=checks,python=platform.python_version,
scope='Synthetic UTC-minute sets, declared skills and arithmetic. No network, real calendar, competence assessment, approved rota or production change.',
scriptSha256=hashlib.sha256(Path(__file__).read_bytes).hexdigest),ensure_ascii=False,indent=2))The proposed 08:00–13:00 and 12:30–17:00 intervals cover nine hours with half an hour shared and 570 person-minutes of effort.
Common pitfalls
Deducting meetings twice; treating people as interchangeable; confusing coverage with handover; approving a rota from arithmetic.
Related topics: Operational demand · Resource planning
A commitment needs capacity at the right time with appropriate means; the weekly total is only part of the evidence.
Reference: Capacity planning · Atlassian Team Playbook, GitLab leadership handbook, Google SRE, Kanban Guide May2025 and DORA five-metric model; inspected 2026-10-01