Tornar o pedido de decisão específico
Uma confirmação técnica de um fornecedor pode demonstrar disponibilidade para instalar sem representar aceitação do impacto no cliente. Numa reunião fictícia, separa essas duas perguntas: a equipa consegue executar e quem pode aceitar a indisponibilidade de cada função afetada? O responsável pela consulta de posições pode não representar a equipa que depende da exportação. Explica o impacto conhecido, as funções ainda por analisar e a decisão necessária. Se o registo permite avançar apenas após confirmação do parceiro, uma mensagem enviada não satisfaz essa condição. Mantém a pendência e encaminha qualquer alteração da condição para a autoridade aplicável. Uma nota útil inclui decisão pedida, âmbito, evidência, incerteza, prazo e consequência de não decidir. Isto ajuda a discussão internacional em inglês sem transformar a coordenação do Change Manager em autoridade ilimitada.
Proteger o tempo da alternativa
Às 03:20 UTC, uma exportação fictícia continua sem confirmação. O compromisso exige recuperação validada até às 04:00. A estimativa tem dezoito minutos de recuperação seguidos de oito de validação: o último início sem margem é 03:34. Investigar mais vinte minutos levaria a decisão às 03:40, seis minutos depois desse limite. Pedir mais tempo exige tornar visível a alternativa que deixa de caber. Isso não significa executar rollback automaticamente: se o destinatário já aplicou efeitos, a recuperação pode precisar de reconciliação. Pede evidência prioritária sobre estado e efeitos, um retorno anterior ao limite e uma decisão pelos responsáveis. Os tempos são estimativas do exercício, sem garantia de produção. Se mudarem os dados ou as etapas, recalcula. Também não elimines validação para manter uma aparência de cumprimento do prazo comunicado.
Concluir a passagem com capacidade observável
Uma janela prolongada até às 04:15 não estende automaticamente a cobertura da equipa que sai às 03:30. Há 45 minutos por resolver. O turno seguinte recebeu slides, mas tem apenas leitura e não demonstrou recuperação. Regista a responsabilidade ainda não transferida e acorda cobertura capaz ou uma revisão do plano. A orientação Google SRE sobre transição apoia preparação, treino e transferência progressiva; o modelo organizacional concreto continua local. Define tarefas, acesso necessário, apoio temporário, aceitação e critérios para concluir a passagem. Assistir a uma sessão não equivale a executar o procedimento. Uma demonstração autorizada num ambiente apropriado pode revelar lacunas antes da autonomia. Se o serviço estabilizou mas uma exportação ainda precisa de confirmação, atribui seguimento aceite e próximo retorno. O fecho técnico não apaga esse trabalho residual.
Reproduzir os cálculos e desafiar as entradas
Guarda o código abaixo como change-assurance.py e executa python3 change-assurance.py. Não exige pacotes adicionais. Foi executado com CPython 3.13.1 e produz onze grupos de verificações. Calcula limites e lacunas com minutos do mesmo dia UTC, distingue eventos de deployments e compara mediana com máximo. Não converte fusos, não modela incerteza de duração e não valida entradas gerais. No objeto de passagem, os campos de aceitação, acesso e demonstração são valores fornecidos: o programa não autentica pessoas nem observa uma recuperação. Altera a hora final da cobertura e prevê a lacuna antes de executar. Depois altera apenas attendedTraining: a lista de condições em falta deve manter-se. Escreve uma nota de decisão com o cálculo e a evidência real ainda necessária. Uma lista vazia no modelo não autoriza produção nem demonstra competência humana.
"""Original DR arithmetic and evidence exercise, using fictional inputs only."""
from fractions import Fraction
from statistics import median
import hashlib
import json
import platform
from pathlib import Path
def latest_recovery_start(deadline, recovery, validation):
return deadline - recovery - validation
def uncovered_after(coverage_end, window_end):
return max(0, window_end - coverage_end)
def handover_gaps(record):
# Supplied booleans are not authenticated observations or authorization.
required = ["accepted", "recoveryAccess", "demonstratedRecovery"]
return [key for key in required if not record.get(key, False)]
def run():
checks = []
def check(name, actual, expected):
if actual != expected:
raise AssertionError((name, actual, expected))
checks.append({"name": name, "actual": actual, "passed": True})
latest = latest_recovery_start(240, 18, 8)
check("recovery_start_reserves_validation", latest, 214) # 03:34 UTC
check("twenty_minute_investigation_loses_six_minutes", 200 + 20 - latest, 6)
check("twenty_five_minute_investigation_loses_eleven_minutes", 200 + 25 - latest, 11)
check("handover_extension_exposes_forty_five_minutes", uncovered_after(210, 255), 45)
check("longer_coverage_does_not_create_negative_gap", uncovered_after(270, 255), 0)
partial = {"accepted": False, "recoveryAccess": False, "demonstratedRecovery": False, "attendedTraining": True}
check("attendance_does_not_fill_handover_conditions", handover_gaps(partial),
["accepted", "recoveryAccess", "demonstratedRecovery"])
check("supplied_handover_fields_only", handover_gaps({key: True for key in partial}), [])
events = [{"deployment": f"D{i:02}", "state": state}
for i in range(1, 51) for state in ["start", "technical-completion", "validation"]]
deployments = {event["deployment"] for event in events}
check("three_events_are_not_three_deployments", {"events": len(events), "deployments": len(deployments)},
{"events": 150, "deployments": 50})
check("rework_and_failure_numerators_remain_distinct",
{"rework": str(Fraction(5, len(deployments))), "failure": str(Fraction(2, len(deployments)))},
{"rework": "1/10", "failure": "1/25"})
waits = [2, 2, 3, 3, 40]
check("median_does_not_exclude_long_wait", {"medianHours": median(waits), "maximumHours": max(waits)},
{"medianHours": 3, "maximumHours": 40})
monthly_event_day, observed_until_day = 30, 20
check("declared_monthly_event_is_outside_observation", monthly_event_day > observed_until_day, True)
return {"scope": "Fictional same-day UTC arithmetic, supplied handover fields and synthetic metric events only. No identity, authority, actual access, recovery, service dependencies or human competence is verified. Empty gaps prove only supplied model fields. Estimates do not guarantee production completion.",
"python": platform.python_version(), "scriptSha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),
"groups": len(checks), "checks": checks}
if __name__ == "__main__":
print(json.dumps(run(), ensure_ascii=False, indent=2))“Recovery needs 26 minutes including validation. Waiting until 03:40 would exceed the 03:34 boundary. We need a decision or an accepted alternative before that point.”
Armadilhas comuns
Confirmação técnica como aceitação de negócio; prolongar investigação sem mostrar perda de alternativa; presenças como competência; mudança de turno sem aceitação.
Tópicos relacionados: Mandato de decisão · Recuperação e reconciliação · Autonomia de RUN
Uma passagem concluída exige responsabilidade aceite e capacidade adequada ao trabalho que permanece.
Referência: The Evolving SRE Engagement Model · NIST SP 800-128 updated October 2019; DORA five-metric model and change approval guidance; vendor documentation inspected 2026-10-01