NR-01
Status: 🔵 MVP (módulo PRIVADO Mais Consciente, primeiro projeto Colorado) Code: backend/app/modules/nr01 UI: frontend/src/app/(public)/r/nr01 (link público) + admin Última revisão deste doc: 2026-05-13 por Felipe + Claude Dependências fortes: surveys (biblioteca de instrumentos)
1. Identidade
O que faz (uma frase)
Protocolo de pesquisa NR-01 (Norma Regulamentadora 1 — saúde mental no trabalho) com coleta completamente anônima via session_token client-side, SEM PII no schema (defesa em profundidade), escores dimensionais via instrumentos psicométricos validados, e descarte programado pós-análise.
Por que existe (negócio)
NR-01 é norma brasileira que obriga empresas a avaliarem riscos psicossociais. Felipe é consultor NR-01 (memória [[nr01-consultoria]]) e usa Mais Consciente como módulo PRIVADO pra atender clientes (memória [[nr01-modulo-privado-maisconsciente]]).
Sem este módulo:
- Pesquisa anônima exigiria Google Forms/Typeform → vazamento PII inevitável.
- Sem licença pra usar instrumentos validados (COPSOQ, CBI, etc.).
- Compliance NR-01 manual.
Com NR-01:
- Anti-PII radical: schema + trigger DB juntos rejeitam qualquer email/IP/member_id.
- Biblioteca compartilhada: consome instrumentos da
surveys(catálogo global). - Retention policy: descarte automático de answers após X dias, mantém scores agregados.
- Cliente Colorado (memória [[nr01-colorado]]) é primeiro projeto.
Status atual
- MVP em prod, primeiro projeto Colorado pré-implementação (memória [[nr01-estado-2026-05-11]]).
- Modo aprendizado (memória [[nr01-modo-aprendizado]]) — sem cobrança, com amigo.
Próxima mudança: Sprint 4 (scoring final + dashboard agregado anti-reID).
2. Cases de uso reais
Case 1: Funcionário Colorado responde
- Recebe link
app.mandir.com.br/r/nr01/colorado-q2-2026. - Tela de consentimento → click "concordo" →
POST /consent(log SEM PII). - UUID gerado no client →
POST /sessioncrianr01_session(session_token)— sem email/IP/member_id. - Carrega
GET /items→ questões da biblioteca COPSOQ. - Responde
POST /answerpor item. - Demographic
POST /demographic(unit, area, tenure_band). - Anti-reID check
POST /demographic/check→ preview se sua célula tem n≥5. POST /submit→ finaliza →nr01_dimension_scorecalculado.
Case 2: Descarte automático
Beat (futuro) lê nr01_retention_policy.discard_after_days → após data, deleta nr01_answer + nr01_demographic_answer → mantém apenas nr01_dimension_score (agregado anônimo).
3. Oportunidades de negócio
- NR-01 as a service completo pra empresas brasileiras.
- Conformidade auditável — log de consentimentos sem PII = LGPD compliance defensável.
- Insights anti-reID — analytics agregada que nunca expõe indivíduo.
Riscos: instrumentos sob licença acadêmica (memória [[nr01-modo-aprendizado]] — modo aprendizado OK; pra venda comercial, licenciar formal).
4. Arquitetura interna
Arquivos
models.py— 8 tabelas.service.py—AnonymousSessionService,ProjectService.routes.py— admin.routes_public.py— 7 endpoints públicos.adapters/library.py—LibraryAdaptervalida cross-module com surveys.
5. Tabelas (8)
nr01_project
| Coluna | Notas |
|---|---|
slug / nome / client_name | |
status | draft / active / paused / closed / archived |
base_instrument_id | Referência catálogo surveys.survey_instrument |
lgpd_* | Controller + legal_basis |
nr01_session ⭐
SEM PII (defesa radical).
| Coluna | Notas |
|---|---|
session_token | UUID gerado client-side. Trigger DB rejeita NULL. |
status | in_progress / submitted / abandoned |
NÃO email / name / ip / member_id | Defesa anti-PII |
nr01_answer
| Coluna | Notas |
|---|---|
session_token | |
survey_item_id | FK lógica → survey_item (cross-module) |
survey_dimension_id | FK lógica → survey_dimension |
item_text_snapshot | Preserva variant no tempo |
response_time_ms | Arredondado |
nr01_demographic_config
unit, area, tenure_band, role_level. anti_reid_min_n=5.
nr01_demographic_answer
Resposta demográfica separada (agregação anônima).
nr01_consent_log
SEM PII — apenas timestamp + term_version + session_token.
nr01_dimension_score
| Coluna | Notas |
|---|---|
session_token | |
instrument_id / dimension_id | Cross-module refs |
raw_score / normalized_score (0-100) | |
threshold_zone | green / yellow / red |
nr01_retention_policy
Retenção X dias, descarte automático.
Relacionamentos cross-módulo
| Direção | Outro módulo | Como |
|---|---|---|
| ↗ Lê | surveys | LibraryAdapter.validate_item() cross-module |
6. API / Endpoints
Admin (1)
| Método | Rota | O que faz |
|---|---|---|
| GET | /api/nr01/projects | Lista projetos |
Público (7)
| Método | Rota | O que faz |
|---|---|---|
| GET | /r/nr01/{slug}/metadata | Info projeto + consentimento |
| POST | /r/nr01/{slug}/consent | Log LGPD (SEM PII) |
| POST | /r/nr01/{slug}/session | Criar/retomar sessão |
| GET | /r/nr01/{slug}/items | Questões da sessão |
| POST | /r/nr01/{slug}/answer | Resposta individual |
| POST | /r/nr01/{slug}/demographic | Demográfico |
| POST | /r/nr01/{slug}/demographic/check | Preview anti-reID |
| POST | /r/nr01/{slug}/submit | Finalizar |
7. Configuração
Env vars
| Var | Propósito |
|---|---|
NR01_TENANT_WHITELIST | Lista de tenants autorizados (módulo privado Mais Consciente) |
Cada projeto tem lgpd_controller + legal_basis próprios.
8. Operações + Troubleshooting
Sintoma: POST /session retorna 422
Causa: session_token não enviado em header.
Fix: Frontend gera UUID e envia em X-Session-Token header.
Sintoma: Cross-module item não encontrado
Causa: Instrumento não existe em survey_instrument do tenant root.
Fix: Importar instrumento via surveys admin.
9. Limitações e débitos técnicos
| # | Item |
|---|---|
| 1 | Modo aprendizado — sem cobrança formal |
| 2 | Instrumentos sob licença acadêmica |
| 3 | Descarte automático — beat task TBD |
| 4 | Sem dashboard agregado anti-reID |
| 5 | Defesa anti-PII = trigger DB hard-fail |
10. Histórico
- 2026-05-11 — Sprint 3 entregue + COPSOQ-PT médio 76/76 populado. Memória [[nr01-estado-2026-05-11]].
- Pré-implementação Colorado: aguardando 1ª reunião. Memória [[nr01-colorado]].
- Modo privado Mais Consciente, oculto de outros tenants. Memória [[nr01-modulo-privado-maisconsciente]].
- Parceria Vivian Dantas (médica do trabalho/psiquiatra).