Uma soma não é um plano executável
Num exemplo fictício, uma pessoa tem 35 horas na semana. Vinte estão reservadas a suporte e já incluem quatro horas de reuniões desse suporte; outros compromissos ocupam cinco. Restam dez, não seis. Antes de calcular, identifica que categorias se sobrepõem e quais são mutuamente exclusivas. Uma passagem com duas pessoas durante 30 minutos consome uma hora-pessoa, embora dure meia hora. Esta distinção também se aplica a formação acompanhada: seis horas da colega e seis do mentor ocupam doze horas-pessoa. O resultado da aprendizagem exige observação própria e não se deduz da presença. Para planear, mostra tempo disponível por pessoa, especialidade e janela. Se uma tarefa exige duas horas consecutivas, quatro intervalos de meia hora não demonstram viabilidade. Pergunta se a tarefa pode ser interrompida antes de propor essa divisão.
Encontrar cobertura e sobreposição
O serviço do exercício requer cobertura das 08:00 às 17:00 UTC. A cobre 08:00–12:00 e B cobre 13:00–17:00. Existe uma hora descoberta e nenhuma sobreposição para uma passagem síncrona de 30 minutos. Cobertura do serviço e presença simultânea são condições distintas. Uma proposta A até 13:00 e B a partir das 12:30 cobre a janela e cria 30 minutos comuns, mas aumenta o esforço total de 480 para 570 minutos-pessoa. Os 90 minutos adicionais precisam de acordo e de tratamento no restante plano. O modelo não verifica escalas reais, regras laborais, acesso ou competência. Mantém todos os horários em UTC para este exercício; uma equipa real precisa de confirmar datas e fusos aplicáveis. Não transforma a proposta num compromisso aceite apenas porque a conta fecha. Identifica quem confirma a alteração e o impacto sobre outros trabalhos.
Capacidade específica e procura concentrada
Ana conhece Oracle e está disponível à tarde. Rui está livre de manhã e conhece Linux. Se a tarefa exige Oracle de manhã, a equipa tem uma lacuna mesmo dispondo de horas livres. A matriz do exercício contém declarações, não certifica competências. Usa-a para encontrar uma questão a resolver: mudar a janela, confirmar outra pessoa com meios adequados ou renegociar o compromisso. O mesmo cuidado aplica-se à procura. Uma média semanal constante pode esconder chamadas concentradas na janela de projeto. Regista apoio informal dado por colegas, pois um turno que parece funcionar com uma pessoa pode estar a consumir várias. Analisa pedidos, esforço e interrupções sem converter essa informação numa classificação automática das pessoas. A finalidade é compreender a capacidade necessária e discutir escolhas com os responsáveis, incluindo trabalho já iniciado e compromissos afetados.
Prática com um modelo limitado
Copia o código completo abaixo para team-capacity.py e executa python3 team-capacity.py. Não requer pacotes externos. Antes de executar, prevê a lacuna, a sobreposição, o esforço adicional e a pessoa encontrada em cada janela. O script representa cada minuto de um único dia UTC como elemento de um conjunto; inclui o início e exclui o fim. União calcula cobertura e interseção calcula presença simultânea. As treze verificações também distinguem idade de um item aberto e ciclo de um item terminado. X começa no dia 2 e continua aberto no dia 9: idade sete. Y começa no dia 5 e termina no dia 8: ciclo três. Depois altera apenas um intervalo e explica a diferença antes de ajustar as asserções. Estes resultados são locais e sintéticos. Não houve consulta de calendário real, avaliação de pessoas ou aprovação de uma escala.
"""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))A proposta 08:00–13:00 e 12:30–17:00 cobre nove horas, com meia hora comum e 570 minutos-pessoa de esforço.
Armadilhas comuns
Descontar reuniões duas vezes; tratar pessoas como intercambiáveis; confundir cobertura com passagem; aprovar uma escala a partir de uma conta.
Tópicos relacionados: Procura operacional · Planeamento de recursos
Um compromisso precisa de capacidade no momento e com os meios certos; o total semanal é apenas uma parte da evidência.
Referência: Capacity planning · Atlassian Team Playbook, GitLab leadership handbook, Google SRE, Kanban Guide May2025 and DORA five-metric model; inspected 2026-10-01