Definir o resultado antes da perturbação
O exercício começa no fecho de fundos de um serviço fictício. A pergunta é se a equipa consegue concluir o fluxo necessário quando a identidade deixa de estar disponível. Define operações abrangidas, prazo, dados, pessoas, dependências e critérios de aceitação. Depois escolhe uma perturbação ligada a fragilidades plausíveis, como o cofre depender da mesma identidade. Os princípios BCBS de março de 2021 enquadram cenários severos mas plausíveis e dependências de operações críticas. A oficina usa esse enquadramento para formular uma hipótese original; não presume que exista esse desenho ou esse limite no BNP Paribas.
Interpretar o número antes de o comparar
Uma pontuação ordinal de oito não representa automaticamente o dobro dos euros de uma pontuação quatro. Identifica a escala e a justificação. NIST SP 800-30 revisão 1 distingue abordagens qualitativas, quantitativas e semiquantitativas e discute incerteza. No nosso modelo explícito, dez por cento de hipótese de perder dez mil e noventa por cento de zero dão média de mil. Outro modelo com um por cento de cem mil também dá mil. A média coincide, mas a consequência condicionada ao segundo evento é dez vezes maior. Tolerância, capacidade e objetivos podem justificar respostas diferentes.
Tornar a dependência visível
Se dois controlos consultam o mesmo diretório incorreto, ambos podem falhar pelo mesmo motivo. Não multipliques taxas marginais como se a independência estivesse demonstrada. No cálculo inventado, P(A)=10% e P(B dado A)=40% dão P(A e B)=4%. Um modelo independente com duas probabilidades de 10% daria 1%, mas é outro conjunto de hipóteses. Nenhum valor foi estimado de incidentes reais. A mesma pergunta aplica-se a fornecedores: duas marcas podem recorrer ao mesmo centro, especialistas ou infraestrutura. Mapeia a cadeia que entrega o resultado e identifica que alternativa continua disponível quando a causa comum ocorre.
Usar o relógio do resultado
O modelo sequencial tem quinze minutos para detetar, vinte para mobilizar, quarenta para restaurar e vinte e cinco para validar. São cem desde a perturbação ao resultado utilizável. O restauro pode cumprir um objetivo de componente de sessenta enquanto o serviço falha uma meta de noventa. Reporta os dois factos. Não redefinas o instante inicial depois de ver o resultado. Uma proposta reduz a sequência para cinco, dez, quarenta e vinte: setenta e cinco. Esse cálculo cabe na meta, mas ainda precisa de demonstração. Se o restauro passar a setenta, o total sobe para cento e cinco.
Avaliar a mitigação com entradas contínuas
A fila começa com duzentos casos e recebe vinte por hora. Um revisor conclui quinze, deixando mais cinco por hora; após quatro horas restam duzentos e vinte. Três revisores independentes de quinze cada dão quarenta e cinco brutos e vinte e cinco líquidos, exigindo oito horas para drenar. Quatro dão sessenta brutos, quarenta líquidos e cinco horas. A meta de seis exige pelo menos quatro neste modelo. Na operação, precisas ainda de confirmar competências, disponibilidade, pausas, qualidade e retrabalho. O número de pessoas numa escala não mede capacidade sustentável nem autoriza ignorar outros serviços que dependem delas.
Executar sensibilidade sem inventar certeza
Guarda o código como run.py e executa python3 run.py --output evidence.json. São trinta e duas comparações determinísticas com dados sintéticos. O programa não recupera sistemas nem estima probabilidades. Alterar hipóteses ajuda a localizar fragilidades: uma probabilidade entre um e três por cento e impacto entre cinquenta e cento e vinte mil produzem médias entre quinhentos e três mil e seiscentos ao combinar extremos. Isto é sensibilidade, não intervalo de confiança. Entrega as hipóteses ao lado do resultado e indica qual observação ou especialista seria necessário para as fundamentar antes de uma decisão real.
"""Original scenario arithmetic. No production recovery, probability estimate or risk approval.
Run: python3 run.py --output evidence.json
"""
import argparse
import hashlib
import json
import math
import platform
from fractions import Fraction
from pathlib import Path
def drain_hours(backlog, arrivals, capacity):
if min(backlog,arrivals,capacity)<0:
raise ValueError('negative input')
if backlog==0:
return 0
if capacity<=arrivals:
return None
return float(Fraction(backlog,capacity-arrivals))
def exception_valid(e,now,volume,scope,mitigation):
# Synthetic decision record, never an authorization engine.
return bool(e['approved'] and e['start']<=now<e['expires']
and volume<=e['volume_limit'] and scope in e['scopes'] and mitigation)
def run():
checks=[]
def check(name,actual,expected):
assert actual==expected,(name,actual,expected)
checks.append(dict(name=name,actual=actual,expected=expected,passed=True))
check('model A expected amount',int(Fraction(1,10)*10000),1000)
check('model B same expected amount',int(Fraction(1,100)*100000),1000)
check('model B larger conditional impact',100000//10000,10)
check('conditional joint probability percent',float(Fraction(1,10)*Fraction(2,5)*100),4)
check('independent assumption would give different percent',float(Fraction(1,10)*Fraction(1,10)*100),1)
check('conditional joint is four times independent illustration',4/1,4)
check('lower sensitivity estimate',int(Fraction(1,100)*50000),500)
check('upper sensitivity estimate',int(Fraction(3,100)*120000),3600)
timeline=dict(detect=15,mobilize=20,restore=40,validate=25)
total=sum(timeline.values())
check('full timeline includes detection and validation',total,100)
check('ninety minute service target missed',total<=90,False)
check('service target overrun minutes',total-90,10)
check('component target can pass while service fails',timeline['restore']<=60,True)
improved=dict(detect=5,mobilize=10,restore=40,validate=20)
check('improved conditional timeline',sum(improved.values()),75)
check('improved timeline margin',90-sum(improved.values()),15)
check('slower restore sensitivity',sum({**improved,'restore':70}.values()),105)
check('one reviewer backlog after four hours',200+(20-15)*4,220)
check('one reviewer cannot drain with arrivals',drain_hours(200,20,15),None)
check('two reviewers drain time hours',drain_hours(200,20,30),20)
check('three reviewers drain time hours',drain_hours(200,20,45),8)
check('four reviewers drain time hours',drain_hours(200,20,60),5)
check('minimum reviewers for six hour model',math.ceil((Fraction(200,6)+20)/15),4)
check('zero backlog needs no drain time',drain_hours(0,20,15),0)
check('equal arrival capacity cannot drain',drain_hours(200,20,20),None)
e=dict(approved=True,start=0,expires=10,volume_limit=100,scopes=['service-A'])
check('exception within all fictional conditions',exception_valid(e,5,100,'service-A',True),True)
check('exception before window fails',exception_valid(e,-1,100,'service-A',True),False)
check('exception expired boundary fails',exception_valid(e,10,100,'service-A',True),False)
check('exception excess volume fails',exception_valid(e,5,101,'service-A',True),False)
check('exception different service fails',exception_valid(e,5,100,'service-B',True),False)
check('exception unavailable mitigation fails',exception_valid(e,5,100,'service-A',False),False)
check('exception missing approval fails',exception_valid({**e,'approved':False},5,100,'service-A',True),False)
check('funding and deployment alone cannot close treatment',all([True,True,False,False]),False)
check('funding deployment effectiveness acceptance all present',all([True,True,True,True]),True)
return dict(runtime=platform.python_version(),scope='Fictional probabilities, linear capacity, sequential timelines and exception predicates only. Not empirical forecasting, actual recovery, capital calculation, control certification or authorization.',passed=len(checks),checks=checks,runnerSha256=hashlib.sha256(Path(__file__).read_bytes()).hexdigest())
if __name__=='__main__':
p=argparse.ArgumentParser();p.add_argument('--output',required=True);args=p.parse_args()
Path(args.output).write_text(json.dumps(run(),indent=2)+'\n')
Exemplo: o restauro de quarenta minutos cumpre o objetivo técnico, mas as quatro fases totalizam cem para uma meta de serviço de noventa.
Armadilhas comuns
Multiplicar taxas sem independência; confundir média com perda certa; medir só restauro; contar capacidade bruta quando continuam a chegar casos.
Tópicos relacionados: Avaliação de risco e eficácia de controlos · Mudança e dependências externas · Resiliência, cenários e melhoria
Um cenário útil liga perturbação e resultado, torna dependências visíveis e distingue cálculo condicionado de capacidade operacional demonstrada.
Referência: Principles for operational resilience · DR operational risk professional assessment2026.10