RN964 Cockpit
Agente do setor elétrico precisa mostrar à ANEEL onde está cada controle da RN 964 e o que já foi feito a respeito.
O RN964 Cockpit é GRC verticalizado para a Resolução Normativa 964/2021 da ANEEL. A diferença estrutural para os outros módulos de conformidade está na origem do score: aqui o readiness não vem de um questionário, vem do estado real dos controles que o cliente cadastra. Cada controle tem código único no tenant, domínio e status; mudar o status recomputa o readiness na mesma transação.
O catálogo declarativo traz oito domínios com peso relativo: governança e gestão de risco (1,5), proteção e resposta (2,0), detecção (1,5), recuperação, continuidade e terceiros (1,0). O cálculo é a média dos controles aplicáveis dentro do domínio, e depois a média ponderada dos domínios que têm controle. 'Não aplicável' sai do denominador; 'não avaliado' conta como zero, porque só é pronto o que já foi confirmado. Domínio sem controle algum é omitido em vez de virar zero.
Incidente e plano de ação fecham o ciclo. O incidente ganha referência legível, prazo de comunicação em dias úteis derivado no serviço, o marcador afeta_ot de primeira classe e uma máquina de seis estados que carimba a comunicação à ANEEL e ao ONS uma única vez. O item do plano de ação pode apontar para um controle e/ou um incidente, e esse vínculo é validado no mesmo tenant sob RLS — um id de outro tenant recebe a mesma resposta de um id inexistente, sem vazar existência.
Capacidades em operação
Cada item corresponde a funcionalidade que existe no código e é alcançável por um usuário com o escopo correto.
-
Controles com código único por tenant
CRUD completo em oito domínios e cinco status (não avaliado, não conforme, parcial, conforme, não aplicável). Código duplicado devolve conflito.
-
Readiness derivado do estado real dos controles
compute_readiness é função pura sobre a lista de controles. Recomputado a cada mutação, na leitura do assessment e no POST /assessment/recompute, com snapshot materializado por versão do framework (rn964-2021.v1).
-
Incidente ciber com prazo regulatório derivado
Referência RN964INC-2026-0001 e aneel_prazo_at igual a detectado_em mais N dias úteis (JC_RN964_INCIDENT_REPORT_DEADLINE_DAYS, padrão 2), calculado no serviço, nunca aceito do corpo. Nove categorias, incluindo ot_ics e ransomware.
-
Máquina de estados do incidente
Seis estados. Comunicar à ANEEL ou ao ONS carimba a data com COALESCE — idempotente, não sobrescreve o carimbo original. Transição não prevista devolve 409.
-
Plano de ação com vínculo validado
Item com prioridade, responsável, prazo e vínculo opcional a controle e/ou incidente. O vínculo é checado no mesmo tenant sob RLS; inexistente devolve 422 sem revelar se pertence a outro tenant. Máquina de cinco estados com reabertura.
-
Escalação a partir do OT Sentinel
O catálogo RBAC registra que o escalate do OT Sentinel cria incidente RN964 com afeta_ot verdadeiro reusando este serviço, com o vínculo feito sob RLS.
-
Trilha append-only por objeto
audit_log recebe control.created/updated/deleted, incident.registered, incident.status_changed, action.created e assessment.recomputed, sempre sem PII de terceiro.
Entregáveis
- Painel de controles por domínio com status atual
- Readiness global e por domínio, versionado e recomputável sob demanda
- Registro de incidentes com prazo ANEEL/ONS e carimbos de comunicação
- Plano de ação priorizado, amarrado ao controle ou ao incidente que o originou
O que este módulo não faz
Não vem catálogo de controles da RN 964. O produto traz os oito domínios e seus pesos; a lista de controles é cadastrada pelo cliente ou pelo consultor — o seed cria um único controle de demonstração. Não há mapeamento artigo-a-artigo da resolução no código. O prazo de 2 dias úteis é placeholder configurável, marcado como tal no próprio código: o número exato da norma não está fixado. O cálculo de dias úteis pula só sábado e domingo, sem feriado. Não há alerta de prazo: nenhum beat vigia aneel_prazo_at, diferente do CondoLGPD, que tem beat para DSAR. Não há minuta por IA — o módulo não tem generate.py nem escopo de draft. readiness.catalog_payload() está escrito mas nenhuma rota o expõe, então a tela precisa duplicar a lista de domínios. Não há relatório de gap agregado nem exportação: existe a leitura dos controles e o score, e nada além disso.
Declaramos o limite porque software de segurança que promete tudo não é auditável. Se o que falta aqui é o que você precisa, o serviço consultivo cobre — ou dizemos que não cobre.
Conecta com
- OT Sentinel (escalate cria incidente RN964 com afeta_ot, vínculo sob RLS)
- app.api.idempotency (POST de controles, incidentes, itens de ação e recompute)
- audit_log append-only
- RLS FORCE nas quatro tabelas rn964_* (migration 0019)
- RBAC da plataforma (app/rbac/catalog.py)
Controle de acesso
O acesso é concedido por escopo, não por perfil genérico. Quem só precisa ler não recebe permissão de escrita, e a barreira é o banco de dados, não a interface.
- rn964:control:read
- rn964:control:write
- rn964:assessment:read
- rn964:assessment:write
- rn964:incident:read
- rn964:incident:write
- rn964:action:read
- rn964:action:write
Quer ver funcionando?
Demonstração com dado do seu ambiente, não com base de exemplo. É a única forma de saber se serve.