Objetivo da Aula
Ao concluir esta aula, você será capaz de:
Identificar riscos automaticamente a partir de histórico de projetos similares
Implementar gerarPlanoMitigacao(risco, client) com LLM
Implementar configurarMonitoramentoRisco(riscos) com alertas automáticos
Calcular exposição ao risco: probabilidade × impacto
Completar os 2 TODOs do starter
Por que isso importa
Registrar riscos numa planilha sem mitigação é teatro de governança. O valor real está no plano de mitigação e no monitoramento ativo. Um LLM que conhece o tipo de projeto (integração com sistema legado, time distribuído, requisito regulatório) gera planos de mitigação específicos em segundos.
Conceitos Fundamentais
Matriz de Riscos
// Exposição = Probabilidade (0-1) × Impacto (1-5)
const exposicao = risco.probabilidade * risco.impacto
// Crítico: > 3.0
// Alto: 2.0-3.0
// Médio: 1.0-2.0
// Baixo: < 1.0TODO 1: gerarPlanoMitigacao(risco, client)
async function gerarPlanoMitigacao(risco, client) {
const response = await client.messages.create({
model: 'claude-haiku-4-5-20251001',
max_tokens: 400,
system: 'Você é um PM experiente em gestão de riscos. Gere planos de mitigação concretos e acionáveis.',
messages: [{
role: 'user',
content: `Risco identificado:
Título: ${risco.titulo}
Descrição: ${risco.descricao || ''}
Probabilidade: ${(risco.probabilidade * 100).toFixed(0)}%
Impacto: ${risco.impacto}/5
Gere um plano de mitigação com:
1. Ação preventiva (o que fazer AGORA para reduzir probabilidade)
2. Plano de contingência (o que fazer SE o risco se materializar)
3. Dono do risco (quem deve monitorar)
4. Métrica de alerta precoce (sinal de que o risco está se concretizando)`,
}],
})
return {
risco: risco.titulo,
exposicao: risco.probabilidade * risco.impacto,
plano: response.content[0].text,
gerado_em: new Date().toISOString(),
}
}TODO 2: configurarMonitoramentoRisco(riscos)
function configurarMonitoramentoRisco(riscos) {
const alertas = []
for (const risco of riscos) {
const exposicao = risco.probabilidade * risco.impacto
// Definir frequência de check baseada na exposição
const frequencia = exposicao > 3.0 ? 'diário'
: exposicao > 2.0 ? 'semanal'
: 'quinzenal'
// Definir threshold de alerta baseado no tipo de risco
const threshold_alerta = risco.tipo === 'cronograma' ? 'Atraso > 2 dias na task crítica'
: risco.tipo === 'tecnico' ? 'Build/teste falhando por > 4h'
: risco.tipo === 'equipe' ? 'Ausência não planejada de dev'
: 'Revisão manual necessária'
alertas.push({
risco: risco.titulo,
exposicao: Math.round(exposicao * 10) / 10,
frequencia_revisao: frequencia,
threshold_alerta,
proximo_check: calcularProximoCheck(frequencia),
})
}
// Ordenar por exposição (riscos mais críticos primeiro)
return alertas.sort((a, b) => b.exposicao - a.exposicao)
}
function calcularProximoCheck(frequencia) {
const dias = frequencia === 'diário' ? 1 : frequencia === 'semanal' ? 7 : 14
const proximo = new Date()
proximo.setDate(proximo.getDate() + dias)
return proximo.toISOString().split('T')[0]
}Aprofundamento Técnico
Identificação Automática de Riscos com LLM
async function identificarRiscos(descricaoProjeto, client) {
const response = await client.messages.create({
model: 'claude-haiku-4-5-20251001',
max_tokens: 600,
messages: [{
role: 'user',
content: `Dado este projeto, identifique os 5 principais riscos:
${descricaoProjeto}
Para cada risco, retorne JSON:
{
"riscos": [
{"titulo": "...", "tipo": "cronograma|tecnico|equipe|externo",
"probabilidade": 0-1, "impacto": 1-5, "descricao": "..."}
]
}`,
}],
})
const texto = response.content[0].text
const i = texto.indexOf('{'), f = texto.lastIndexOf('}') + 1
return JSON.parse(texto.slice(i, f)).riscos
}O LLM identifica riscos que humanos esquecem: “Integração com API externa de terceiros sem SLA documentado” é um risco real que um PM focado nas features pode não registrar.
Exemplos Anotados
Exemplo 1: Pipeline Completo
const projeto = 'E-commerce com integração de pagamento via Stripe, time de 4 devs, prazo de 3 meses'
// 1. Identificar riscos
const riscos = await identificarRiscos(projeto, client)
// → [
// { titulo: 'API Stripe muda breaking change', prob: 0.2, impacto: 4 },
// { titulo: 'Desenvolvedor sênior sai no meio', prob: 0.3, impacto: 5 },
// ...
// ]
// 2. Gerar planos de mitigação para exposição > 1.5
const altos = riscos.filter(r => r.probabilidade * r.impacto > 1.5)
const planos = await Promise.all(altos.map(r => gerarPlanoMitigacao(r, client)))
// 3. Configurar monitoramento
const monitoramento = configurarMonitoramentoRisco(riscos)
// → [
// { risco: 'Dev sênior sai', exposicao: 1.5, frequencia: 'semanal', threshold: 'Ausência não planejada' },
// ...
// ]Padrões e Armadilhas
Padrões
Padrão 1: Dono do risco por tipo
const donos = { cronograma: 'scrum_master', tecnico: 'tech_lead', equipe: 'manager', externo: 'pm' }Padrão 2: Risco com plano de contingência é risco gerenciado
Preventivo: "Adicionar buffer de 20% no cronograma de integração Stripe"
Contingência: "Se Stripe muda API: 3 dias de adaptação, comunicar PM imediatamente"Armadilhas
⚠️ Armadilha 1: Probabilidade × Impacto sem calibração “Probabilidade: 0.8, Impacto: 5” para todo risco novo = lista de riscos inutilizável. Calibre: “Qual risco com que isso acontece em 1 de cada 10 projetos?” = 0.1.
⚠️ Armadilha 2: Plano de mitigação genérico do LLM
"Ação: Comunicar stakeholders regularmente" → genérico demais
"Ação: Criar canal #stripe-updates no Slack, assinar changelog Stripe, verificar semanalmente" → acionávelAdicione contexto de stack e time no prompt para respostas mais específicas.
Se não for realizar o laboratório, pule para o próximo capítulo.
Ponte para o Lab
TODO 1 — gerarPlanoMitigacao(risco, client): passe título, probabilidade, impacto para o LLM e peça preventivo + contingência + dono + métrica de alerta.
TODO 2 — configurarMonitoramentoRisco(riscos): calcule exposição por risco, defina frequência (diário/semanal/quinzenal) e threshold de alerta por tipo.
Agora você está pronto para o lab.