Diary (Diário Privado)
Status: 🟢 Estável (escopo restritíssimo — privacidade radical) Code: backend/app/modules/diary UI: frontend/src/app/(diary)/diary Última revisão deste doc: 2026-05-13 por Felipe + Claude Dependências fortes: members (FK obrigatório), agents (student_mirror responde), intelligence (crisis detection — counts agregados only)
1. Identidade
O que faz (uma frase)
Diário reflexivo privado do membro com prompts guiados, respostas IA via student_mirror agent, visualização operador apenas se shared_for_analysis=true, e devolutivas IA aprovadas (workflow similar a surveys).
Por que existe (negócio)
Aluno de Mais Consciente precisa espaço seguro pra reflexão. Sem este módulo:
- Anotações em Notion/papel sem IA.
- Sem prompts guiados pós-aula.
- Sem feedback estruturado do mentor.
Com Diary:
- Espaço privado por default (admin não vê a menos que aluno marque shared).
- Student_mirror responde reflexões com perguntas socráticas (sem julgamento).
- Devolutivas IA criam ponte aluno-mentor.
- Crisis detection (intelligence) lê counts agregados (não conteúdo) pra alertar tom de crise.
Por que existe (técnico)
- Privacidade radical:
shared_for_analysis=false→ invisível pro admin por default. Operador precisainclude_private=trueexplícito (audited). - Conteúdo NUNCA cross-tenant.
- Crisis detection consome só counts (não texto) —
intelligence.run_crisis_detection.
Status atual
Em prod, escopo restrito.
2. Cases de uso reais
Case 1: Aluno escreve reflexão diária
UI /diary → seleciona prompt "O que aprendi hoje?" → escreve → salva → student_mirror responde com pergunta reflexiva.
Case 2: Devolutiva pós-jornada
Após journey_assessment, aluno recebe diary_devolutiva (workflow ai_draft → em_revisao → aprovado → enviado → lido) — mentor pode editar antes de aprovar.
Case 3: Crisis detection (privacy-respecting)
Beat intelligence.run_crisis_detection lê counts agregados (sem conteúdo): qtd entries últimos 7d, mood médio, energy_level. Se sinal crítico → alerta sem revelar texto.
3. Oportunidades de negócio
- Diário guiado por IA: prompts adaptativos baseados em jornada do aluno.
- Mentoria escalada: devolutivas IA + revisão humana = mentor 1:N.
- Wellbeing dashboard: agregado anônimo por tenant (sem expor indivíduo).
4. Arquitetura interna
Arquivos
models.py— 3 tabelas.service.py— privacy-radical.routes.py— 23 endpoints.
5. Tabelas (3)
diary_entry
| Coluna | Notas |
|---|---|
tenant_id / member_id (FK obrigatório) | |
kind | reflection / chandra_qa / jornada_devolutiva / onboarding |
mood / energy_level | Numéricos |
themes | Array |
body | Texto da entry |
reply | Resposta IA (student_mirror) |
shared_for_analysis | Default false — invisível pro admin |
favorite / archived | |
written_at | Indexed |
diary_prompt
| Coluna | Notas |
|---|---|
theme_code | |
text | "O que aprendeu hoje?" |
is_active / sort_order |
diary_devolutiva
Workflow ai_draft → em_revisao → aprovado → enviado → lido. mentor_vision + operator_notes privados.
Relacionamentos cross-módulo
| Direção | Outro módulo | Como |
|---|---|---|
| ↗ Lê | members_member.id | FK obrigatório |
| ↗ Lê | agents (student_mirror) | Resposta IA reply populada async |
| ↘ Escreve | intelligence (crisis_detection) | Counts agregados (sem conteúdo) |
6. API / Endpoints (23)
Admin (5)
| Método | Rota | O que faz |
|---|---|---|
| GET | /api/diary/entries | Default: shared_for_analysis=true apenas. Use ?include_private=true pra ver tudo (audited) |
| GET | /api/diary/entries/{id} | Detail (respeita visibility) |
| GET | /api/diary/stats | Agregado |
| GET | /api/diary/me/entries | Próprias do operador |
Membro (18)
| Método | Rota | O que faz |
|---|---|---|
| GET | /api/diary/me/entries | Próprias |
| POST | /api/diary/me/entries | Criar |
| GET | /api/diary/me/entries/{id} | Detail |
| PATCH | /api/diary/me/entries/{id} | Edit own |
| DELETE | /api/diary/me/entries/{id} | |
| GET | /api/diary/me/prompts | Lista prompts ativos |
| GET | /api/diary/me/devolutivas | Lista devolutivas aprovadas |
| GET | /api/diary/me/devolutivas/{id} | Detail (sem mentor_vision) |
7. Configuração
Sem env vars. Privacy default: list_entries rejeita private a não ser include_private=true explícito.
8. Operações + Troubleshooting
Sintoma: Operador não vê entries
Causa: Filtro default shared_for_analysis=true.
Fix: ?include_private=true (audit log marca).
9. Limitações e débitos técnicos
| # | Item |
|---|---|
| 1 | shared_for_analysis=false invisível por default |
| 2 | mentor_vision NUNCA retornado ao membro |
| 3 | Crisis detection consome só counts |
| 4 | Legacy migration fields (legacy_id, legacy_source) pra backfill antigos |
10. Histórico
Em prod desde absorção do Diary legacy (Darpana). Foco em privacidade radical desde dia 1.