Pular para o conteúdo principal
Modular Development Style · Roadmap de Implementacao

ModularFit

Fila de construcao verificavel por fase, com a Fase 0 de Planejamento concluida na aprovacao do DRS.

Publicado em 05 de setembro de 2026 Modulareasy · modulareasy.com/mds
Progresso da implementação ...
Planejamento 0%
Construção 0%
Testes 0%
Progresso geral: 0%
Clique no quadradinho para marcar como feito. O progresso é salvo automaticamente e compartilhado.

ModularFit: Roadmap de Implementação

CampoValor
ProdutoModularFit
Documento baseDRS do ModularFit
CompanheirosInventário de Artefatos · Jornadas dos Atores · Plano de Testes
EstágioPlanejamento fechado, mockup aprovado, construção iniciando
Data2026-09-05
Este documento é a fila de construção do ModularFit. Cada tarefa é um cartão com o requisito que ela cumpre, o que implementar, como verificar e o critério de aceite. A verificação vem antes da construção: primeiro se declara o observável que prova o resultado, depois se constrói até ele aparecer.

Como usar

  • Marque a tarefa apenas quando o critério de aceite passar na aplicação real, nunca quando o código foi escrito.
  • A ordem das fases é dependência técnica e, dentro dela, o foco do produto: o núcleo é o treino de musculação, então a fase de treino vem imediatamente depois de catálogo e vínculo, antes de dieta e de saúde. Uma fase não começa com a anterior aberta.
  • Todo requisito do DRS é coberto por ao menos uma tarefa. Se algo precisar ser construído e não estiver aqui, o DRS é atualizado antes do código.
  • O progresso do projeto tem três seções: Planejamento (40 por cento), Construção (40 por cento) e Testes (20 por cento). O Planejamento já está concluído na aprovação do documento.
  • A seção Construção é todo card que não é de Planejamento, o que inclui a Fase M e as ondas de correção, e não apenas as fases numeradas. É assim que a barra publicada conta, e a prosa deste documento conta igual desde 15/09/2026.

Mapa de cobertura

FaseMódulo do DRSRequisitos cobertos
Planejamentotodoselicitação, especificação, companheiros, validação, aprovação
M, Mockup Navegáveltodosreferência visual do sistema completo
1, Fundação e acessocore, planRF-CORE-001 a 012, RF-PLAN-001 a 004
2, Catálogo e vínculoexer, vincRF-EXER-001 a 004, RF-VINC-001 a 005
AUD, correções da Inspeçãocore, plan, pain, trei, dietRF-CORE-008, RF-CORE-009, RF-CORE-010, RF-CORE-014, RF-PLAN-001, RF-PLAN-002, RF-PAIN-009, RF-PAIN-011, RF-TREI-001, RF-TREI-004, RF-TREI-009, RF-DIET-001 a 003
3, TreinotreiRF-TREI-001 a 010
4, DietadietRF-DIET-001 a 005
5, Saúde e evoluçãosaudRF-SAUD-001 a 010
6, ComunicaçãocomuRF-COMU-001 a 006
7, Engajamento e painéisenga, painRF-ENGA-001 a 006, RF-PAIN-001 a 010
8, Cobrança, geração e integraçõescobr, iage, inte, exerRF-COBR-001 a 004, RF-IAGE-001 a 003, RF-EXER-005, RF-INTE-001 a 005
9, Guia da plataformaajudRF-AJUD-001 a 003

Estado global

Atualização de 13/09/2026. Planejamento fechado (28 de 28, 100 por cento). {F1-19} entregue e em produção (635dda0, migração 0018_perfil_publico.sql): tipo composto mfit.perfil_publico_reduzido e função mfit.perfil_publico, únicas portas de leitura reduzida de terceiro; RLS ligada em mfit.usuario, mfit.perfil_aluno e mfit.perfil_profissional, com 8 políticas mais 3 REVOKE DELETE; cinco funções SECURITY DEFINER estreitas mais duas promoções de claim, resolvendo os nove caminhos sem claim; rota GET /api/perfil/:usuarioId com o ramo do Administrador auditado; e o quarto placar de ops/verifica-acesso-aluno.mjs, cujo critério (d) herdado de {F1-14} sobe de 3 servidas + 17 pendentes = 20 para 4 servidas + 17 pendentes = 21. Placar N de 36 de {TA-06} inalterado (as três tabelas de perfil não estão entre as dezoito entidades de E.1). A Fase 1 fecha em código com {F1-19}: os dezenove cards {F1-01} a {F1-19} estão todos entregues. Conferindo a Definição de Pronto da Fase 1 cláusula por cláusula: (1) os trinta e seis casos de isolamento passam, ABERTO, {TA-06} continua [ ] até a décima oitava entidade nascer na Fase 8; (2) o perfil de terceiro devolve apenas os campos públicos, FECHADO por {F1-19}; (3) nenhuma escrita de categoria sensível acontece sem consentimento, FECHADO o mecanismo desde {F1-12}, {TA-10} placar 0 de 6, sobe por entidade sensível na Fase 5; (4) o aviso de natureza não clínica está nos quatro pontos, ABERTO, {TA-85} placar 2 de 4, os outros dois pontos nascem em {F5-01}, {F5-04}, {F5-05}, {F5-06} e {F8-09}; (5) toda escrita produz auditoria, FECHADO desde {F1-06} e {F1-11}; (6) o plano governa os limites por configuração, FECHADO desde {F1-13} e {F1-15}. Logo a Fase 1 fecha em código, e três das seis cláusulas da Definição de Pronto seguem abertas por card dono futuro fora da Fase 1: {TA-06} (Fase 8), {TA-08} (placar 1 de 11, Fase 8), {TA-20} (1 de 2 pontos de exibição, {F3-05} pendente) e {TA-85} (2 de 4, Fases 5 e 8); a semente de exercícios do dono ({ART-WF-17}, docs/seed/exercicios.csv) continua pendente do lado dele, fora do escopo de código. {F2-01} entregue e em produção (merge f3addf5, migração 0019_exercicio.sql): tabela mfit.exercicio com os treze campos, três enums canônicos, RLS com quatro políticas, três gatilhos de auditoria reaproveitados, índice GIN por trigrama e importador idempotente (ops/importar-exercicios.mjs); décimo quarto verificador (ops/verifica-exercicios.mjs); telas /admin/exercicios, /exercicios e /exercicios/:id no ar. A Fase 2 abre. Placar honesto da semente: 0 de 113 exercícios importados nesta data (pendência dele, não bloqueia o card), corrigido em 14/09/2026 para 113 de 113, ver Nota do card. {TA-20} segue aberto (1 de 2 pontos de exibição, execução da sessão pendente em {F3-05}). {F2-02} entregue e em produção (merge 9d326d0, migração 0020_midia_exercicio.sql): middleware único de cabeçalhos de segurança, imagem por arquivo ou endereço, vídeo por endereço de lista fechada, dimensão natural medida no servidor, décimo quinto verificador com navegador (tolerância 0,5 por cento). {ART-FORM-02} fecha, 13 de 13 campos. Placar honesto: 1 de 2 pontos de exibição de mídia ({F3-05} pendente), 1 de 2 repositórios com escrita, 27 parâmetros de operação, semente de mídia do dono ausente (0 de N). {TA-21} segue aberto. {F2-03} entregue e em produção (merge 05d52cf, sem migração): quatro filtros combináveis (grupo, dificuldade, categoria, equipamento) na mesma rota e consulta de {F2-01}, contador único vindo da mesma janela, índice existente medido por EXPLAIN ANALYZE e reaproveitado sem índice novo, verificador 15 de 15, dois drifts de paginação e de contagem corrigidos. {TA-22} fecha. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 24 de 96 = 25 por cento (peso 40), conta: 23 do estado anterior mais 1 de {F2-03} igual 24; Testes 10 de 153 = 6,54 por cento (peso 20), conta: 9 do estado anterior mais 1 de {TA-22} igual 10. Geral = 0,40 x 100 + 0,40 x 25 + 0,20 x 6,54 = 40 + 10 + 1,31 = 51,31 por cento, arredondado para 51 por cento. Atualização de 14/09/2026. {F2-04} entregue e em produção (merge 98db15a, https://fit.modulareasy.com): três pontos de entrada por interface para o catálogo, o link Exercícios nos painéis do aluno, do profissional e do administrador, único gap funcional medido (a tela /exercicios já existia desde {F2-01}); décimo quarto verificador com (j) 0 de 6 dimensões de plano tocando o catálogo (ausência gravada como medida) e (k) 5 de 5 rotas administrativas com papel conferido antes do banco; décimo quinto verificador provando com sessão real de aluno que a navegação em /exercicios e no detalhe não expõe controle de escrita. {TA-23} fecha. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 25 de 96 = 26,04 por cento (peso 40), conta: 24 do estado anterior mais 1 de {F2-04} igual 25; Testes 11 de 153 = 7,19 por cento (peso 20), conta: 10 do estado anterior mais 1 de {TA-23} igual 11. Geral = 0,40 x 100 + 0,40 x 26,04 + 0,20 x 7,19 = 40 + 10,42 + 1,44 = 51,86 por cento, arredondado para 52 por cento. Atualização de 14/09/2026. {F2-05} entregue e em produção (merge 7eaa87b, migração 0021_convite_de_vinculo.sql, https://fit.modulareasy.com): política vinculo_leitura passa a "meus vínculos" (perda declarada, profissional com vínculo ativo deixa de ler vínculos do aluno com terceiros); função definer mfit.usuario_por_identificador_publico resolve o identificador por igualdade exata; gatilho AFTER INSERT ON mfit.vinculo enfileira a notificação por e-mail na origem; POST/GET /api/vinculos e tela /alunos mínima no ar. Décimo sexto verificador com quatro placares: 3 de 3 políticas, 1 de 6 transições servidas, 27 de 27 pontos notificam por construção, pendente 0 linha e ativo 1 linha. {TA-11} fecha. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 26 de 96 = 27,08 por cento (peso 40), conta: 25 do estado anterior mais 1 de {F2-05} igual 26; Testes 12 de 153 = 7,84 por cento (peso 20), conta: 11 do estado anterior mais 1 de {TA-11} igual 12. Geral = 0,40 x 100 + 0,40 x 27,08 + 0,20 x 7,84 = 40 + 10,83 + 1,57 = 52,40 por cento, arredondado para 52 por cento. Atualização de 14/09/2026. {F2-06} entregue e em produção (merge 9b994b0, migração 0022_aceite_e_recusa_do_vinculo.sql, https://fit.modulareasy.com): duas transições novas do aluno por UPDATE condicional dentro de SAVEPOINT (pendente para ativo, pendente para recusado), guardadas por aluno_id = claims.sub AND estado = 'pendente' no próprio WHERE; notificação ao profissional por gatilho na origem; auditoria da transição por critério, ação alterar; GET /api/vinculos passa a servir os dois papéis (conserto, o aluno recebia lista vazia com 200); bloco Vínculos nasce em /perfil (tela 23), sem rota /vinculos nova. Placar de transições da máquina de estados: 4 de 6 servidas. {TA-12} e {TA-18} fecham, o segundo com a jornada completa do limite. pendente para cancelado e a transição proibida hoje alcançável pela rota de desativar seguem nomeadas para {F2-07}. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 27 de 96 = 28,12 por cento (peso 40), conta: 26 do estado anterior mais 1 de {F2-06} igual 27; Testes 14 de 153 = 9,15 por cento (peso 20), conta: 12 do estado anterior mais 2 de {TA-12} e {TA-18} igual 14. Geral = 0,40 x 100 + 0,40 x 28,12 + 0,20 x 9,15 = 40 + 11,25 + 1,83 = 53,08 por cento, arredondado para 53 por cento. Atualização de 14/09/2026. {F2-07} entregue e em produção (merge 42cd973, migração 0023_encerramento_do_vinculo.sql, https://fit.modulareasy.com): POST /api/vinculos/:id/desativar consertado (WHERE id = $1 AND estado = 'ativo'), quinto desfecho 409 estado_invalido para vínculo fora de ativo, e a capacidade do Administrador de terminar um convite pendente devolvida pela rota nova POST /api/vinculos/:id/cancelar; gatilho BEFORE UPDATE OF estado (mfit.validar_transicao_vinculo) recusa por construção as duas transições proibidas de E.3, P0001 na origem; gatilho AFTER UPDATE OF estado (mfit.enfileirar_saida_de_vinculo, SECURITY DEFINER) notifica as duas partes no encerramento e o aluno no cancelamento, modelos vinculo_encerrado e convite_cancelado sem token; auditoria sem gatilho novo, encerramento continua desativar e cancelamento cai em alterar; gabarito GABARITO-ACESSO-ALUNO.md ganha a separação de autoria na leitura (pode_ler_aluno(aluno_id, autor_id)) e na escrita (pode_ler_aluno(aluno_id) sem o segundo argumento), critério (e) novo de ops/verifica-acesso-aluno.mjs reprovando política de escrita que passe autor_id, placar de partida 0 de 0 tabelas com autor_id existem hoje, 11 pendentes nomeadas; décimo sexto verificador fecha o placar de transições em 6 de 6 e o de notificação em 6 de 6. Arnês com banco real (encerramento.test.ts, 22 casos) prova o H1 pelos dois lados, aluno e profissional, com tabela de ensaio mfit.ficha_ensaio: as três fichas legíveis pelo próprio profissional após o encerramento (condição 3 de D.2), a quarta ficha de autoria alheia invisível a ele, e INSERT/UPDATE negados com 403. {TA-13} fecha, os dois lados provados. /alunos ganha Encerrar na linha ativa e Cancelar na pendente; /perfil ganha Encerrar no vínculo ativo. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 28 de 96 = 29,17 por cento (peso 40), conta: 27 do estado anterior mais 1 de {F2-07} igual 28; Testes 15 de 153 = 9,80 por cento (peso 20), conta: 14 do estado anterior mais 1 de {TA-13} igual 15. Geral = 0,40 x 100 + 0,40 x 29,17 + 0,20 x 9,80 = 40 + 11,67 + 1,96 = 53,63 por cento, arredondado para 54 por cento. Atualização de 14/09/2026. {F2-08} entregue e em produção (merge 25e96ad, https://fit.modulareasy.com): nenhuma migração nova, última continua 0023; card de prova, sem código de produto, critério (e) novo em verificarVinculos.ts mais placar em ops/verifica-vinculo.mjs (universo de catálogo, decoy de seis trechos). Placar de ausência: 0 de 15 objetos de mfit.vinculo usam especialidade como guarda, 0 de 5 caminhos de escrita aplicam guarda por especialidade. Placar positivo: 4 de 4 especialidades, 2 personal_trainer no mesmo aluno, 5 vínculos ativos, contagem do limite igual a 5; teto de exibição medido, 50 linhas por consulta, sem paginação (Drift 3, dono {F7-07}). Arnês simultaneos.test.ts (16 casos), rotas reais. {TA-14} fecha com as quatro metades nominadas. Décimo sexto verificador: placar de transições inalterado, 6 de 6. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 29 de 96 = 30,21 por cento (peso 40), conta: 28 do estado anterior mais 1 de {F2-08} igual 29; Testes 16 de 153 = 10,46 por cento (peso 20), conta: 15 do estado anterior mais 1 de {TA-14} igual 16. Geral = 0,40 x 100 + 0,40 x 30,21 + 0,20 x 10,46 = 40 + 12,08 + 2,09 = 54,17 por cento, arredondado para 54 por cento. Atualização de 14/09/2026. {F2-09} entregue e em produção (merge 0668358, migração 0024_gestao_global_de_vinculos.sql, https://fit.modulareasy.com): listagem global paginada (GET /api/admin/vinculos) com os quatro filtros e nomes por LEFT JOIN LATERAL mfit.perfil_publico; tela /admin/vinculos com Desativar, Cancelar e Excluir, sem Ativar e sem Novo vínculo; GET /api/vinculos passa a recusar o Administrador com 403, perda declarada e sem consumidor. {TA-15} fecha com as duas metades nominadas. Fase 2 fecha: catálogo global lido por todos ({F2-01} a {F2-04}), vínculo governa o acesso do profissional ({F2-05} a {F2-07} e {F2-09} pelo caminho do Administrador), aluno acumula vínculos sem limite por especialidade ({F2-08}), máquina de estados recusa as transições proibidas ({F2-07}). Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 30 de 96 = 31,25 por cento (peso 40), conta: 29 do estado anterior mais 1 de {F2-09} igual 30; Testes 17 de 153 = 11,11 por cento (peso 20), conta: 16 do estado anterior mais 1 de {TA-15} igual 17. Geral = 0,40 x 100 + 0,40 x 31,25 + 0,20 x 11,11 = 40 + 12,50 + 2,22 = 54,72 por cento, arredondado para 55 por cento. Atualização de 14/09/2026. {F3-01} entregue e em produção (merge 17bd22e, migração 0025_ficha_de_treino.sql, https://fit.modulareasy.com): abre a Fase 3, ficha de treino criada pelo profissional com autoria por linha e por leitura, desativação por status, limite de plano por dimensão e três telas com componente único do item. {TA-24} continua [ ], provado pela metade, a Nota declara qual (Drift 4). Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 31 de 96 = 32,29 por cento (peso 40), conta: 30 do estado anterior mais 1 de {F3-01} igual 31; Testes 17 de 153 = 11,11 por cento (peso 20), inalterado, {TA-24} não fecha inteiro. Geral = 0,40 x 100 + 0,40 x 32,29 + 0,20 x 11,11 = 40 + 12,92 + 2,22 = 55,14 por cento, arredondado para 55 por cento. Atualização de 14/09/2026. {F3-02} entregue e em produção (merge 3d25e27, https://fit.modulareasy.com, sem migração, última em produção continua 0025): o aluno sem vínculo passa a criar a própria ficha pela mesma tela do profissional, guarda de papel fechado em lista, e o profissional lê a ficha do aluno pela mesma /treinos com ?aluno=; rótulo de autoria unificado num ponto único que decide pelo leitor antes da linha, décimo sétimo verificador com decoy. {TA-25} fecha inteiro, as duas metades do H1 provadas pela interface real (criar sem vínculo, depois vincular e ler identificada como do aluno). Aritmética recalculada pela contagem real de [x] no documento publicado: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 32 de 96 = 33,33 por cento (peso 40), conta: 31 do estado anterior (29 cards de fase mais 2 de Fase M) mais 1 de {F3-02} igual 32; Testes 18 de 153 = 11,76 por cento (peso 20), conta: 17 do estado anterior mais 1 de {TA-25} igual 18. Geral = 0,40 x 100 + 0,40 x 33,33 + 0,20 x 11,76 = 40 + 13,33 + 2,35 = 55,68 por cento, arredondado para 56 por cento. Atualização de 14/09/2026. {F3-03} entregue e em produção (merge 76bc9cd, migração 0026_edicao_da_ficha.sql, https://fit.modulareasy.com): edição da ficha pelo autor e pelo Administrador via PATCH /api/fichas/:id numa transação única, reconciliando a lista de itens por identificador; auxiliar mfit.pode_editar_por_autoria liberando o Administrador nas políticas de UPDATE e na nova política de DELETE de ficha_item; restrição de ordem única passa a adiável dentro da transação; gatilhos de criação e de alteração instalados nas duas tabelas da ficha, critério de tabela alterável com auditoria de alteração fecha em 7 servidas + 2 declaradas = 9 de 9; desativação e reativação por rotas próprias, fora do PATCH. Perda declarada: o UPDATE do Administrador deixa de ser recusado pela política. {TA-09} fecha inteiro; {TA-26} continua [ ], a metade que falta depende de {F3-09}. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 33 de 96 = 34,38 por cento (peso 40), conta: 32 do estado anterior mais 1 de {F3-03} igual 33; Testes 19 de 153 = 12,42 por cento (peso 20), conta: 18 do estado anterior mais 1 de {TA-09} igual 19. Geral = 0,40 x 100 + 0,40 x 34,38 + 0,20 x 12,42 = 40 + 13,75 + 2,48 = 56,23 por cento, arredondado para 56 por cento. Atualização de 14/09/2026. {F3-04} entregue e em produção (merge 8f0f9fd, migração 0027_solicitacao_de_ficha.sql, https://fit.modulareasy.com): solicitação de ficha nova ou de ajuste pelo aluno, com atendimento ou recusa pelo profissional destinatário, três avisos por gatilho na origem cobrindo por transição os dois caminhos de atendimento, e acompanhamento mínimo do próprio pedido pelo aluno. {TA-27} fecha inteiro; {TA-26} continua [ ], a metade que falta depende de {F3-09}. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 34 de 96 = 35,42 por cento (peso 40), conta: 33 do estado anterior mais 1 de {F3-04} igual 34; Testes 20 de 153 = 13,07 por cento (peso 20), conta: 19 do estado anterior mais 1 de {TA-27} igual 20. Geral = 0,40 x 100 + 0,40 x 35,42 + 0,20 x 13,07 = 40 + 14,17 + 2,61 = 56,78 por cento, arredondado para 57 por cento. Atualização de 2026-09-15. {AUD-03} entregue e em produção (merge 8daaf7d, sem migração, backup lógico prévio em /opt/modularfit/backups/): duas contas de teste da Inspeção removidas em definitivo (inspecao-qa-20260906@ e inspecao-visual-20260907@), auditoria ganhando duas entradas excluir (origem ops/limpar-contas-de-teste) e nenhuma linha órfã em vínculo, consentimento, ficha ou e-mail; segunda rodada removeu zero. Onda AUD fica fora do denominador de 96 da Construção, por não ser uma das nove fases do Mapa de cobertura: Planejamento 28 de 28 = 100 por cento (peso 40); Construção permanece 34 de 96 = 35,42 por cento (peso 40); Testes permanece 20 de 153 = 13,07 por cento (peso 20). Geral permanece 0,40 x 100 + 0,40 x 35,42 + 0,20 x 13,07 = 40 + 14,17 + 2,61 = 56,78 por cento, arredondado para 57 por cento, inalterado. Atualização de 2026-09-15. {F3-05} entregue e em produção (merge 80c103e, migração 0028_execucao_da_sessao.sql, https://fit.modulareasy.com): execução da sessão de treino inteira, duas tabelas novas, décimo oitavo verificador, rota própria /treinos/sessao; {TA-28}, {TA-24} e {TA-20} fecham, {TA-21} continua aberto por ausência de mídia no catálogo (docs/seed/midia/, pendência do dono). Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 35 de 96 = 36,46 por cento (peso 40), conta: 34 do estado anterior mais 1 de {F3-05} igual 35; Testes 23 de 153 = 15,03 por cento (peso 20), conta: 20 do estado anterior mais 3 de {TA-28}, {TA-24} e {TA-20} igual 23. Geral = 0,40 x 100 + 0,40 x 36,46 + 0,20 x 15,03 = 40 + 14,58 + 3,01 = 57,59 por cento, arredondado para 58 por cento. Atualização de 2026-09-15. {F3-06} entregue e em produção (merge f21943f, sem migração, https://fit.modulareasy.com): cronômetro de descanso inteiramente web, fonte da verdade pelo instante de fim (nunca contador decrementado), aviso sonoro por Web Audio sem asset novo, ajuste +15 s e botão de pular, zero coluna, zero rota e zero migração novas. {TA-29} continua [ ], provada pela metade (a Nota declara qual). Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 36 de 96 = 37,50 por cento (peso 40), conta: 35 do estado anterior mais 1 de {F3-06} igual 36; Testes 23 de 153 = 15,03 por cento (peso 20), inalterado, {TA-29} não fecha inteiro. Geral = 0,40 x 100 + 0,40 x 37,50 + 0,20 x 15,03 = 40 + 15,00 + 3,01 = 58,01 por cento, arredondado para 58 por cento. Atualização de 2026-09-15. {F3-07} entregue e em produção (merge c331286, sem migração, última em produção continua 0028, https://fit.modulareasy.com, gates plan, qa e review verdes): histórico de sessões em /treinos/historico, bloco de evolução por exercício no resumo da execução e carga anterior durante a execução, os três pontos de entrega do card, com a progressão derivada na leitura em ponto único. {TA-30} continua [ ]: três das cinco cláusulas do Passa quando fecharam com dado real no smoke (variação exata, primeira medição, exercício só por tempo sem chip), a leitura pelo profissional vinculado e a conferência linha a linha de data e ficha por sessão não têm evidência no gate de qa. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 37 de 96 = 38,54 por cento (peso 40), conta: 36 do estado anterior mais 1 de {F3-07} igual 37; Testes 23 de 153 = 15,03 por cento (peso 20), inalterado, {TA-30} não fecha inteiro. Geral = 0,40 x 100 + 0,40 x 38,54 + 0,20 x 15,03 = 40 + 15,42 + 3,01 = 58,43 por cento, arredondado para 58 por cento.

Atualização de 2026-09-15. {F3-08} entregue e em produção (merge ce1787b, migração 0029_preferencia_treino.sql, https://fit.modulareasy.com, gates plan, db, qa e review verdes): preferências de treino do aluno, sete campos, três listas fechadas (oito objetivos, três níveis, vinte e seis equipamentos), tela /treinos/preferencias nos dois modos (edição do aluno, leitura somente do profissional vinculado) e ponto de entrada no cabeçalho de /treinos. {TA-31} fecha inteiro: as cinco cláusulas do Passa quando (dois objetivos, nível intermediário, cinco equipamentos, três dias, sessenta minutos) provadas ao vivo com screenshot batendo os valores salvos, mais a leitura do profissional vinculado confirmada na mesma rodada de qa. {TA-06} permanece [ ]: o placar do arnês de isolamento não foi impresso em nenhum dos gates desta rodada (plan, db, qa, review), Nota registrada no Plano de Testes nomeando a lacuna, sem número presumido. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 38 de 96 = 39,58 por cento (peso 40), conta: 37 do estado anterior mais 1 de {F3-08} igual 38; Testes 23 de 153 = 15,03 por cento (peso 20), inalterado: {TA-31} não fecha nesta rodada, o gate de qa (rodada 2, PASS) prova duas das cinco cláusulas acrescentadas pelo Drift 6 (a recusa por campo de objetivo e nível ausentes, e a ausência de leitura ao profissional sem vínculo), e não prova as outras três (os dois textos de até 2000 caracteres idênticos com o teto recusado, o valor fora da lista fechada e a duração fora da faixa ou do passo recusados, e desmarcar tudo aceito com reabertura vazia), Nota nominal no Plano de Testes nomeando a lacuna. Geral = 0,40 x 100 + 0,40 x 39,58 + 0,20 x 15,03 = 40 + 15,83 + 3,01 = 58,84 por cento, arredondado para 59 por cento, inalterado pelo arredondamento.

Atualização de 2026-09-15, escada de acesso. A Onda AUD ganha dois cards, {AUD-04} (papel Super Administrador separado do Administrador) e {AUD-05} (personificação com registro), os dois autorados abertos, nenhum entregue nesta data. O documento de requisitos foi republicado junto: RF-CORE-014 novo, RN-010 nova, ADR-017 novo, e os blocos B.1, B.4, B.5, B.6, D.2, D.5, E.1, C.1, o Apêndice de matriz e o Apêndice de catálogo de telas reconciliados. O total de cards deste roadmap passa de 125 para 127.

Reconciliação do denominador da Construção, e ela corrige um número que a prosa vinha declarando errado. As atualizações anteriores escreviam "Construção 38 de 96", contando as nove fases mais a Fase M e deixando a Onda AUD de fora. A barra publicada nunca contou assim: ela separa as duas seções pelo prefixo do código, Planejamento é o que começa por P0 e Construção é todo o resto, de modo que a Onda AUD sempre esteve dentro do denominador dela. Medido hoje pelo próprio serviço de estado do checklist: 125 cards, 28 de Planejamento e 97 de Construção, com 39 de Construção marcados (36 de fase, 2 da Fase M e {AUD-03}). Logo a prosa dizia 38 de 96, 39,58 por cento, e a barra mostrava 39 de 97, 40,21 por cento. A partir desta atualização a prosa passa a declarar o mesmo universo da barra, e quem quiser a leitura por fase continua tendo 38 de 96 nas nove fases mais a Fase M, fora a Onda AUD.

Aritmética desta data, conferida contra a marcação real do publicado. Planejamento 28 de 28 = 100 por cento (peso 40); Construção 39 de 99 = 39,39 por cento (peso 40), conta: 97 cards do estado anterior mais {AUD-04} e {AUD-05} igual a 99, marcados os mesmos 39; Testes 23 de 157 = 14,65 por cento (peso 20), conta: 153 cards do estado anterior mais {TA-90}, {TA-91}, {TA-92} e {TB-54} igual a 157, marcados os mesmos 23. Geral = 0,40 x 100 + 0,40 x 39,39 + 0,20 x 14,65 = 40 + 15,76 + 2,93 = 58,69 por cento, arredondado para 59 por cento. O geral não sobe porque nada foi entregue nesta data: o que mudou foi o universo, e universo que cresce sem entrega faz a barra descer, o que é o comportamento correto e se declara em vez de se esconder.

Atualização de 2026-09-15, fechamento de {F3-09}. Duplicação de ficha de terceiro como ficha própria entregue e em produção (merge e931e3b, migração 0030_duplicacao_da_ficha.sql, https://fit.modulareasy.com, gates plan, db, qa e review verdes). Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 40 de 99 = 40,40 por cento (peso 40), conta: 39 do estado anterior mais 1 de {F3-09} igual 40; Testes 25 de 157 = 15,92 por cento (peso 20), conta: 23 do estado anterior mais {TA-26} e {TA-32} igual 25. Geral = 0,40 x 100 + 0,40 x 40,40 + 0,20 x 15,92 = 40 + 16,16 + 3,18 = 59,34 por cento, arredondado para 59 por cento.

Atualização de 2026-09-29, fechamento de {AUD-05}. Personificação com registro entregue e em produção (merge 3dabc30, https://fit.modulareasy.com, migrações 0034, 0035 e 0036, gates plan, qa (rodada 2, PASS COM RESSALVAS) e review (APPROVED) verdes). O Super Administrador personifica um usuário a partir de /admin/usuarios, a faixa aparece em toda tela com o tempo vindo do servidor, a trilha ganha as entradas de início e de fim com o par personificador e personificado, e a saída, explícita ou por expiração, devolve a sessão do topo sem tela de entrada. Fica a ressalva nominal do qa: a tela /admin/usuarios nasceu mínima, com a busca e uma única ação, e só fecha como tela de gestão de usuários em {F7-14}; a tela de edição dos parâmetros personificacao_duracao_min e personificacao_aviso_min é de {AUD-06}, e hoje os dois valem como valor vivo em server/src/config.ts. Aritmética medida no publicado antes do flip: 130 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 41 de 102 = 40,20 por cento, e depois do flip 42 de 102 = 41,18 por cento (peso 40), conta: 41 marcados mais 1 de {AUD-05} igual 42; Testes 25 de 160 = 15,63 por cento, e depois do flip 26 de 160 = 16,25 por cento (peso 20), conta: 25 marcados mais {TA-91} igual 26, com {TB-54} aberto por ser Beta com operador real. Geral = 0,40 x 100 + 0,40 x 41,18 + 0,20 x 16,25 = 40 + 16,47 + 3,25 = 59,72 por cento, arredondado para 60 por cento. Os números de partida do gate (40 de 99 e 23 de 157) estavam velhos em relação ao publicado (130 cards, 41 de 102 e 25 de 160, por causa de {F3-09}, {AUD-06} a {AUD-08} e {TA-93} a {TB-55}), e a prosa declara os medidos.

Atualização de 2026-09-15, fechamento de {AUD-04}. Papel Super Administrador separado do Administrador entregue e em produção (merge 9aa10db, migrações 0031_papel_super_administrador.sql, 0032_escada_de_acesso.sql e 0033_promocao_das_contas_de_topo.sql, https://fit.modulareasy.com, gates plan, db, qa e review verdes). Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 41 de 99 = 41,41 por cento (peso 40), conta: 40 do estado anterior mais 1 de {AUD-04} igual 41; Testes permanece 25 de 157 = 15,92 por cento (peso 20), {TA-90} e {TA-92} não fecham nesta data, placares parciais nomeados no Plano de Testes (governança 4 de 7, lado positivo 7 de 10, fronteira 0 de 28). Geral = 0,40 x 100 + 0,40 x 41,41 + 0,20 x 15,92 = 40 + 16,56 + 3,18 = 59,74 por cento, arredondado para 60 por cento.


Atualização de 2026-09-29, fechamento de {AUD-06}. Parâmetros de operação editáveis entregues e em produção (merge 29380ae, https://fit.modulareasy.com, migrações 0037 e 0038, gates plan, qa (PASS COM RESSALVAS) e review (APPROVED na rodada 4) verdes): 28 linhas em mfit.parametro, ponto único de leitura, tela /admin/parametros e verificador com placar 79 de 101 (universo 148). A prosa do card, que dizia 100 pontos editáveis, passa a dizer 101. Aritmética medida no publicado antes do flip: 130 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 42 de 102 = 41,18 por cento, e depois do flip 43 de 102 = 42,16 por cento (peso 40), conta: 42 marcados mais {AUD-06} igual 43; Testes 26 de 160 = 16,25 por cento, e depois do flip 28 de 160 = 17,50 por cento (peso 20), conta: 26 marcados mais {TA-93} e {TA-94} igual 28, com {TB-55} aberto por ser Beta. Geral = 0,40 x 100 + 0,40 x 42,16 + 0,20 x 17,50 = 40 + 16,86 + 3,50 = 60,36 por cento, arredondado para 60 por cento.

Atualização de 2026-09-29, fechamento de {AUD-07}. Listas fechadas do catálogo migradas para a tabela editável, entregue e em produção (merge 7b47fa6, https://fit.modulareasy.com, migrações 0039 e 0040, gates plan, qa e review verdes): 52 itens em mfit.lista_fechada_item, os seis tipos enum removidos, tela /admin/listas e verificador com placar 70 de 100 (universo 147). Aritmética medida no publicado antes do flip: 130 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 43 de 102 = 42,16 por cento, e depois do flip 44 de 102 = 43,14 por cento (peso 40), conta: 43 marcados mais {AUD-07} igual 44; Testes 28 de 163 = 17,18 por cento, e depois do flip 29 de 163 = 17,79 por cento (peso 20), conta: 28 marcados mais {TA-95} igual 29, com {TB-56} aberto por ser Beta. Geral = 0,40 x 100 + 0,40 x 43,14 + 0,20 x 17,79 = 40 + 17,25 + 3,56 = 60,81 por cento, arredondado para 61 por cento.

Atualização de 2026-09-29, fechamento de {AUD-08}. Valores de negócio fora do catálogo entram no catálogo, entregue e em produção (merge fa725bc, https://fit.modulareasy.com, migração 0041, gates plan, qa (PASS COM RESSALVAS) e review (APPROVED) verdes): 14 linhas novas em mfit.parametro (42 no total), config.ts de 26 para 11 chaves, forma texto editável na tela de parâmetros e verificador com placar 52 de 98 (universo 146, 48 exceções C). A Onda AUD fecha inteira com este card: {AUD-03} a {AUD-08} entregues, e {AUD-01} e {AUD-02} já tinham entrado corrigidos pela migração 0025, sem card. Sem onda de correção aberta, o que resta na fila é a Fase 3 a partir de {F3-10}. Aritmética medida no publicado antes do flip: 130 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 44 de 102 = 43,14 por cento, e depois do flip 45 de 102 = 44,12 por cento (peso 40), conta: 44 marcados mais {AUD-08} igual 45; Testes 29 de 163 = 17,79 por cento, e depois do flip 30 de 163 = 18,40 por cento (peso 20), conta: 29 marcados mais {TA-96} igual 30, com {TB-55} aberto por ser Beta. Geral = 0,40 x 100 + 0,40 x 44,12 + 0,20 x 18,40 = 40 + 17,65 + 3,68 = 61,33 por cento, arredondado para 61 por cento.

Atualização de 2026-09-29, fechamento de {F3-10}. Retomada de sessão em andamento e regra de abandono, entregue e em produção (merge 047f3bc, https://fit.modulareasy.com, migração 0042, gates plan, qa (PASS COM RESSALVAS) e review (APPROVED) verdes): atalho de retomar no painel e em /treinos, prazo de abandono lido de sessao_abandono_horas, passagem a abandonada por escritor único com rotina horária para quem nunca volta, e placar de transições da sessão em 5 de 5. A Fase 3 fecha com este card: {F3-01} a {F3-10} entregues. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 130 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 45 de 102 = 44,12 por cento, e depois do flip 46 de 102 = 45,10 por cento (peso 40), conta: 45 marcados mais {F3-10} igual 46; Testes 33 de 163 = 20,25 por cento, e depois do flip 34 de 163 = 20,86 por cento (peso 20), conta: 33 marcados (30 Alfa e 3 Beta) mais {TA-79} igual 34. Geral = 0,40 x 100 + 0,40 x 45,10 + 0,20 x 20,86 = 40 + 18,04 + 4,17 = 62,21 por cento, arredondado para 62 por cento. O parágrafo anterior citava Testes 30 de 163: a contagem de então não incluía três cartões Beta já marcados, que o endpoint hoje soma.

Atualização de 2026-09-30, fechamento de {F4-01}. Registro de refeição com somatório de macronutrientes entregue e em produção (merge 5e36145, migração 0043, https://fit.modulareasy.com, gates plan, qa (PASS COM RESSALVAS, rodada 2 PASS) e review (APPROVED na rodada 3) verdes): primeira tabela da fronteira de dado clínico, fronteira em 1 de 13, lista tipo_refeicao com 8 itens, 44 parâmetros, placar de parâmetros 52 de 98 com C 51 e universo 149. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 130 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 46 de 102 = 45,10 por cento, e depois do flip 47 de 102 = 46,08 por cento (peso 40), conta: 46 marcados mais {F4-01} igual 47; Testes 34 de 163 = 20,86 por cento, e depois do flip 35 de 163 = 21,47 por cento (peso 20), conta: 34 marcados mais {TA-33} igual 35. Geral = 0,40 x 100 + 0,40 x 46,08 + 0,20 x 21,47 = 40 + 18,43 + 4,29 = 62,72 por cento, arredondado para 63 por cento. Nenhum card novo nasce: continuam 130 cards no Roadmap e 163 no Plano de Testes.

Atualização de 2026-09-30, fechamento de {F4-02}. Metas nutricionais por aluno entregues e em produção (merge b569460, migração 0044, https://fit.modulareasy.com, gates plan (APPROVED com trava de drift), qa (PASS COM RESSALVAS, reconferido na rodada 2) e review (APPROVED na rodada 2) verdes): tabela meta_nutricional só de acréscimo, bloco "Metas do dia" e formulário "Meta nutricional" em /nutricao, leitura do dia pelo Profissional vinculado em /nutricao?aluno=, mfit.meta_vigente como ponto único da meta do dia e primeiro auxiliar de capacidade por especialidade, fronteira de dado clínico em 2 de 13, placar de parâmetros 52 de 98 com C 53 e universo 151, e metas_padrao com o primeiro consumidor. {TA-34} fica [ ] com 3 de 4 cláusulas provadas; a quarta, a comparação do painel com a meta, é de {F4-04}. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 131 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 47 de 103 = 45,63 por cento, e depois do flip 48 de 103 = 46,60 por cento (peso 40), conta: 47 marcados mais {F4-02} igual 48; Testes 35 de 164 = 21,34 por cento (peso 20), inalterado, porque {TA-34} continua aberto e {TB-06} é Beta. Geral = 0,40 x 100 + 0,40 x 46,60 + 0,20 x 21,34 = 40 + 18,64 + 4,27 = 62,91 por cento, arredondado para 63 por cento, inalterado pelo arredondamento. Próximo da fila: {AUD-09}, depois {F4-03}. Nenhum card novo nasce: continuam 131 cards no Roadmap e 164 no Plano de Testes.

Atualização de 2026-09-30, fechamento de {AUD-09}. Especialidade aplicada na ficha de treino entregue e em produção (merge d760b2d, migração 0045, https://fit.modulareasy.com, gates plan, db, qa (PASS COM RESSALVAS) e review (APPROVED na rodada 2) verdes): Médico e Nutricionista deixam de criar, duplicar, editar, desativar, reativar, atender e recusar ficha de treino, e o aluno deixa de abrir pedido a eles; verificador de capacidade por especialidade de 1 de 7 para 7 de 7; contagem do Drift 4 zero. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 133 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 48 de 105 = 45,71 por cento, e depois do flip 49 de 105 = 46,67 por cento (peso 40), conta: 48 marcados mais {AUD-09} igual 49; Testes 35 de 166 = 21,08 por cento, e depois do flip 36 de 166 = 21,69 por cento (peso 20), conta: 35 marcados mais {TA-97} igual 36. Geral = 0,40 x 100 + 0,40 x 46,67 + 0,20 x 21,69 = 40 + 18,67 + 4,34 = 63,01 por cento, arredondado para 63 por cento. Próximo da fila: {AUD-11}, depois {AUD-10} e {F4-03}. Nenhum card novo nasce: continuam 133 cards no Roadmap e 166 no Plano de Testes.

Atualização de 2026-09-15, {AUD-06}. A Onda AUD ganha o quarto card, {AUD-06} (parâmetros de operação editáveis pelo Super Administrador), autorado aberto, reconciliando o Drift 1 do gate modularfit-AUD-06 (dono de {ART-CFG-01} confirmado). O documento de requisitos foi republicado junto: RF-PAIN-011 novo, e o total de RFs do DRS passa de 90 para

  1. O total de cards deste roadmap passa de 127 para 128, com a Construção passando de 99

para 100 cards, 41 marcados, inalterado. O Plano de Testes ganha os cards {TA-93}, {TA-94} e {TB-55}, passando de 157 para 160 cards, 25 marcados, inalterado. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 41 de 100 = 41,00 por cento (peso 40), inalterada em marcação; Testes 25 de 160 = 15,63 por cento (peso 20), inalterada em marcação. Geral = 0,40 x 100 + 0,40 x 41,00 + 0,20 x 15,63 = 40 + 16,40 + 3,13 = 59,53 por cento, arredondado para 60 por cento, o mesmo arredondamento de antes. O geral não sobe nem desce de fato: o que mudou foi o universo, ampliado pela reconciliação do gate, não a entrega.

Atualização de 2026-09-15, reconciliação {AUD-06} (Passo 1 e 2 do gate). Cinco drifts P0 e um P1 novos, achados só depois do publicado (seção 8.2 do gate modularfit-AUD-06), fecham nesta republicação: B.1 do DRS passa de sete para oito capacidades privativas (manter o catálogo de parâmetros de operação, RF-PAIN-011), B.6 de 41/20/21 para 42/20/22, o Apêndice Matriz Ator por Capacidade de 47 para 48 linhas, e {TA-92} republicado com os números novos e a nota de que a metade documental, fechada em {AUD-04}, reabre e refecha aqui. {ART-CFG-02} nasce no Inventário, o ponto único de leitura que RF-PAIN-011 e {TA-94} já citavam sem ele existir. {ART-CFG-01} corrige a unidade de email_tentativas_recuo (o documento publicava segundos onde o código lê minutos) e de url_assinada_validade (conversão declarada no ponto único), dá faixa verificável às sete células que diziam "livre" ou "conforme operação", tira listas_fechadas e consentimento_textos de mfit.parametro com dono nominal, e ganha a linha personificacao_aviso_min, subindo de 31 para 32 parâmetros. A Onda AUD ganha dois cards, {AUD-07} (listas fechadas do catálogo saem das sete constantes para o ponto único) e {AUD-08} (os dezessete valores de negócio fora do catálogo entram em {ART-CFG-01} ou em mfit.texto_versionado, com destino nomeado um a um), os dois autorados abertos. Nenhum RF novo nasce nesta reconciliação (RF-PAIN-011 já contava desde a republicação anterior; o total de RFs do DRS permanece 91). O total de cards deste roadmap passa de 128 para 130, com a Construção passando de 100 para 102 cards, 41 marcados, inalterado. Aritmética: Planejamento 28 de 28 = 100 por cento (peso 40); Construção 41 de 102 = 40,20 por cento (peso 40), inalterada em marcação; Testes 25 de 160 = 15,63 por cento (peso 20), inalterada em marcação. Geral = 0,40 x 100 + 0,40 x 40,20 + 0,20 x 15,63 = 40 + 16,08 + 3,13 = 59,21 por cento, arredondado para 59 por cento. O geral desce um ponto de arredondamento porque o universo cresceu (dois cards novos na Construção) sem entrega nova, o que é o comportamento correto e se declara em vez de se esconder.

Atualização de 2026-09-29, reconciliação {AUD-07} (gate modularfit-AUD-07, seção 1). Os drifts ratificados pelo Fiscal fecham nesta republicação. São seis as listas fechadas com consumidor (não cinco), e as quatro sem módulo nascem na mesma tabela pelos cards {F4-01}, {F5-02}, {F5-04} e {F5-08}, que ganham uma linha cada. tipoConteudo.ts é reclassificado de B para C e o denominador de editáveis cai de 101 para 100. O H1 e o Como verificar de {AUD-07} passam a dizer que os dois CHECK de teto são derrubados por migração posterior e que o verificador reconhece restrição derrubada. O Plano de Testes ganha {TA-95} e {TB-56}, ambos abertos, e passa de 160 para 162 cards, 28 marcados: Testes 28 de 162 = 17,28 por cento (peso 20). Nenhum card novo nasce neste roadmap: continuam 130 cards, 71 marcados, sem nenhuma marcação alterada.

Atualização de 2026-09-29, Inspeção: card {AUD-09}. Os drifts ratificados do gate modularfit-F4-02 (seção 1) entram como Notas nos cards {F4-02}, {F4-04} e {F4-05}, e o Drift 7 vira um card novo da Onda AUD, {AUD-09} (Especialidade aplicada na ficha de treino: criar, duplicar, atender solicitação), autorado aberto, depois de {AUD-08}. Achado do loop, triado pela Inspeção: a Matriz Ator por Capacidade dá N a Médico e Nutricionista em três capacidades de ficha de treino e, em produção, os dois criam ficha hoje. O card depende de {F4-02}, entra na fila depois dele e antes de {F4-03}, e a Onda AUD, dada por fechada na Atualização de {AUD-08}, reabre com ele. Nenhum RF novo nasce e nenhuma marcação muda. Aritmética medida no publicado antes desta republicação: 130 cards, 75 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 47 de 102 = 46,08 por cento (peso 40); Testes 35 de 163 = 21,47 por cento (peso 20). Depois, com {AUD-09} e {TA-97} abertos: 131 cards, 75 marcados; Construção 47 de 103 = 45,63 por cento, conta: 102 mais {AUD-09} igual 103, marcados inalterados; Testes 35 de 164 = 21,34 por cento, conta: 163 mais {TA-97} igual 164. Geral = 0,40 x 100 + 0,40 x 45,63 + 0,20 x 21,34 = 40 + 18,25 + 4,27 = 62,52 por cento, arredondado para 63 por cento (antes, 62,73, também 63). O geral cai 0,21 ponto porque o universo cresceu (um card em cada seção) sem entrega nova, o que se declara em vez de se esconder.

Atualização de 2026-09-30, Inspeção: cards {AUD-11} e {AUD-10}. Duas decisões de escopo da Inspeção entram como cards novos da Onda AUD, autorados abertos. {AUD-11}: nutrição passa a ser a sétima categoria de consentimento de RF-CORE-010, com RN-001, E.1 e o módulo diet alinhados no DRS, porque o próprio DRS já classifica nutrição como dado clínico na fronteira da administração e a lista de seis categorias ficou incoerente com isso; medido pelo loop em 30/09, refeicao e meta_nutricional estão marcadas não sensíveis no registro de entidades e um Personal Trainer vinculado sem consentimento lê as duas com 200. {AUD-10}: os onze e-mails transacionais passam a ter modelo editável pelo Super Administrador, assunto e corpo com variáveis validadas no servidor, em tabela própria com versões e tela /admin/emails (extensão de RF-PAIN-011), cumprindo a ordem do dono de 15/09 de que toda regra de negócio seja configurável pelo painel de Super Administrador; os onze assuntos de mfit.parametro migram para lá. Ordem da fila da Onda AUD: {AUD-09} (em curso), depois {AUD-11}, depois {AUD-10}, e só então {F4-03}; os cards aparecem nesta ordem no documento, e a fila pega o primeiro aberto da onda. {AUD-11} vem antes de {F4-03} porque plano_alimentar nasce já sob a categoria nutrição. Nenhum RF novo nasce (RF-CORE-010 e RF-PAIN-011 são estendidos) e nenhuma marcação muda. Aritmética medida no publicado antes desta republicação (contagem de cartões no texto, igual à do endpoint de estado): 131 cards, 76 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 48 de 103 = 46,60 por cento (peso 40); Testes 35 de 164 = 21,34 por cento (peso 20); geral 62,91 por cento. Depois, com {AUD-11} e {AUD-10} abertos neste documento e {TA-98} e {TA-99} abertos no Plano de Testes: 133 cards, 76 marcados; Construção 48 de 105 = 45,71 por cento, conta: 103 mais {AUD-11} mais {AUD-10} igual 105, marcados inalterados; Testes 35 de 166 = 21,08 por cento, conta: 164 mais {TA-98} mais {TA-99} igual 166. Geral = 0,40 x 100 + 0,40 x 45,71 + 0,20 x 21,08 = 40 + 18,29 + 4,22 = 62,51 por cento, arredondado para 63 por cento (antes, 62,91, arredondado para 63). O geral cai porque o universo cresceu dois cards em cada seção sem entrega nova, o que se declara em vez de se esconder.

Atualização de 2026-09-30, Inspeção: drifts do gate de {AUD-10}. Notas nos cards {AUD-10} (migração 0048, versão vigente derivada, endereço proibido no assunto, trilha legível, prévia para os dois papéis, ortografia, HTML de dois modelos e rastro da prova em produção), {AUD-12} (numera depois da 0048) e {F4-03} (a 0048 não é dele). Nenhum card novo, nenhuma marcação alterada.

Atualização de 2026-09-30, Inspeção: drifts do gate de {AUD-11}. Notas nos cards {AUD-11} (duas migrações, 0046 e 0047, e {F4-03} passa a 0048; leitor único por entidade; desativar refeição após revogar; onde vivem os textos; a restrição governa a escrita da meta), {F1-12} (a leitura de que a restrição só governa a leitura fica superada em 2026-09-30) e {F4-03} (migração 0048, categoria decidida, leitorUnico e inserção com visibilidade). Nenhum card novo, nenhuma marcação alterada.

Atualização de 2026-09-30, Inspeção: card {AUD-12}. Uma decisão de escopo da Inspeção entra como card novo da Onda AUD, autorado aberto: {AUD-12}, Textos de consentimento editáveis e versionados. Cumpre a ordem do dono de 15/09 de que toda regra de negócio seja configurável pelo painel de Super Administrador e estende RF-CORE-010 e RF-CORE-012 sem RF novo: os sete textos de consentimento passam a viver no mecanismo de texto versionado que existe desde {F1-18}, a concessão grava a versão exibida ao aluno, e a rota de consentimentos devolve restrito_a_especialidades como lista. Ordem da fila da Onda AUD: {AUD-11}, depois {AUD-10}, depois {AUD-12}, e só então {F4-03}; o card aparece nesta ordem no documento. Nenhuma marcação muda. Aritmética medida no publicado antes desta republicação (contagem de cartões no endpoint de estado): 133 cards, 77 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 49 de 105 = 46,67 por cento (peso 40); Testes 36 de 166 = 21,69 por cento (peso 20); geral 63,01 por cento. Depois, com {AUD-12} aberto neste documento e {TA-100} aberto no Plano de Testes: 134 cards, 77 marcados; Construção 49 de 106 = 46,23 por cento, conta: 105 mais {AUD-12} igual 106, marcados inalterados; Testes 36 de 167 = 21,56 por cento, conta: 166 mais {TA-100} igual 167. Geral = 0,40 x 100 + 0,40 x 46,23 + 0,20 x 21,56 = 40 + 18,49 + 4,31 = 62,80 por cento, arredondado para 63 por cento (antes, 63,01, também 63). O geral cai porque o universo cresceu um card em cada seção sem entrega nova, o que se declara em vez de se esconder.

Atualização de 2026-09-30, fechamento de {AUD-11}. Nutrição como sétima categoria de consentimento entregue e em produção (merge 6490072, https://fit.modulareasy.com, migrações 0046 e 0047, gates plan, db, qa (PASS, {TA-98} 61 de 61) e review (APPROVED) verdes): leitor único 2 de 10, consentimento por entidade 2 de 10, critério (h) 7 = 7, e profissional vinculado sem consentimento de nutrição deixa de ler refeição e meta (403 nomeado, nunca 200 vazio). Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 134 cards, 77 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 49 de 106 = 46,23 por cento, e depois do flip 50 de 106 = 47,17 por cento (peso 40), conta: 49 marcados mais {AUD-11} igual 50; Testes 36 de 167 = 21,56 por cento, e depois do flip 37 de 167 = 22,16 por cento (peso 20), conta: 36 marcados mais {TA-98} igual 37. Geral = 0,40 x 100 + 0,40 x 47,17 + 0,20 x 22,16 = 40 + 18,87 + 4,43 = 63,30 por cento, arredondado para 63 por cento (antes, 62,80, também 63). Próximo da fila: {AUD-10}, depois {AUD-12} e {F4-03}. Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes.

Atualização de 2026-09-30, fechamento de {AUD-10}. Modelos de e-mail editáveis entregues e em produção (merge 17b62d6, migrações 0048 e 0049, https://fit.modulareasy.com, /api/estado na versão 17b62d6; gates plan, db, qa (PASS COM RESSALVAS, {TA-99} 12 de 12, rotas 38 de 38) e review (APPROVED) verdes): mfit.parametro de 44 para 33, texto de e-mail em código de 11 para 0, placar do verificador de parâmetros inalterado em 52 de 98, C 53, universo 151, perda declarada e ressalvas no cartão. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 134 cards, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 50 de 106 = 47,17 por cento, e depois do flip 51 de 106 = 48,11 por cento (peso 40), conta: 50 marcados mais {AUD-10} igual 51; Testes 37 de 167 = 22,16 por cento, e depois do flip 38 de 167 = 22,75 por cento (peso 20), conta: 37 marcados mais {TA-99} igual 38. Geral = 0,40 x 100 + 0,40 x 48,11 + 0,20 x 22,75 = 40 + 19,24 + 4,55 = 63,79 por cento, arredondado para 64 por cento (antes, 63,30, arredondado para 63). Próximo da fila: {AUD-12}, depois {F4-03}. Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes.

Atualização de 2026-09-30, fechamento de {AUD-12}. Textos de consentimento editáveis e versionados entregues (merge 4e5ed26, migrações 0050 e 0051; o qa provou em produção na versão 53c7fd2, mesmo código do merge; gates plan, db, qa (PASS COM RESSALVAS, {TA-100} 27 de 27) e review (APPROVED) verdes): texto de consentimento em código de 7 para 0, verifica-parametros em 51 de 98, C 54, universo 152, perda declarada e ressalvas no cartão. A Onda AUD não fecha com este card: continua com {F4-03} na fila. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 134 cards, 79 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 51 de 106 = 48,11 por cento, e depois do flip 52 de 106 = 49,06 por cento (peso 40), conta: 51 marcados mais {AUD-12} igual 52; Testes 38 de 167 = 22,75 por cento, e depois do flip 39 de 167 = 23,35 por cento (peso 20), conta: 38 marcados mais {TA-100} igual 39. Geral = 0,40 x 100 + 0,40 x 49,06 + 0,20 x 23,35 = 40 + 19,62 + 4,67 = 64,29 por cento, arredondado para 64 por cento (antes, 63,79, também 64). Próximo da fila: {F4-03}. Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes.

Atualização de 2026-09-30, fechamento de {F4-03}. Plano alimentar prescrito com refeições estruturadas entregue e em produção (merge 2f5c560, migração 0052, https://fit.modulareasy.com, /api/estado na versão 2f5c560; gates plan (APPROVED, releitura contra 4e5ed26), db (PASS), qa (PASS COM RESSALVAS, rodada 2 PASS) e review (APPROVED na rodada 2) verdes): tela /nutricao/planos nas duas pontas, plano criado pelo Nutricionista de vínculo ativo ou pelo aluno sem Nutricionista ativo, refeições na ordem de horário e calorias somadas pelo banco, edição só pelo autor e pelo Super Administrador. Placares medidos: fronteira de dado clínico 3 de 13, consentimento por entidade 3 de 10, leitor único 3 de 10, capacidade por especialidade 12 de 12, 5 de 5 tabelas de nutrição, verifica-parametros inalterado em 51 de 98, C 54, universo 152, cardinalidade 33 e listas 7. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 134 cards, 80 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 52 de 106 = 49,06 por cento, e depois do flip 53 de 106 = 50,00 por cento (peso 40), conta: 52 marcados mais {F4-03} igual 53; Testes 39 de 167 = 23,35 por cento, e depois do flip 40 de 167 = 23,95 por cento (peso 20), conta: 39 marcados mais {TA-35} igual 40, com {TB-38} aberto por ser Beta. Geral = 0,40 x 100 + 0,40 x 50,00 + 0,20 x 23,95 = 40 + 20,00 + 4,79 = 64,79 por cento, arredondado para 65 por cento (antes, 64,29, arredondado para 64). Próximo da fila: {F4-04}. Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes.

Atualização de 2026-09-30, Inspeção: drifts do gate de {F4-04}. Nota no card {F4-05} (a função mfit.comparacao_com_meta, migração 0053, como regra única da comparação do consumo com a meta, consumida por {F4-05}). Nenhum card novo e nenhuma marcação alterada: continuam 134 cards e 81 marcados, medidos na contagem de cards antes e depois.

Atualização de 2026-09-30, fechamento de {F4-04}. Painel diário de consumo contra a meta entregue e em produção (merge a6624e9, migração 0053, https://fit.modulareasy.com; gates plan (APPROVED COM TRAVA DE DRIFT), db (PASS), qa (PASS COM RESSALVAS, reconferência PASS) e review (APPROVED na rodada 3) verdes): quatro cartões e o total do dia em "Metas do dia", regra única da comparação em mfit.comparacao_com_meta, verificador da fronteira e de vínculo com chamada positiva obrigatória e PATCH concorrente de plano com 409. {TA-34} fecha 4 de 4 com a quarta cláusula deste card. Placares medidos: fronteira 3 de 13, consentimento por entidade 3 de 10, leitor único 3 de 10, capacidade por especialidade 12 de 12, verifica-parametros inalterado em 51 de 98, C 54, universo 152. Aritmética medida no publicado antes do flip (contagem de cartões no endpoint de estado): 134 cards, 81 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 53 de 106 = 50,00 por cento, e depois do flip 54 de 106 = 50,94 por cento (peso 40), conta: 53 marcados mais {F4-04} igual 54; Testes 40 de 167 = 23,95 por cento, e depois do flip 42 de 167 = 25,15 por cento (peso 20), conta: 40 marcados mais {TA-36} e {TA-34} igual 42, com {TB-39} e {TB-06} abertos por serem Beta. Geral = 0,40 x 100 + 0,40 x 50,94 + 0,20 x 25,15 = 40 + 20,38 + 5,03 = 65,41 por cento, arredondado para 65 por cento (antes, 64,79, também 65). Próximo da fila: {F4-05}. Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes.

Atualização de 2026-09-30, Inspeção: drifts do gate de {F4-05}. Notas nos cards {F4-05} (a migração 0054, a função mfit.meta_atingida e o parâmetro nutricao_meta_tolerancia_pct, a entregar, e a regra do acompanhamento publicada em RF-DIET-005) e {F5-07} (o bloco de peso e composição do acompanhamento nasce lá). Nenhum card novo e nenhuma marcação alterada: continuam 134 cards e 82 marcados, medidos na contagem de cards do texto antes e depois.

Atualização de 2026-10-01, fechamento de {F4-05}. Acompanhamento nutricional pelo profissional entregue e em produção (merge f609a9c, migrações 0054 e 0055, https://fit.modulareasy.com; gates plan, db, qa e review verdes). A Fase 4 fecha em código: os cinco cards {F4-01} a {F4-05} estão entregues. Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 134 cards, 82 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 54 de 106 = 50,94 por cento, e depois do flip 55 de 106 = 51,89 por cento (peso 40), conta: 54 marcados mais {F4-05} igual 55; Testes 42 de 167 = 25,15 por cento, e depois do flip 43 de 167 = 25,75 por cento (peso 20), conta: 42 marcados mais {TA-37} igual 43. Geral = 0,40 x 100 + 0,40 x 51,89 + 0,20 x 25,75 = 40 + 20,75 + 5,15 = 65,90 por cento, arredondado para 66 por cento (antes, 65,41, arredondado para 65). Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes. Próximo da fila: {F5-01}.

Atualização de 2026-10-01, Inspeção: drifts do gate de {F5-01}. Notas nos cards {F5-01} (migração 0056 e os dois tetos de texto da anamnese, a entregar; a ficha dos 46 campos; quem preenche qual seção; anamnese sem edição de conteúdo; o leitor único do módulo) e {F5-04}, {F5-05} e {F5-06} (a aba nasce dentro da casca de /saude). A decisão de produto está publicada no DRS (RF-SAUD-001, RN-009, L.2 e Apêndice de formulários). Nenhum card novo e nenhuma marcação alterada: continuam 134 cards e 83 marcados, medidos na contagem de cards do texto antes e depois.

Atualização de 2026-10-01, fechamento de {F5-01}. Anamnese datada entregue e em produção (merge 9cb16f3, repositório wladimirdjr/modularfit, migração 0056, https://fit.modulareasy.com (/api/estado na versão 9cb16f3); gates plan, db, qa e review verdes). A Fase 5 abre: {F5-01} entregue, {F5-02} a {F5-10} seguem abertos. Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 134 cards, 83 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 55 de 106 = 51,89 por cento, e depois do flip 56 de 106 = 52,83 por cento (peso 40), conta: 55 marcados mais {F5-01} igual 56; Testes 43 de 167 = 25,75 por cento, e depois do flip 44 de 167 = 26,35 por cento (peso 20), conta: 43 marcados mais {TA-38} igual 44. Geral = 0,40 x 100 + 0,40 x 52,83 + 0,20 x 26,35 = 40 + 21,13 + 5,27 = 66,40 por cento, arredondado para 66 por cento (antes, 65,90, também 66). Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes. Próximo da fila: {F5-02}.

Atualização de 2026-10-06, fechamento de {F5-02}. Avaliação física em seis seções, com comparação entre avaliações, entregue e em produção (merge 3ab8395, repositório wladimirdjr/modularfit, migrações 0057 e 0058 aplicadas em produção em 06/10, https://fit.modulareasy.com (/api/estado na versão 87ae8e0, a mesma árvore do merge; o deploy da main em 3ab8395 segue em curso); gates plan, db, qa e review verdes: o qa reprovou a rodada 1 por um P1 e passou no reteste). A Fase 5 segue: {F5-01} e {F5-02} entregues, {F5-03} a {F5-10} seguem abertos. Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 134 cards, 84 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 56 de 106 = 52,83 por cento, e depois do flip 57 de 106 = 53,77 por cento (peso 40), conta: 56 marcados mais {F5-02} igual 57; Testes 44 de 167 = 26,35 por cento, e depois do flip 45 de 167 = 26,95 por cento (peso 20), conta: 44 marcados mais {TA-39} igual 45. Geral = 0,40 x 100 + 0,40 x 53,77 + 0,20 x 26,95 = 40 + 21,51 + 5,39 = 66,90 por cento, arredondado para 67 por cento (antes, 66,40, que arredondava para 66). Nenhum card novo nasce: continuam 134 cards no Roadmap e 167 no Plano de Testes. A migração 0058 (CHECK estrito de secoes da anamnese) foi aprovada pelo Fiscal sem card próprio e entra no fechamento de {F5-02}. Próximo da fila: {F5-03}.

Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-03} e card {AUD-13}. Notas publicadas antes do código no card {F5-03} (Drifts 1 a 6 e o P2 visual), nas Notas de RF-SAUD-002, RF-SAUD-003 e RN-004 do DRS e no cartão {ART-FORM-05} do Inventário, sem marcar entrega: o cálculo aparece no detalhe e na comparação, com a lista de fora; as constantes de literatura entram no verificador como exceção C nomeada; as zonas ficam fora da comparação; o cálculo sem insumo diz "não calculado" e nunca zero; o arredondamento é meio para cima; e o corpo inválido responde 400 corpo_invalido. Um card novo da Onda AUD entra autorado aberto: {AUD-13}, Corpo de requisição inválido responde 400 em todas as rotas, com a ordem declarada "depois de {F5-03}, antes de {F5-04}"; no Plano de Testes entra {TA-101}, aberto. Nenhuma marcação muda. Aritmética medida no publicado antes desta republicação (contagem de cartões do texto): 134 cards, 85 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 57 de 106 = 53,77 por cento (peso 40); Testes 45 de 167 = 26,95 por cento (peso 20); geral 66,90 por cento. Depois, com {AUD-13} aberto neste documento e {TA-101} aberto no Plano de Testes: 135 cards, 85 marcados; Construção 57 de 107 = 53,27 por cento, conta: 106 mais {AUD-13} igual 107, marcados inalterados; Testes 45 de 168 = 26,79 por cento, conta: 167 mais {TA-101} igual 168. Geral = 0,40 x 100 + 0,40 x 53,27 + 0,20 x 26,79 = 40 + 21,31 + 5,36 = 66,67 por cento (antes, 66,90). O geral cai porque o universo cresceu um card em cada seção sem entrega nova, o que se declara em vez de se esconder.

Atualização de 2026-10-06, fechamento de {F5-03}. Cálculos derivados da avaliação entregues e em produção (merge 08b35ed, repositório wladimirdjr/modularfit, sem migração, https://fit.modulareasy.com (a mesma árvore já provada em produção como 208a883; o deploy da main em 08b35ed segue em curso); gates plan, review e qa verdes): índice de massa corporal, relação cintura quadril, frequência cardíaca máxima e as cinco zonas, calculados na leitura com a fórmula visível, nenhum gravado; H1 provado (24,7, 0,90, 190 e as zonas 95 a 114 até 171 a 190); 400 corpo_invalido em avaliações e anamneses (o restante das rotas é {AUD-13}); e subgrid nas listas clínicas com degrau 0 em 6 larguras. {AUD-13} segue aberto. Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 135 cards, 85 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 57 de 107 = 53,27 por cento, e depois do flip 58 de 107 = 54,21 por cento (peso 40), conta: 57 marcados mais {F5-03} igual 58; Testes 45 de 168 = 26,79 por cento, e depois do flip 46 de 168 = 27,38 por cento (peso 20), conta: 45 marcados mais {TA-40} igual 46. Geral = 0,40 x 100 + 0,40 x 54,21 + 0,20 x 27,38 = 40 + 21,68 + 5,48 = 67,16 por cento, arredondado para 67 por cento (antes, 66,67). Nenhum card novo nasce: continuam 135 cards no Roadmap e 168 no Plano de Testes. Próximo da fila: {AUD-13}, depois {F5-04}.

Atualização de 2026-10-06, fechamento de {AUD-13}. Corpo de requisição inválido responde 400 em todas as rotas, entregue e em produção (merge 1c32c5e, repositório wladimirdjr/modularfit, sem migração, https://fit.modulareasy.com (a mesma árvore já provada em produção como ecef515; o deploy da main em 1c32c5e segue em curso); gates plan, review e qa verdes): ponto único server/src/http/corpoJson.ts, placar 52 = 37 JSON + 1 multipart + 14 sem corpo, tabela 38 = 38 no ponto único, 0 leituras fora, verificador verificar:corpo com 13 decoys; H1 provado em produção ({TA-101}); perdas ratificadas no card. Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 135 cards, 86 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 58 de 107 = 54,21 por cento, e depois do flip 59 de 107 = 55,14 por cento (peso 40), conta: 58 marcados mais {AUD-13} igual 59; Testes 46 de 168 = 27,38 por cento, e depois do flip 47 de 168 = 27,98 por cento (peso 20), conta: 46 marcados mais {TA-101} igual 47. Geral = 0,40 x 100 + 0,40 x 55,14 + 0,20 x 27,98 = 40 + 22,056 + 5,595 = 67,65 por cento, arredondado para 68 por cento (antes, 67,16, que arredondava para 67). Nenhum card novo nasce: continuam 135 cards no Roadmap e 168 no Plano de Testes. Próximo da fila: {F5-04}.

Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-04}. Notas publicadas antes do código no card {F5-04} (Drifts 1 a 11 e a migração 0059), no card {F5-09} (Drift 1) e no card {F6-05} (Drift 5); nas Notas de RF-SAUD-004 e de RN-009, no Apêndice de formulários e em L.2 do DRS; nos cartões {ART-ENT-06}, {ART-FORM-07}, {ART-INT-02}, {ART-ACS-08}, {ART-ACS-10} e {ART-CFG-01} do Inventário; e, no Plano de Testes, em {TA-41} (os casos de prova) e nas Notas de placar parcial de {TA-07}, {TA-10} e {TA-85}, sem marcar entrega. Nenhum card novo e nenhuma marcação alterada: continuam 135 cards e 87 marcados, medidos na contagem de cards do texto antes e depois.

Atualização de 2026-10-06, fechamento de {F5-04}. Exames com anexo em repositório privado entregues e em produção (merge b078e76, repositório wladimirdjr/modularfit, migração 0059 aplicada em produção em 06/10, limite de envio de 51 megabytes só no bloco do servidor do produto, https://fit.modulareasy.com (a mesma árvore já provada em produção como bde96b3; o deploy da main em b078e76 segue em curso); gates plan, db, review e qa verdes): tabela mfit.exame, ramo anexos_megabytes na cota, três tetos de texto como parâmetros (parâmetros de 38 para 41), lista tipo_exame (listas de 8 para 9), escrita única de arquivos e aba Exames na casca de /saude; H1 provado em produção ({TA-41}: 20 MiB exatos abrem por endereço assinado, 20 MiB mais um byte e extensão fora da lista são recusados com a mensagem do campo). {F5-09}, {F6-05}, {F5-10}, {F5-08} e {F8-09} seguem abertos. Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 135 cards, 87 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 59 de 107 = 55,14 por cento, e depois do flip 60 de 107 = 56,07 por cento (peso 40), conta: 59 marcados mais {F5-04} igual 60; Testes 47 de 168 = 27,98 por cento, e depois do flip 48 de 168 = 28,57 por cento (peso 20), conta: 47 marcados mais {TA-41} igual 48. Geral = 0,40 x 100 + 0,40 x 56,07 + 0,20 x 28,57 = 40 + 22,43 + 5,71 = 68,14 por cento, arredondado para 68 por cento (antes, 67,65, que arredondava para 68). Nenhum card novo nasce: continuam 135 cards no Roadmap e 168 no Plano de Testes. Próximo da fila: {F5-05}.

Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-05}. Notas publicadas antes do código no card {F5-05} (Drifts 1 a 10 e as migrações 0060 e 0061), nos cards {F5-10} (Drift 2), {F6-05} (Drift 3) e {F7-09} (Drift 7); nas Notas de RF-SAUD-005, de RN-009 e de L.2, em E.1 e no Apêndice de formulários do DRS; nos cartões {ART-FORM-08} e {ART-CFG-01} do Inventário; e, no Plano de Testes, nas Notas de placar parcial de {TA-07}, {TA-10} e {TA-85}, sem marcar entrega. Nenhum card novo e nenhuma marcação alterada: continuam 135 cards e 88 marcados, medidos na contagem de cards do texto antes e depois.

Atualização de 2026-10-06, fechamento de {F5-05}. Prescrições com aviso de não substituição do receituário entregues e em produção (merge de718a6, repositório wladimirdjr/modularfit, migrações 0060 e 0061 aplicadas em produção em 07/10 (UTC; noite de 06/10 em Brasília), https://fit.modulareasy.com (a mesma árvore já provada em produção como 9510270; o deploy da main em de718a6 segue em curso); gates plan, db, review e qa verdes): tabela mfit.prescricao só com escrita do Médico vinculado, duração estruturada com vigência calculada na leitura (o dia da prescrição é o primeiro dia; "hoje" é a data de America/Sao_Paulo, num ponto único), aviso do receituário versão 1 editável em /admin/textos, parâmetros de 41 para 42, listas fechadas 9; H1 provado em produção ({TA-42}). Correções extras no mesmo merge: datas exibidas em Brasília em um ponto único do web, em todas as telas, e nascimento do perfil como data pura (bug anterior ao card, achado pelo qa). As duas regras da vigência ficam gravadas como Nota no card {F7-09}. {F5-06}, {F5-07}, {F5-08}, {F5-09}, {F5-10} e {F6-05} seguem abertos; {ART-FORM-08} não se marca (fecha em {F5-06}). Os Betas seguem [ ], porque dependem de operador real. Aritmética medida no publicado antes do flip (contagem de cartões do texto): 135 cards, 88 marcados, Planejamento 28 de 28 = 100 por cento (peso 40); Construção 60 de 107 = 56,07 por cento, e depois do flip 61 de 107 = 57,01 por cento (peso 40), conta: 60 marcados mais {F5-05} igual 61; Testes 48 de 168 = 28,57 por cento, e depois do flip 49 de 168 = 29,17 por cento (peso 20), conta: 48 marcados mais {TA-42} igual 49. Geral = 0,40 x 100 + 0,40 x 57,01 + 0,20 x 29,17 = 40 + 22,80 + 5,83 = 68,64 por cento, arredondado para 69 por cento (antes, 68,14, que arredondava para 68). Nenhum card novo nasce: continuam 135 cards no Roadmap e 168 no Plano de Testes. Próximo da fila: {F5-06}.

Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-06}. Notas publicadas antes do código no card {F5-06} (Drifts 1 a 9 e a migração 0062), nos cards {F5-10} (Drift 4), {F6-05} (Drift 4) e {F7-10} (Drifts 2 e 3); nas Notas de RF-SAUD-006, de RN-009 e de L.2, em E.1 e no Apêndice de formulários do DRS; nos cartões {ART-ENT-06}, {ART-FORM-08} e {ART-CFG-01} do Inventário; e, no Plano de Testes, em {TA-43} (os casos de prova) e nas Notas de placar parcial de {TA-07}, {TA-10} e {TA-85}, sem marcar entrega. Nenhum card novo e nenhuma marcação alterada: continuam 135 cards e 89 marcados, medidos na contagem de cards do texto antes e depois.

Planejamento

Concluída na aprovação do DRS. Vale 40 por cento do projeto (seção Planejamento). Estas etapas cobrem tudo que aconteceu antes de codar.

0.1 Entendimento e Elicitação

0.2 Especificação (o DRS)

0.3 Documentos companheiros

0.4 Validação e Qualidade

0.5 Publicação e Aprovação


Fase M, Mockup Navegável (pós-Planejamento, gate de aprovação)

Dependência: DRS aprovado (Planejamento fechado). A construção (fases seguintes) NÃO começa com esta fase aberta.
Definição de Pronto da Fase M: mockup publicado, navegável de ponta a ponta, aprovado e vinculado no DRS.

Fase 1, Fundação, identidade e acesso

Fechamento [2026-09-13]: entregue e em produção (635dda0, migração 0018_perfil_publico.sql), com o parâmetro não uuid da rota corrigido em 80b0ac3 antes do merge (P1 do qa). Ficou pronto: o tipo composto mfit.perfil_publico_reduzido e a função mfit.perfil_publico, únicas portas de leitura reduzida de terceiro; RLS ligada em mfit.usuario, mfit.perfil_aluno e mfit.perfil_profissional, com 8 políticas (2 em usuario, 3 em perfil_aluno, 3 em perfil_profissional) mais 3 REVOKE DELETE, nenhuma delas com OR ... IS NULL; as cinco funções SECURITY DEFINER estreitas mais duas promoções de claim resolvendo os nove caminhos sem claim (6 por função definer, 2 por promoção de claim, 1 já coberto por política existente); a rota GET /api/perfil/:usuarioId com o ramo do Administrador auditado na mesma transação da leitura; e o quarto placar de ops/verifica-acesso-aluno.mjs, por critério (política por linha, conjunto fechado de quatro atributos, varredura estática do server/src proibindo SELECT direto nas três tabelas, os oito campos privados ausentes da resposta HTTP real), com os três decoys vistos reprovando antes de serem desfeitos. O critério (d) herdado de {F1-14} sobe de 3 servidas + 17 pendentes = 20 para 4 servidas + 17 pendentes = 21 (perfil_aluno entra no universo, usuario e perfil_profissional ficam fora com motivo escrito). Placar honesto: 3 tabelas ligadas + 1 confirmada = 4; 4 campos públicos + 8 privados negados; 9 caminhos sem claim resolvidos; 1 de 4 cláusulas do H1 de {TA-06} fechada; placar N de 36 inalterado (as três tabelas não estão entre as dezoito entidades de E.1). RF-CORE-006 não fecha aqui, fecha na Fase 8. QA rodou os três papéis mais o anônimo na URL de produção e confirmou, item a item, que login, cadastro, recuperação de senha, confirmação de e-mail e a rotina de e-mail sobreviveram (D-10, passo 6). Gates plan, qa e review verdes.

Definição de Pronto da Fase 1: os trinta e seis casos de isolamento passam, o perfil de terceiro devolve apenas os campos públicos, nenhuma escrita de categoria sensível acontece sem consentimento, o aviso de natureza não clínica está nos quatro pontos, toda escrita produz auditoria e o plano governa os limites por configuração.

Fase 2, Catálogo de exercícios e vínculo

Nota: a tabela vinculo (estrutura e índices) nasce em {F1-08}, junto do auxiliar de acesso que decide por ela. Esta fase entrega a máquina de estados, as rotas de convite, aceite, recusa e encerramento, as notificações e as telas sobre essa tabela.
Definição de Pronto da Fase 2 (fechada em 2026-09-14): o catálogo global existe com os onze campos e é lido por todos ({F2-01} a {F2-04}); o vínculo governa o acesso do profissional ({F2-05} a {F2-07}, e {F2-09} prova o mesmo pelo caminho do Administrador); o aluno acumula vínculos sem limite por especialidade ({F2-08}); a máquina de estados recusa as transições proibidas ({F2-07}, gatilho BEFORE UPDATE de 0023).

Onda AUD, correções da Inspeção (14/09/2026, entram ANTES de {F3-04})

Achados medidos em produção pela Sessão de Inspeção e pelo próprio executor durante {F3-01}. Códigos imutáveis. Relatório de origem: docs/RECADOS-DO-FISCAL.md (14/09) e .claude/gates/qa/fix-origem-atras-do-proxy.gate. A correção do nginx.conf da máquina (confiança em X-Real-IP de qualquer origem) já foi aplicada pela Inspeção em 14/09 e fica fora deste roadmap por ser infraestrutura compartilhada. {AUD-01} e {AUD-02} já entraram corrigidos pela migração 0025_ficha_de_treino.sql (funções mfit.negacao_por_limite_do_aluno e mfit.acesso_do_aluno_ativo), mergeada em {F3-01} e em produção em 76bc9cd; por isso não têm card nesta onda.

Fechamento [2026-09-15]: merge 8daaf7d na main, executado em produção depois de backup lógico (pg_dump -Fc, /opt/modularfit/backups/); gates plan, qa e review verdes. Medido no dia: apenas duas das contas nomeadas no card ainda existiam, inspecao-qa-20260906@modulareasy.com e inspecao-visual-20260907@modulareasy.com (as demais já haviam sido removidas por sessões anteriores, ver Nota acima); ops/limpar-contas-de-teste --prefixo inspecao- --aplicar removeu as duas em ordem derivada das chaves estrangeiras, com relatório por tabela (antes, apagadas, anonimizadas, depois) e a aritmética fechando em todas as linhas; a auditoria ganhou duas entradas excluir, origem ops/limpar-contas-de-teste, atendendo D.6; segunda rodada removeu zero contas. As quatro contas reais (wladimir, c3po, r2d2 e aluno de teste) permanecem intactas. Onda AUD fica fora do denominador de 96 da Construção, por não ser uma das nove fases do Mapa de cobertura: este fechamento não move a barra, que permanece 34 de 96, 35,42 por cento.

Nota de fechamento [2026-09-15]: merge 9aa10db na main, gates plan, db, qa e review verdes (.claude/gates/{plan,db,qa,review}/modularfit-AUD-04.gate), deploy em produção pela sequência código antes da migração (imagem 9dccd19 no ar com o papel antigo, login provado, depois 0031_papel_super_administrador, 0032_escada_de_acesso e 0033_promocao_das_contas_de_topo, retrato super_administrador 3, aluno 1), versões em produção durante o card 9dccd19, 892ef33, final 9aa10db; última migração em produção passa de 0030 para 0033. Funções mfit.e_administracao() e mfit.e_super_administrador(), 37 sítios normativos classificados em SQL (35 reescritos pela 0032, 27 comuns e 8 privativos; 2 fora dela, 0002:17 estrutura e 0017:285 histórica, imutável), gatilho impedir_escalada_de_papel; ponto único papeis.ts no server e no web; 19 guardas de camada 1 reclassificadas (as 18 do gate mais web/src/fichas/autoria.ts:123, criada por {F3-09} depois do gate original); o administrador perde exatamente as 7 capacidades privativas de governança (atribuir plano e status, manter planos, bloquear, promover papel, personificar, excluir em definitivo, consultar a trilha) e mantém as demais capacidades comuns aos dois papéis, inclusive os textos da plataforma (decisão do Fiscal, caminho A do Drift 1); no total corrigido da Matriz de 47 linhas (Passo 2 do gate), o Administrador fecha em 20 e não em 33, porque a fronteira de dado clínico de 14 capacidades nunca foi dele, medida na mesma republicação do DRS e não retirada por este card. ops/semear-contas-de-topo.mjs com lista fechada de três e-mails, idempotente (3 inalteradas nas duas rodadas em produção); 4 scripts de ops passam a escolher o super. Placares H1: negativo 4 de 7, positivo 7 de 10 (os restantes nomeados por card dono). Testes: server 1010 com banco real, web 113. Achados do qa corrigidos no card: catálogo de planos mostrava ações privativas ao administrador; 35 asserções desatualizadas. Perda declarada: as 7 capacidades de governança do administrador, por ADR-017.

Por que: ADR-012 e L.2 são lei do próprio DRS ("nenhum limite vive fixo no código", "ajustáveis pela administração sem publicação nova") e o sistema as viola em universo medido de 148 pontos, dos quais 101 deveriam ser editáveis. {ART-CFG-01} catalogou 32 parâmetros e sua tarefa é {AUD-06}; a semente do card é de 28 parâmetros (32 publicados menos 4 de forma tabular). Este card é a tarefa.

O que implementar: depende de {AUD-04} (a tela e a escrita são privativas do Super Administrador). (1) tabela mfit.parametro, uma linha por chave do catálogo, com tipo, faixa, descrição, valor e a trava de cardinalidade contra o catálogo publicado; (2) ponto único de leitura parametro(chave) no servidor, com cache invalidado na escrita, pelo qual TODO consumidor passa; (3) migração dos parâmetros classificados A e B com DEFAULT igual ao valor de hoje, sem mudança de comportamento; (4) tela /admin/parametros, escrita privativa do Super Administrador e leitura do Administrador, renderizada a partir do catálogo (tipo, faixa e descrição por parâmetro), com o valor recusado fora da faixa; (5) toda alteração auditada, com valor antigo e valor novo na trilha; (6) verificador novo "zero literal de negócio fora do ponto único", por LITERAL e não por nome, com lista nominal de exceções e decoy; (7) os parâmetros técnicos continuam nomeados, no ponto único, com editavel = false, e o verificador os conhece.

RF-PAIN-011, ADR-012, L.2.

Fechamento [2026-09-29]: entregue e em produção (merge 29380ae, https://fit.modulareasy.com, /api/estado na versão 29380ae, migrações 0037 e 0038, gates plan, qa (PASS COM RESSALVAS) e review (APPROVED na rodada 4) verdes). mfit.parametro nasce com 28 linhas, o ponto único parametro(chave) atende os consumidores migrados, e /admin/parametros está no ar, com escrita do Super Administrador e leitura do Administrador, valor recusado fora da faixa e cada alteração na trilha com valor anterior e valor novo. O verificador ops/verifica-parametros.mjs fecha em RESULTADO OK, com 79 de 101 literais de negócio restantes fora do ponto único (22 fechados mais 79 restantes igual a 101, universo de 148, 0 soltos), cada restante com dono nominal ({AUD-07} 9, {AUD-08} 17, consentimento_textos 1, cards de módulo 52). O número de partida do card, 100 editáveis, foi ratificado em 101 na construção. Perda declarada: nada de comportamento deixou de funcionar, porque a semente é o valor medido de hoje; o Administrador não ganhou escrita, e aluno e profissional não ganharam leitura da tela. Ressalvas nomeadas do qa (sem P0 nem P1 abertos ao fim): (a) o histórico imutável da trilha ainda exibe, na coluna do valor anterior, o jargão antigo do motivo técnico (ADR-013, {F2-08}, {F7-07}, Fase 8), fiel ao que foi gravado, aceito; (b) a mensagem de bloqueio de login sem acento é preexistente de {F1-03}, não causada por este card; (c) ops/verifica-parametros.mjs não roda dentro da imagem do servidor, porque lê a árvore de fonte, e roda na árvore do commit. Lacuna declarada: os consumidores sessao_, recuperacao_, vinculo e url_assinada foram lidos no código e não exercitados, e a forma texto não tem parâmetro editável. {TB-55} segue aberto, por ser Beta.

Por que: listas_fechadas é um dos 32 parâmetros de {ART-CFG-01} e hoje vive fora do ponto único. Seis listas fechadas existem hoje como enum no banco e constante no código (grupo muscular, dificuldade, categoria, objetivo, nível, equipamento do aluno, 52 itens); migram para a tabela editável única. Mais dois CHECK de teto de lista, nove pontos de literal no total, todos fora do ponto único que {AUD-06} construiu.

O que implementar: migrar as seis listas fechadas para uma tabela editável única (mfit.lista_fechada_item), no precedente de {F1-18} (a constante virou tabela mantendo a mesma forma de import); as constantes e os dois CHECK de teto de lista passam a ler dessa tabela por {ART-CFG-02}, o ponto único, que ganha listaFechada(nome). As quatro listas ainda sem módulo (tipo de refeição {F4-01}, tipo de exame {F5-04}, pontos de dobra {F5-02}, categoria de pose {F5-08}) nascem nessa tabela pelo card dono. Tela /admin/listas.

Como verificar (teste primeiro): ops/verifica-parametros.mjs reprova, antes deste card, os nove pontos (sete constantes mais dois CHECK) como literal fora do ponto único, com card dono {AUD-07}. Os dois CHECK de teto são derrubados por migração posterior (DROP CONSTRAINT), e o verificador deixa de contá-los porque reconhece restrição derrubada, com decoy que prova que CHECK vivo continua sendo acusado. Os nove saem dos restantes: oito fechados e um reclassificado como técnico; restantes 79 para 70, editáveis 101 para 100.

Nota (gate modularfit-AUD-07, Drift 2, 2026-09-29): a sétima constante é server/src/arquivos/tipoConteudo.ts, mapa de protocolo e não lista de negócio, e é reclassificada de B para C, com o motivo "mapa extensão para tipo MIME (protocolo IANA); serve também os ativos da SPA; a regra de negócio é anexo_extensoes e midia_exercicio_formatos". O denominador de editáveis passa de 101 para 100.

Aceite (H1): Dado as seis listas fechadas hoje fixas em código, Quando o Super Administrador edita uma lista pela tela, Então o valor novo vale no próximo uso sem publicação nova, E os dois CHECK de teto são derrubados por migração posterior (DROP CONSTRAINT), E o verificador de {ART-CFG-02} deixa de contá-los porque reconhece restrição derrubada, com decoy que prova que CHECK vivo continua sendo acusado, E os nove saem dos restantes: oito fechados e um reclassificado como técnico.

RF-PAIN-011, ADR-012, L.2.

Fechamento [2026-09-29]: entregue e em produção (merge 7b47fa6, repositório wladimirdjr/modularfit, https://fit.modulareasy.com, /api/estado na versão 7b47fa6, migrações 0039 e 0040 aplicadas em dois deploys, com os seis tipos enum das listas removidos do banco; gates plan, qa (PASS COM RESSALVAS na rodada 1 e PASS depois da 0040, com os dois P2 corrigidos) e review (APPROVED na rodada 2) verdes). As seis listas fechadas vivem em mfit.lista_fechada_item (52 itens: 10, 3, 2, 8, 3 e 26), editadas em /admin/listas pelo Super Administrador, com leitura do Administrador, e listaFechada(nome) é a segunda leitura do ponto único. O verificador ops/verifica-parametros.mjs fecha em RESULTADO OK com 70 de 100 literais de negócio restantes (30 fechados, sendo 22 de {AUD-06} mais 8 de {AUD-07}; 70 restantes; 47 exceções C; universo 147): saíram dos restantes oito literais fechados e um reclassificado como técnico, e o denominador de editáveis passou de 101 para 100. Perda declarada: o filtro de busca deixa de oferecer item desativado, e criar exercício exige item ativo; o tipo fechado em TypeScript vira string, e a validação passa para o cache e o gatilho do banco; o catálogo deixa de ficar cinco minutos em cache no navegador; o Administrador continua sem escrita, e item nunca é apagado nem tem o valor trocado. Registro que já tinha um item desativado continua exibindo o rótulo e pode ser regravado. {TA-95} fecha; {TB-56} segue aberto, por ser Beta.

Por que: dezessete valores de negócio vivem como constante em config.ts fora do catálogo: senha mínima, limite de cadastro por endereço de origem (duas chaves), teto da biografia, remetente, onze assuntos de e-mail e a ajuda do campo de registro.

Pergunta que este card fecha, respondida: os onze assuntos entram em mfit.parametro, forma texto (Drift 1 do gate); o corpo dos e-mails continua no código do modelo até decisão do dono.

O que implementar: quinze chaves viram quatorze linhas de mfit.parametro (senha_minima_caracteres, cadastro_por_origem_maximo, perfil_biografia_max_caracteres e onze email_assunto_<modelo>), lidas pelo ponto único; remetente e ajuda de registro ficam como exceção técnica nomeada (L.3 e ADR-004); a cópia da biografia no web e as quatro cópias da senha mínima no web passam a ler o valor servido; /admin/parametros passa a editar a forma texto.

Como verificar (teste primeiro): o verificador reprova antes os dezessete com dono {AUD-08}; depois, quinze saem fechados, dois aparecem como exceção com motivo, web.Perfil.biografia sai fechado, e o placar honesto fecha em 52 de 98 (48 C, universo 146).

Aceite (H1): Dado os dezessete valores hoje soltos em código, Quando este card fecha, Então cada um tem destino declarado (mfit.parametro ou exceção técnica nomeada), E nenhum permanece literal sem classificação, E o verificador de {ART-CFG-02} imprime zero pendente com dono {AUD-08}, E nenhuma cópia do valor de senha mínima ou de teto de biografia sobrevive no web.

Nota (gate {AUD-08}, 2026-09-29): duas reclassificações de A para C, no molde do tipoConteudo de {AUD-07}. config.emailRemetente: marca única (L.3) e endereço autenticado no provedor de envio (SMTP_URL, SPF e DKIM do domínio): trocar o endereço exige infraestrutura, trocar o nome contraria L.3; {ART-MSG-01} já o fixa como "endereço institucional do produto". config.ajudaRegistroProfissional: reafirma ADR-004 ao usuário; o texto só muda quando a decisão muda, e editar sem deploy deixaria a tela afirmar o que o sistema não faz. Denominador de editáveis: 100 para 98.

RF-PAIN-011, ADR-012, L.2.

Fechamento [2026-09-29]: entregue e em produção (merge fa725bc, repositório wladimirdjr/modularfit, https://fit.modulareasy.com, /api/estado na versão fa725bc, migração 0041 aplicada, gates plan, qa (PASS COM RESSALVAS, zero P0 e zero P1) e review (APPROVED) verdes). mfit.parametro passa de 28 para 42 linhas (as catorze novas: senha_minima_caracteres, cadastro_por_origem_maximo, perfil_biografia_max_caracteres e onze email_assunto_<modelo>), server/src/config.ts passa de 26 para 11 chaves, e /admin/parametros edita a forma texto (uma linha, de 3 a 120 caracteres). O verificador ops/verifica-parametros.mjs fecha em RESULTADO OK com 52 de 98 literais de negócio restantes (fechados 46, sendo 22 de {AUD-06}, 8 de {AUD-07} e 16 de {AUD-08}; 48 exceções C; universo 146, 52 + 46 + 48; 0 soltas): quinze chaves fechadas, mais web.Perfil.biografia, e duas exceções nomeadas (remetente, por L.3, e ajuda do registro, por ADR-004). Provado em produção pelo qa: senha mínima de 8 para 10 (cadastro de 9 recusado com "10" na mensagem, dica em 10 sem reiniciar, redefinição idem), biografia de 1000 para 200, anti-abuso de 10 em 60 para 2 em 15 (terceiro cadastro da origem recebe 429), assunto de recuperação novo gravado no e-mail enviado, forma texto recusando vazio, espaços, 121 caracteres, quebra de linha e TAB, trilha com antes e depois em cada alteração e na restauração, negações 403 para Administrador, Profissional e Aluno, e o caminho antigo (cadastro de aluno e de profissional com a ajuda do registro, redefinição ponta a ponta, convite de vínculo) intacto. Perda declarada: os quinze valores deixam de ser conhecidos em tempo de compilação (quem garante passa a ser a faixa na escrita e a trava de cardinalidade na carga); a dica de tamanho da senha só mostra o número depois de uma requisição pequena e as telas de recuperação e redefinição perdem o cache de cinco minutos (uma busca por abertura); se o teto da biografia baixar, a biografia já gravada continua exibida inteira e editá-la exige encurtar até o teto (editar só o nome não toca a biografia); o assunto do e-mail pode divergir do corpo por decisão do operador; o remetente e a ajuda do registro continuam não editáveis. Ressalvas do qa, nenhuma do diff do card: (1) Perfil.tsx linha 913 com "verificação" e "administração" sem acento, e o verificador de ortografia não pega; (2) o cabeçalho do Perfil não atualiza o nome depois de salvar; (3) a recusa numérica devolve 400 e a de texto 422 na mesma rota, consistência a decidir; (4) e-mails de teste saíram de verdade pelo envio ativo, para endereços de teste da própria casa, já apagados; (5) um arquivo de saída de outra sessão existe na máquina de produção e não é do qa. Lacunas declaradas: a comparação com o código pai foi por leitura e não por execução (o teste não existe lá, e reprova por construção); o consumidor do envio de mídia de {TA-93} não foi exercitado; a negação foi provada na rota e a camada de segurança por linha do banco não foi testada separadamente. Dados de teste apagados, com o retrato dos 42 parâmetros idêntico ao inicial. {TA-96} fecha; {TB-55} segue aberto, por ser Beta.

Por que: a Matriz Ator por Capacidade do DRS dá N a Médico e Nutricionista em "Criar ficha de treino", "Duplicar ficha de terceiro" e "Atender ou recusar solicitação de ficha" (RF-TREI-001, RF-TREI-004, RF-TREI-009; {ART-ACS-03} e {ART-ACS-05}: "Não cria ficha de treino"), e em produção os dois criam ficha hoje (medido no gate de {F4-02}, M-3, em 29/09/2026). Achado do loop, triado pela Inspeção.

Depende de: {F4-02}, que cria o primeiro auxiliar de capacidade por especialidade no banco (D-3 do gate de {F4-02}); este card o reusa, nunca cria um segundo.

O que implementar: aplicar o auxiliar de especialidade nas políticas de escrita de ficha_treino (criação e duplicação) e de solicitacao_ficha (atender e recusar), e a mesma guarda na rota com 403 nomeado; verificador que confere as três capacidades contra a Matriz, com decoy e controle positivo (Personal Trainer e Fisioterapeuta continuam criando; Aluno continua criando para si).

Como verificar (teste primeiro): o verificador reprova antes do card (Médico e Nutricionista criam, duplicam e atendem hoje) e aprova depois, com decoy (política que libera Médico ou Nutricionista reprova) e controle positivo (Personal Trainer e Fisioterapeuta continuam criando; Aluno cria para si).

Aceite (H1): Dado um Médico e um Nutricionista com vínculo ativo com o mesmo aluno, Quando cada um tenta criar ficha, duplicar a ficha do Personal e atender uma solicitação desse aluno pela tela e pela rota direta, Então as seis tentativas recebem 403 nomeado sem linha gravada, E o Personal Trainer e o Fisioterapeuta com vínculo ativo fazem as três com sucesso, E o aluno cria ficha para si.

Perda declarada: Médico e Nutricionista deixam de criar, duplicar e atender ficha de treino; ficha que um deles já criou continua existindo e legível pelas regras de sempre (não se apaga dado). O aluno deixa de poder pedir ficha ou ajuste a Médico e Nutricionista.

Nota (Drift 1, gate modularfit-AUD-09, 2026-09-30): o escopo deste card inclui editar, desativar e reativar ficha de que é autor (linha Editar da Matriz, N para Médico e Nutricionista); a ficha antiga de um deles só é alterada pela administração (RN-009).

Nota (Drift 2, gate modularfit-AUD-09, 2026-09-30): POST /api/solicitacoes recusa com 403 nomeado quando o destinatário não prescreve treino; a tela só oferece destinatários que prescrevem e não oferece "Pedir ajuste" em ficha cujo autor não prescreve. Sem isso o pedido ficaria aberto para sempre, o caminho morto que a própria Matriz proíbe. Como o Aceite (H1) fala em atender uma solicitação desse aluno, depois do card um pedido a Médico ou Nutricionista só existe como dado antigo, e o teste {TA-97} prova as duas pontas: o aluno não consegue pedir, e o pedido antigo, semeado pelo arnês, não é atendido nem recusado.

Nota (gate {AUD-09}, Drift 4, 2026-09-30, zero medido): contagem em produção por SELECT em transação somente leitura: 0 fichas com autor Médico ou Nutricionista e 0 pedidos de ficha ou ajuste dirigidos a Médico ou Nutricionista, abertos ou encerrados. Nenhum dado antigo muda de destino; a perda declarada vale só daqui para a frente.

Ordem: entra na fila depois de {F4-02} (dependência) e antes de {F4-03}.

Fechamento [2026-09-30]: entregue e em produção (merge d760b2d, repositório wladimirdjr/modularfit, https://fit.modulareasy.com, migração 0045, gates plan (APPROVED), db (PASS), qa (PASS COM RESSALVAS, zero P0 e zero P1) e review (APPROVED na rodada 2) verdes). A migração altera seis políticas (ficha_treino na criação e na atualização, ficha_item na inserção, na atualização e na exclusão, e solicitacao_ficha na atualização) para só deixar escrever quem é aluno para si, Personal Trainer ou Fisioterapeuta com vínculo ativo, reusando mfit.tem_vinculo_ativo_na_especialidade de {F4-02} (nenhum segundo auxiliar), e a rota recusa com 403 nomeado ("A sua especialidade não prescreve ficha de treino"). Contagem do Drift 4 em produção: zero fichas e zero pedidos de Médico ou Nutricionista, então nenhum dado antigo mudou de destino. Verificador de capacidade por especialidade: de 1 de 7 para 7 de 7, com zero políticas chamando o auxiliar sem estar declaradas. Provado em produção pelo qa: Médico e Nutricionista 0 de 7 ações (criar, duplicar, editar, desativar, reativar, atender, recusar), 14 de 14 negações com 403 nomeado e banco idêntico antes e depois, cada uma com o seu par positivo (Personal Trainer e Fisioterapeuta 7 de 7, aluno cria, duplica e edita a própria ficha, Administrador edita a ficha antiga, personificação do Super Administrador preservada), leitura de Médico e Nutricionista intacta, e smoke visual nos dois temas em 400 e 1280 pixels sem travessão e sem erro de console. Perda declarada: Médico e Nutricionista deixam de criar, duplicar, editar, desativar, reativar, atender e recusar ficha de treino (leitura preservada); o aluno deixa de poder pedir ficha ou ajuste a eles; a ficha que um deles já tivesse criado continua legível e só a administração a altera (RN-009). Ressalvas do qa, os quatro P2, corrigidos em 26872cb, já dentro do merge: painel de Médico e Nutricionista com pedidos antigos sem ação nem explicação, vazio do aluno que só tem Médico contradizendo o aviso, concordância de "Pedido de ajuste aberta" e quebra do "+ Adicionar" a 1280 pixels no catálogo. Lacuna declarada: o baseline "o teste reprova sem o fix" não foi rodado em produção (a 0045 não se reverte lá); a prova é o arnês contra o código pai. Dados de teste apagados, zero resíduo.

RF-TREI-001, RF-TREI-004, RF-TREI-009, Matriz Ator por Capacidade; teste {TA-97}.

Por que: RF-CORE-010 e RN-001 fechavam as categorias de consentimento em seis (exame, prescrição, anamnese, avaliação física, sessão de reabilitação e foto de progresso), e a mesma especificação classifica nutrição como dado clínico na fronteira da administração (B.1 e RF-CORE-007: "dez por classificação, que são as categorias de saúde, nutrição e corpo"); a lei de proteção de dados trata o dado referente à saúde como sensível. Medido pelo loop em 30/09/2026: refeicao e meta_nutricional estão com sensivel: false e categoriaConsentimento: null no registro de entidades (server/src/acesso/verificarPoliticas.ts, linhas 146 a 148, junto de plano_alimentar, que ainda não existe), e um Personal Trainer vinculado a um aluno sem consentimento nenhum lê as duas com 200. Decisão de escopo da Inspeção.

Decisão, já tomada: nutrição é a sétima categoria, cobrindo refeição (com os alimentos dela), meta nutricional e plano alimentar (com as refeições do plano), com finalidade e texto próprios e restrição por especialidade disponível como nas outras seis (RN-003). RF-CORE-010 (Notas e H1), RN-001, E.1, J.2 e o módulo diet (C.9) do DRS estão alinhados nesta data.

O que implementar: o valor nutricao no tipo mfit.categoria_sensivel; refeicao, meta_nutricional e plano_alimentar com sensivel: true e categoriaConsentimento: 'nutricao' no registro de entidades, refeicao_alimento e plano_refeicao seguindo a linha pai; a quinta seção do gabarito (GABARITO-ACESSO-ALUNO.md, "Consentimento por categoria") aplicada às duas tabelas que existem, com a política de leitura em conjunção com mfit.consentimento_visivel(aluno_id, 'nutricao') e o WITH CHECK de escrita com mfit.tem_consentimento(aluno_id, 'nutricao'), e plano_alimentar nascendo já assim em {F4-03}; as rotas de refeição e de meta traduzindo a recusa em apresentação da tela de consentimento da categoria, pelo mesmo tradutor das outras seis; /privacidade listando sete categorias; a vigência padrão da meta (semearMetaPadrao) saindo da criação do aluno para o primeiro consentimento de nutrição concedido, lendo metas_padrao naquele momento; e o sétimo texto de consentimento.

Texto do consentimento, dono é este card: docs/textos/consentimentos.md tem os seis textos, cada um em três blocos (o que é coletado, quem vê, revogação). Este card escreve o sétimo, Nutrição, no mesmo molde (o que é coletado: refeições com alimentos e quantidades, metas diárias de calorias e macronutrientes e o plano alimentar prescrito; quem vê: o aluno e o profissional com vínculo ativo, restringível a especialidade na tela de privacidade, e a administração nos termos das outras seis; revogação: bloqueia registro novo e retira a vista dos profissionais, sem apagar o que já existe), corrige a abertura do arquivo de "seis categorias" para "sete categorias" e carrega o sétimo texto, versão 1, onde os seis vivem hoje (consentimento_textos, {ART-CFG-01}).

Dado já existente: refeição e meta gravadas antes do consentimento permanecem, legíveis pelo titular e pelo Super Administrador, fora da vista do profissional e sem escrita nova até o consentimento, a mesma situação de uma categoria revogada. A vigência padrão de aluno sem consentimento de nutrição, por ser cópia de metas_padrao e não dado da pessoa, é removida pela migração e volta a nascer no consentimento. Nenhuma refeição e nenhuma meta escrita por pessoa é apagada.

Contagem: universo das categorias medido por outro meio que o texto: os valores de mfit.categoria_sensivel em produção, lidos em transação somente leitura em 30/09/2026 contra o HEAD b569460: 6 (exame, prescricao, anamnese, avaliacao_fisica, sessao_reabilitacao, foto_progresso); depois do card, 7. Entidades de nutrição em E.1: 5 tabelas, das quais 3 decidem acesso (refeicao, meta_nutricional, plano_alimentar) e 2 seguem a linha pai; em produção existem 3 das 5 (refeicao, refeicao_alimento, meta_nutricional): 3 existentes mais 2 a nascer em {F4-03} igual 5. Dado existente, mesma leitura: 0 refeições; 1 vigência de meta, a padrão (autor nulo), de 1 aluno, que é o único aluno da base, por isso nada aqui se afirma de "todos": o gate do card mede de novo antes da migração. Critério comportamental: leitura real pela rota com sessão de Personal Trainer vinculado, sem consentimento (negada) e com consentimento (servida), nunca busca por nome de categoria no código. RF que reprova: RF-CORE-010 (H1 com a cláusula de nutrição) e D.6.

Como verificar (teste primeiro): antes do card, o arnês com banco real prova o defeito: aluno sem consentimento, o Personal Trainer vinculado lê refeição e meta com 200 e o aluno grava refeição; o verificador de políticas reprova refeicao e meta_nutricional sem a categoria. Depois, as mesmas chamadas invertem, com decoy (política de leitura sem consentimento_visivel reprova) e controle positivo (com consentimento, Personal Trainer e Nutricionista leem; com a categoria restrita a Nutricionista, só o Nutricionista lê).

Aceite (H1): Dado um aluno sem consentimento da categoria nutrição e um Personal Trainer com vínculo ativo com ele, Quando o Personal pede a refeição, a meta nutricional e o plano alimentar do aluno pela tela e pela rota direta, Então as leituras são negadas sem conteúdo parcial, E a primeira refeição que o aluno tenta registrar é bloqueada sem linha gravada e a tela de consentimento de nutrição é apresentada, E depois de conceder a mesma refeição grava, a vigência padrão da meta nasce e o Personal passa a ler as duas, E com a categoria restrita a Nutricionista o Personal volta a ser negado e o Nutricionista lê, E depois da revogação uma refeição nova é bloqueada enquanto as já registradas continuam legíveis pelo aluno.

Perda declarada: o aluno passa a consentir antes do primeiro registro de refeição ou de meta; o profissional vinculado sem o consentimento do aluno deixa de ler nutrição, inclusive o Personal Trainer, que hoje lê; a meta padrão do aluno passa a ser a vigente no dia do consentimento, não a do dia do cadastro; o aluno que nunca consentir não tem meta.

Ordem: entra na fila depois de {AUD-09} e antes de {AUD-10} e de {F4-03}.

Nota (gate {AUD-11}, drifts 1, 2, 3, 5 e 7, 2026-09-30): (1) marcar as entidades de nutrição como sensíveis exige o campo leitorUnico no registro de entidades e o critério (a2) do verificador do leitor único, conforme a Nota de {ART-AUD-02} do Inventário. (2) O card entrega duas migrações: 0046_categoria_nutricao.sql, somente com ALTER TYPE mfit.categoria_sensivel ADD VALUE 'nutricao', e 0047_consentimento_nutricao.sql, com todo o resto (as políticas citam 'nutricao'), porque o Postgres não deixa usar o valor novo de um enum na mesma transação em que ele nasce e o executor de migrações roda cada arquivo em BEGIN/COMMIT. {F4-03} passa a usar a migração 0048. (3) Revogar o consentimento bloqueia também a desativação de refeição antiga, porque o WITH CHECK de toda política de UPDATE de tabela sensível exige mfit.tem_consentimento: o aluno que revogou reconsente para desativar (decidido, ajuste se discordar). (5) Os textos de consentimento vivem em config.consentimentoCategorias (server/src/config.ts, versão 1.3), não na tabela consentimento_textos: o sétimo texto entra ali e em docs/textos/consentimentos.md, e a leitura "onde os seis vivem hoje (consentimento_textos)" do parágrafo acima se lê com esta correção; Termos de Uso e política de privacidade seguem fora do card. (7) A inserção de meta_nutricional exige também mfit.consentimento_visivel(aluno_id, 'nutricao'), conforme a Nota de RF-CORE-010 no DRS: o Nutricionista fora da restrição escolhida pelo aluno não define a meta.

Fechamento [2026-09-30]: entregue e em produção (merge 6490072, repositório wladimirdjr/modularfit, https://fit.modulareasy.com, /api/estado na versão servida 6490072 (= merge), migrações 0046 e 0047, gates plan (APPROVED com trava de drift), db (PASS), qa (PASS, {TA-98} 61 de 61, zero P0 e zero P1, dois P2 corrigidos dentro do merge) e review (APPROVED, 0 Critical, 0 Important, 7 Minor) verdes). Nutrição é a sétima categoria de consentimento: o tipo mfit.categoria_sensivel passa de 6 para 7 valores (0046, só o ADD VALUE) e sete políticas (refeicao na leitura, na inserção e na atualização, refeicao_alimento na leitura e na inserção, meta_nutricional na leitura e na inserção) passam a exigir mfit.consentimento_visivel na leitura e mfit.tem_consentimento na escrita (0047, por ALTER POLICY, sem apagar política). Placares medidos no fechamento pelo loop, nunca projetados: leitor único 2 de 10 (refeicao e meta_nutricional, cada uma no ponto único do seu módulo, declarado em leitorUnico); consentimento por entidade 2 de 10 (8 pendentes: plano_alimentar, medida_corporal e as seis de saúde); critério (h) 7 = 7; fronteira clínica 2 de 13 (13 no registro, inalterado); verifica-parametros sem mudar (52 de 98, C 53, universo 151). H1 provado em produção ({TA-98}): Personal Trainer, Médico e Nutricionista vinculados, sem consentimento, recebem 403 categoria_nao_compartilhada em refeição e em meta, sem conteúdo parcial e sem 200 vazio; o aluno sem consentimento vê o cartão de consentimento no lugar do formulário, e a gravação direta volta 403 consentimento_necessario sem linha gravada; ao consentir, a meta padrão nasce uma vez (reconceder dá 409 e não duplica) e a refeição grava; com a categoria restrita a Nutricionista só ele lê e grava, e restrita a Médico o Nutricionista fica de fora também da escrita da meta; revogado, os profissionais voltam a 403, o titular segue lendo o histórico e desativar refeição antiga é bloqueado até reconsentir; Administrador com 403 nomeado e 0 linhas no banco (controle do aluno 1|3|1); Super lê e grava a trilha (+4 entradas) e, personificando, grava com consentimento e é negado sem. Dados de teste apagados, zero resíduo. Perda declarada, confirmada em produção: o profissional vinculado sem consentimento de nutrição, ou fora da restrição, deixa de ler refeição e meta, inclusive o Personal Trainer, que lia com 200; o Nutricionista fora da restrição deixa de gravar meta; o aluno sem consentimento deixa de registrar refeição, de definir meta e de desativar refeição antiga; a meta padrão passa a nascer no primeiro consentimento e não no cadastro, e a vigência padrão de aluno sem consentimento foi removida pela migração (era cópia de metas_padrao, conforme o gate de db); nenhuma refeição e nenhuma meta escrita por pessoa foi apagada. Quem continua: o titular lê tudo sempre, o Super lê com auditoria, o Administrador segue negado, as seis categorias de saúde e /privacidade (agora com sete cartões) seguem iguais. Não entra aqui: os textos de consentimento editáveis e versionados são de {AUD-12}, e plano_alimentar nasce já sob a categoria em {F4-03} (migração 0048).

RF-CORE-010, RN-001, RN-003, E.1, D.6, RF-DIET-001 a RF-DIET-005; teste {TA-98}.

Por que: ordem do dono de 15/09/2026: "Todas as regras de negócio do sistema precisam ser configuráveis pelo painel de super admin. Coisas como planos, precos, limites, e etc." ADR-012 já trata textos como dado de configuração. Hoje o assunto dos onze e-mails transacionais é editável ({AUD-08}, em mfit.parametro) e o corpo vive em código (server/src/email/modelos.ts), fora de qualquer tela. O gate de {AUD-08} (Drift 9) desenhou este caminho como Cenário 2: forma tabular, tabela própria (D-15 de {AUD-06}), e as onze linhas email_assunto_<modelo> migram para ela. Decisão de escopo da Inspeção.

Decisão, já tomada: extensão de RF-PAIN-011 (os modelos são um parâmetro de forma tabular do catálogo, como listas_fechadas), sem RF novo e sem capacidade privativa nova em B.1, com tela própria /admin/emails. RF-PAIN-011, ADR-012, L.2 e o Apêndice de catálogo de telas do DRS estão alinhados nesta data.

O que implementar: a tabela do modelo (um registro por modelo: chave, evento, variáveis permitidas, variáveis obrigatórias, versão vigente) e a tabela das versões, só de acréscimo (modelo, número, assunto, corpo, autor, criada em), com a semente da versão 1 de cada modelo igual ao texto de hoje (assunto = valor vigente do parâmetro em produção no dia da migração; corpo = o texto de hoje do código, com as variáveis no lugar das interpolações); as onze linhas email_assunto_<modelo> saem de mfit.parametro (trava de cardinalidade de 44 para 33, medido hoje; o gate mede de novo); o renderizador único lê a versão vigente, substitui as variáveis, deriva o HTML (parágrafos, valor escapado, variável de endereço como link) e grava no registro do envio o número da versão usada; modelos.ts deixa de ter texto de e-mail; rotas de leitura (dois papéis de administração), de gravação e de restauração (só Super Administrador) e de pré-visualização (sem gravar e sem enviar); tela /admin/emails com a lista dos onze modelos, o editor de assunto e corpo com as variáveis do modelo à vista, a prévia, o histórico de versões com restaurar e a confirmação nominal ao gravar. Ficha, regras de validação e catálogo de variáveis no cartão {ART-CFG-03} do Inventário.

Contagem: universo medido por três meios, em 30/09/2026, contra o HEAD b569460: 11 funções de modelo exportadas em server/src/email/modelos.ts; 11 entradas no mapa de modelos do envio (server/src/email/rotina.ts); 11 linhas email_assunto_% em mfit.parametro, lidas em transação somente leitura. 11 = 11 = 11. Lado negativo, fora do universo por decisão escrita: o remetente (config.emailRemetente, exceção técnica de {AUD-08} por L.3) e a ajuda do registro profissional (ADR-004), que não são modelo. Critério comportamental: modelo que o envio alcança pelo mapa de modelos e renderiza, não busca por nome. Produto de uma instância só, sem inquilinos: o universo é o sistema inteiro. RF que reprova: RF-PAIN-011, H1 dos modelos de e-mail.

Como verificar (teste primeiro): o verificador de parâmetros ({ART-CFG-02}) ganha o critério "texto de e-mail em código" e reprova antes (onze corpos literais em modelos.ts) e aprova depois (zero), com decoy (um corpo literal reintroduzido reprova) e controle negativo (o remetente, exceção nomeada, não reprova); o arnês prova a gravação válida, as três recusas (variável desconhecida, variável de endereço ausente, assunto com quebra de linha), a versão nova por gravação, a restauração como versão nova, a prévia sem linha gravada e sem e-mail na fila, a prévia dos onze modelos na versão da semente idêntica ao texto que o código produzia para os mesmos dados, e o e-mail seguinte saindo com o texto novo.

Aceite (H1): Dado o modelo de recuperação de senha na versão vigente N, Quando o Super Administrador grava em /admin/emails um assunto e um corpo novos que usam apenas variáveis da lista do modelo, Então a versão N+1 passa a ser a vigente e a trilha registra antes e depois, E o próximo e-mail de recuperação renderizado sai com o assunto e o corpo novos e as variáveis substituídas, sem publicação nova e sem reiniciar o serviço, E um corpo com variável fora da lista, ou sem a variável de endereço, é recusado com a variável nomeada na mensagem e a vigente continua N+1, E a pré-visualização devolve o texto renderizado sem gravar versão e sem enviar e-mail, E a mesma gravação tentada pelo Administrador é negada pela rota direta, E nenhum corpo de e-mail transacional permanece como texto literal no código.

Perda declarada: o assunto passa a morar junto do corpo, no modelo, e sai de /admin/parametros; as alterações de assunto já feitas em /admin/parametros continuam na trilha de auditoria e não viram versões do modelo (a versão 1 parte do valor vigente); os onze textos deixam de ser conhecidos em tempo de compilação, e texto errado passa a ser possível por decisão do operador, contido pela lista de variáveis, pela variável de endereço obrigatória e pela prévia; o operador não formata HTML.

Ordem: entra na fila depois de {AUD-11} e antes de {F4-03}.

Nota (Inspeção, gate {AUD-10}, drifts 1 a 4, 6 a 8 e 10, 2026-09-30): o gate do planner corrige e acrescenta ao card, sem marcar entrega. (1) A migração deste card é a 0048 (uma só, 0048_modelos_de_email.sql); a Nota do gate de {AUD-11} e a Nota de {F4-03}, que dizem que {F4-03} passa a usar a 0048, estão superadas: {AUD-12} numera a seguinte (0049, ou 0049 e 0050 se precisar de ADD VALUE em chave_texto ou ponto_texto) e {F4-03} vem depois dela. (2) A versão vigente não é coluna da tabela do modelo: é derivada, o maior número de versão do modelo; a tabela do modelo ganha rotulo, faixa (as faixas do assunto e do corpo como dado) e parametro_legado_id, com a finalidade descrita em {ART-CFG-03}. (3) {{endereco}} é recusada no assunto, porque carrega o endereço de uso único, e continua obrigatória no corpo. (4) A trilha das alterações antigas de assunto continua legível em /admin/auditoria pelo parametro_legado_id; elas não viram versões. (5) A pré-visualização atende os dois papéis, e o Administrador vê o renderizado das versões gravadas, sem editor. (6) Os corpos saem para a semente da migração e o verificador de ortografia passa a varrê-la. (7) Texto e HTML de dois modelos já divergiam no código (recuperacao_senha e acesso_criado: "Acesse" no texto, "Clique" no HTML); a semente parte do texto e o HTML desses dois passa a dizer "Acesse". (8) Perda declarada adicional: a versão é imutável, então a prova em produção deixa rastro, e recuperacao_senha fica com três versões depois do qa (a versão 2, de teste, e a versão 3, restauração da versão 1), como descrito na Nota de {TA-99}.

Fechamento [2026-09-30]: entregue e em produção (merge 17b62d6, migrações 0048 e 0049, https://fit.modulareasy.com, /api/estado na versão 17b62d6; gates plan, db, qa (PASS COM RESSALVAS, zero P0 e zero P1) e review (APPROVED) verdes). Os onze e-mails transacionais têm modelo editável pelo Super Administrador em /admin/emails, com assunto e corpo, variáveis validadas no servidor, versões só de acréscimo, restauração como versão nova e pré-visualização para os dois papéis; o Administrador lê e não grava. mfit.parametro passou de 44 para 33 linhas e nenhuma email_assunto_ sobrou; a trava de cardinalidade é 33. Texto de e-mail em código: 11 antes, 0 depois, com decoy que reprova e controle que não. Placar numérico do verificador de parâmetros inalterado, 52 de 98, C 53, universo 151, porque o card move texto e não literal numérico. Em {TA-99}: 12 de 12 critérios e 38 de 38 na bateria de rotas, mais a tela nos dois temas e nas duas larguras; a regressão de {TA-96} (os e-mails reais de cadastro, convite, aceite, pedido de ficha, encerramento, cancelamento, recusa e recuperação) passou, 14 de 14 idênticos ao texto de sempre. Correção medida que vale sobre o que o gate dizia: são 9 modelos idênticos e 2 com a troca declarada de "Clique" para "Acesse" no HTML (recuperacao_senha e acesso_criado), e não 8 e 3. A migração 0049 só tirou o código interno de card da descrição do evento acesso_criado, que aparecia para o usuário na tela (P2-1 do qa, corrigido). Perda declarada, confirmada: o assunto saiu de /admin/parametros; e-mail já renderizado e na fila sai com o texto de quando foi montado; o HTML dos dois modelos acima diz "Acesse"; a versão é imutável, então a prova em produção deixou rastro: recuperacao_senha tem a versão 1, a versão 2 (de teste, com o marcador no assunto e no corpo) e a versão 3, que é a restauração da versão 1 e a vigente, 13 versões no total. Ressalvas, nominais: (P2-2) a tela só recusa um texto inválido depois de o Super confirmar a gravação, e não antes, não corrigido; acesso_criado e solicitacao_ficha_atendida não foram disparados em produção, cobertos pela semente e pelo arnês; a política de inserção do banco não foi testada isolada, só pelo 403 do tratador; restaurar pela tela não foi confirmado com sucesso em produção (para não criar uma versão 4), a confirmação e o 409 foram vistos na tela e o 201 da restauração veio pela rota; a trilha antiga de assunto (Drift 3) não foi conferida em produção. Próximo da fila: {AUD-12}, depois {F4-03}.

RF-PAIN-011, ADR-012, L.2, {ART-CFG-01}, {ART-CFG-03}, {ART-MSG-01} a {ART-MSG-03}; teste {TA-99}.

Por que: ordem do dono de 15/09/2026, literal: "Todas as regras de negócio do sistema precisam ser configuráveis pelo painel de super admin. Coisas como planos, precos, limites, e etc." ADR-012 trata texto como carga de configuração. Medido na revisão de {AUD-11} (30/09/2026, M6): os textos das sete categorias de consentimento vivem em server/src/config.ts com versão fixa no código ("1.3" nas seis do HEAD d760b2d, "1" no texto de nutrição de {AUD-11}), e consentimento_textos em {ART-CFG-01} está sem consumidor e com dono a confirmar. E (M7): restrito_a_especialidades volta do driver como texto e a tela testa com includes sobre a string, o que acende o chip errado quando uma especialidade tiver prefixo de outra. Decisão de escopo da Inspeção.

O que implementar: os sete textos passam a viver no mecanismo de texto versionado que já existe desde {F1-18} (mfit.texto_versionado, tela /admin/textos, só acrescido, vigência por publicado_em), um ponto por categoria; a concessão grava em consentimento.versao_texto a versão EXIBIDA ao aluno (409 texto_atualizado se mudou, como no cadastro); a semente carrega os textos de docs/textos/consentimentos.md; consentimento_textos em {ART-CFG-01} ganha dono {AUD-12} e deixa de ser "a confirmar"; a rota de consentimentos devolve restrito_a_especialidades como lista (cast ::text[] no SELECT, lição de {F3-08}) e a tela compara por item.

Contagem: universo dos textos = universo das categorias, medido por outro meio que o texto: os valores de mfit.categoria_sensivel (seis no HEAD d760b2d, sete quando {AUD-11} entregar) contra as chaves de config.consentimentoCategorias em server/src/config.ts (seis no HEAD, sete com {AUD-11}); depois do card, sete pontos de texto versionado, um por categoria, e zero textos de consentimento em constante de código. Critério comportamental: o texto que a rota de consentimentos entrega ao aluno vem da vigência de mfit.texto_versionado, e a versão gravada na concessão é a que a tela exibiu, nunca busca por nome de chave no código. RF que reprova: RF-CORE-010 e RF-CORE-012 (H1 abaixo).

Como verificar (teste primeiro): antes do card, o arnês com banco real prova o defeito: publicar uma versão nova do texto pela tela não muda o que a concessão exibe nem a versão que grava, e uma especialidade com prefixo de outra acende o chip errado. Depois, as mesmas ações invertem, com controle positivo (a concessão sem versão nova grava a versão exibida) e o caso da tela aberta com a versão anterior recebendo 409 texto_atualizado.

Aceite (H1): Dado o Super Administrador que publica em /admin/textos uma versão nova do texto de consentimento de nutrição, Quando um aluno abre a concessão dessa categoria, Então vê o texto novo sem publicação de código, E a concessão grava a versão exibida, E um aluno que tinha a tela aberta com a versão anterior recebe 409 texto_atualizado ao conceder, E um consentimento restrito a uma especialidade marca só o chip dela.

Perda declarada: nenhuma para o usuário; o texto passa a ser editado por tela, e a constante em config.ts morre.

Ordem: entra na fila depois de {AUD-10} e antes de {F4-03}.

Nota (Inspeção, gate {AUD-10}, drift 8, 2026-09-30): {AUD-10} usa a migração 0048; este card numera a seguinte: 0049, ou 0049 e 0050 se precisar de ADD VALUE em chave_texto ou ponto_texto. {F4-03} vem depois deste card.

Nota (Inspeção, gate {AUD-12}, drifts 1 a 4 e perda declarada, 2026-09-30): o gate do planner corrige e acrescenta ao card, sem marcar entrega. (1) Semente: onde "O que implementar" diz que a semente carrega os textos de docs/textos/consentimentos.md, leia: a semente carrega os textos e as finalidades carimbados nos consentimentos existentes, isto é, exatamente os de config.consentimentoCategorias (server/src/config.ts) no merge 17b62d6, nas versões 1.3 (seis categorias) e 1 (nutrição). O arquivo consentimentos.md nunca foi o texto exibido ao aluno e descreve quem vê o dado de forma diferente do que o sistema faz; não é fonte da semente. Se o dono quiser os textos longos, é publicação pela tela que este card entrega, depois de corrigidos, sem código. (2) Versão nova: vale para as próximas concessões; quem já consentiu guarda a versão aceita, continua com o consentimento válido e vê em /privacidade o texto dessa versão. Forçar novo consentimento a cada versão não é deste card; é card próprio se o dono pedir. (3) Quem publica: texto de consentimento cai na permissão que /admin/textos já tem, então o Administrador e o Super Administrador publicam, coerente com a decisão de 15/09 de manter "textos" com o Administrador; nenhuma capacidade nova nasce e a divergência de B.1 continua 22. (4) Migrações: duas, e não uma: 0050 (somente os nove ADD VALUE, dois em chave_texto e sete em ponto_texto) e 0051 (a carga dos textos e das finalidades, os comentários e as conferências com aborto). Isto supera a Nota anterior deste card, que previa a 0049; {F4-03} passa a usar a 0052. (5) Perda declarada (substitui "nenhuma para o usuário"): o aluno com a tela aberta quando sai versão nova recebe "texto atualizado" e precisa reler antes de conceder; o aluno com aba do front antigo no momento do deploy falha ao conceder, com erro genérico, até recarregar; quem já consentiu continua vendo o texto que aceitou, e só vê o novo se revogar e conceder de novo; a tela de privacidade depois de revogar passa a recarregar da API; a edição do texto de consentimento não é exclusiva do Super Administrador; o texto deixa de ser conhecido em tempo de compilação e de mudar por deploy, e texto errado passa a ser possível por decisão do operador, contido pela confirmação nominal e pela trilha; consentimentos.md deixa de ser tratado como fonte do texto exibido; e a prova em produção deixa dois registros permanentes no histórico de nutrição (uma versão de teste e a restauração com o texto da versão 1).

Fechamento [2026-09-30]: merge 4e5ed26 (repositório wladimirdjr/modularfit, https://fit.modulareasy.com, migrações 0050 e 0051; gates plan (APPROVED COM TRAVA DE DRIFT, travas cumpridas), db, qa (PASS COM RESSALVAS, {TA-100} 27 de 27, reconferência em produção na versão 53c7fd2 PASS) e review (APPROVED, Minors principais fechados em 53c7fd2, três declarados no CHANGELOG) verdes). Os sete textos de consentimento e as sete finalidades vivem em mfit.texto_versionado, editáveis pelo Super Administrador e pelo Administrador em /admin/textos (terceiro grupo, Consentimentos), só de acréscimo, com vigência por publicação; a constante config.consentimentoCategorias morreu. Placares medidos: texto de consentimento em código 7 antes, 0 depois, com decoy que reprova e controle que não; semente de 14 linhas (7 textos e 7 finalidades) com md5 igual ao texto carimbado nos consentimentos existentes; verifica-parametros de 52 de 98 para 51 de 98, C 54, universo 152; divergência de capacidades B.1 inalterada em 22. A concessão grava em consentimento.versao_texto a versão EXIBIDA: versão ausente ou divergente dá 409 texto_atualizado (com o vigente no corpo) e nenhuma linha gravada; segunda concessão da mesma categoria dá 409 ja_concedido e a tela converge para Concedido sem duplicata (reconferência, duas abas). Quem já consentiu segue com a versão aceita e vê o texto dela. restrito_a_especialidades chega como lista e a tela compara por item (só o chip Nutricionista acende; Personal Trainer 403 categoria_nao_compartilhada, Nutricionista 200). Perda declarada, confirmada: o aluno com a tela aberta quando sai versão nova recebe 409 e precisa reler; quem já consentiu só vê o texto novo se revogar e conceder de novo; o Administrador comum publica texto de consentimento; o texto errado passou a ser possível por decisão do operador, contido pela confirmação nominal e pela trilha; consentimentos.md deixou de ser fonte do texto exibido. Ressalvas, nominais: (P2-1) o cartão Termos de uso em /admin/textos mostra markdown cru, pré-existente de {F1-18}, fora deste card, não corrigido; (P2-2) a tela de consentimento não avisa ao aluno já consentido que há versão nova, decidido fora de escopo; a cláusula "especialidade com prefixo de outra" não tem caso real em produção (enum de quatro valores, nenhum prefixo de outro), provada pela causa-raiz (array JSON) e pelo teste unitário de chipRealcado; o histórico de nutrição ficou com a versão 1 (semente), a 1.1 (texto de teste) e a 1.2 (restauração, texto e finalidade idênticos aos da 1, md5 conferido), exceção declarada porque o histórico é só de acréscimo. Dados de teste apagados, zero resíduo. Próximo da fila: {F4-03}, que numera a migração 0052.

RF-CORE-010, RF-CORE-012, ADR-012, L.2, {ART-CFG-01}; teste {TA-100}.

Por que: medido no gate de {F5-03} (06/10/2026): o produto lê corpo JSON em 36 pontos de 23 arquivos e só 9 respondem 400 a JSON malformado ou a corpo que não é objeto; {F5-03} cria o ponto único server/src/http/corpoJson.ts e o aplica em avaliações e anamneses; os demais (incluindo nutrição, que hoje dá 422) ficam inconsistentes. Decisão de escopo da Inspeção.

O que implementar: todas as rotas que leem corpo passam pelo ponto único (400 corpo_invalido para JSON malformado ou corpo que não é objeto), inclusive as 9 que hoje respondem 400 por try/catch próprio; verificador que reprova leitura de corpo fora do ponto único, com decoy; nenhuma mudança de regra de negócio.

Contagem: universo 38 rotas que leem corpo, entre as 52 rotas POST, PUT e PATCH do servidor (medido em 06/10/2026 na main 08b35ed, server/src sem testes); critério comportamental: o tratador chama método de corpo do Hono (req.json, req.text, parseBody, arrayBuffer, blob, formData ou raw.body); 1 leitura por rota, em 23 arquivos, sendo 37 de JSON e 1 multipart. Aritmética: as 37 de JSON são 2 no ponto único ({F5-03}) + 10 com try/catch próprio (fichas 2, sessões 4 com o req.text de /encerrar, solicitações 3, vínculo 1) + 25 que engolem o erro com .catch(()=>...); 2 + 10 + 25 = 37; 37 + 1 upload multipart = 38; 38 + 14 rotas de escrita sem corpo = 52. Lado negativo: as 14 rotas de escrita sem corpo (desativar, reativar, duplicar, aceitar, recusar, cancelar, personificar e renovar sessão) ficam fora do universo, e DELETE e GET também; o multipart de POST /api/admin/exercicios/:id/imagem fica fora da regra 400 (não é JSON), mas a leitura dele passa ao ponto único (lerCorpoMultipart, comportamento idêntico), para o verificador ter zero exceção. RF que reprova: o verificador verificar:corpo imprime 52 = 37 + 1 + 14 e reprova qualquer método de corpo fora de http/corpoJson.ts.

Como verificar (teste primeiro): antes do card, o arnês envia a cada rota que lê corpo JSON malformado e corpo que não é objeto ({x, [], null) e prova o defeito: as 25 a converter respondem outra coisa que 400 (422 ou 500). Depois, as mesmas chamadas dão 400 corpo_invalido sem gravar nada, com controle positivo (corpo válido segue gravando), e o verificador reprova um arquivo sintético que lê o corpo fora do ponto único e passa o que usa o ponto único.

Aceite (H1): Dado um usuário autenticado, Quando envia JSON malformado ou um corpo que não é objeto a qualquer rota de escrita, Então recebe 400 corpo_invalido sem gravar nada, E o verificador reprova uma rota nova que leia o corpo fora do ponto único.

Perda declarada: as respostas 422 a JSON malformado passam a 400; o cliente da própria SPA não depende disso, e isso se confere no gate.

Nota (Inspeção, gate {AUD-13}, Drifts 1 e 2, 2026-10-06): supera o "36" e o "9 que já dão 400" do texto acima (Por que e O que implementar), que ficam como foram publicados. O universo medido é 38, e não 36: o gate achou o req.text de /encerrar (JSON, com try/catch e 400) e o multipart do upload de imagem de exercício, que a primeira medida omitiu. As que já tinham tratamento próprio são 10, e não 9, por mecanismo (try/catch); o vínculo devolve 404 nao_encontrado, então 9 respondem 400 (parametro_invalido) e nenhuma delas corpo_invalido. A aritmética completa está no bloco Contagem acima.

Nota (Inspeção, gate {AUD-13}, Drift 3, 2026-10-06): o Aceite (H1) diz "usuário autenticado", mas a regra vale também para as 6 rotas públicas que leem corpo: sessão (login), cadastro de aluno, cadastro de profissional, conta/confirmar, senha/recuperar e senha/redefinir. Sem sessão, o corpo inválido responde 400 corpo_invalido do mesmo jeito, e o 401, o 403, o 404 e o 429 que hoje vêm antes continuam antes. O H1 não muda; esta nota o estende a essas 6.

Perda declarada, ampliada pelo gate {AUD-13} (Drifts 4, 5, 6 e 7, 2026-10-06): soma-se à Perda declarada acima, e não a substitui. (Drift 4) senha/recuperar: a decisão pinada em senha.test (linha 36: "malformado 202, nunca 400, não vira oráculo") muda para 400 corpo_invalido no malformado. Não vira oráculo, sem revelar se o e-mail existe: o 400 depende só dos bytes de quem chama, nunca do e-mail; o 429 segue antes e {} segue 202. (Drift 5) perdas que o card não previa além de "422 vira 400": o PATCH de perfil com corpo malformado hoje responde 200 (o corpo vira vazio, sem efeito) e passa a 400; null hoje dá 500 nas rotas de administração que leem corpo.x sem ?. e passa a 400; o 410 de conta/confirmar e de senha/redefinir com corpo malformado passa a 400; o 404 do vínculo passa a 400; o 202 de senha/recuperar passa a 400. A tabela por rota, medida no baseline, fica registrada no gate de qa. (Drift 6) 9 rotas trocam parametro_invalido com campo por corpo_invalido (o mesmo 400); o login e o versoes/restaurar de e-mails já respondiam corpo_invalido, e neles muda só a mensagem do malformado. (Drift 7) /api/sessoes/:id/encerrar: o corpo continua opcional (a SPA encerra sem corpo, e vazio segue valendo {}); [], que hoje passa, vira 400.

Ordem: depois de {F5-03}, antes de {F5-04}.

Fechamento [2026-10-06]: entregue e em produção (merge 1c32c5e, repositório wladimirdjr/modularfit, sem migração, https://fit.modulareasy.com (a mesma árvore já provada em produção como ecef515; o deploy da main em 1c32c5e segue em curso); gates plan (APPROVED com 8 drifts, D3, D4 e D5 publicados antes do código), review (rodada 1 APPROVED, 0 Critical, 0 Important) e qa (rodada 1 PASS, 0 P0, 0 P1) verdes). Entregue: o ponto único server/src/http/corpoJson.ts é o único arquivo que toca método de corpo; as rotas de escrita que leem corpo respondem 400 corpo_invalido a JSON malformado, corpo vazio, null, lista, texto e número, na mesma ordem de antes (401, 429, 403, 404 e depois o 400), e {} segue o caminho de hoje; o corpo opcional existe só em /api/sessoes/:id/encerrar. Placar: 52 rotas POST, PUT e PATCH = 37 JSON + 1 multipart + 14 sem corpo; tabela de rotas 38 = 38 no ponto único; 0 leituras fora dele. O verificador verificar:corpo imprime esse placar, reprova método de corpo fora do ponto único e reprova os 13 decoys. H1 provado em produção ({TA-101}): 38 rotas por 6 corpos inválidos dão 400 corpo_invalido sem gravar nada (estado do aluno e do administrador com o mesmo md5 antes e depois), o caminho feliz de cada domínio segue gravando (perfil, consentimento, vínculo, ficha, sessão, refeição, anamnese, avaliação, plano alimentar, exercício e upload) e a SPA segue sem erro de console. Perdas ratificadas: POST /api/vinculos com corpo que não é objeto passa de 403 a 400, com a autorização intacta para corpo válido (aluno e administrador seguem recebendo 403, o profissional segue recebendo 201); [] passa de 404 a 400 em fichas e em /encerrar; null passa de 500 a 400 em 7 rotas; a recuperação de senha com corpo malformado passa a 400 sem revelar se o e-mail existe ({} segue 202 com corpo idêntico para e-mail existente e inexistente). Fora do card, declarado: o qa registrou um P2 preexistente (DELETE /api/admin/exercicios/:id deixa o diretório vazio do exercício no contêiner) e não forçou o 429 do balde antes do 400 nas 3 rotas com balde (cobertura só no teste gerado).

Extensão de {F5-03} sem RF novo; teste {TA-101}.

Fase 3, Treino

Por que esta fase vem aqui. O núcleo do produto é o treino de musculação (Contextualização e J.1 do DRS). Fechadas as fases 1 e 2, que entregam acesso, isolamento, catálogo e vínculo, esta é a primeira fase que entrega valor ao aluno, e é ela que decide se o produto resolve o problema que se propôs a resolver. Dieta (fase 4) e saúde (fase 5) vêm depois por decisão de foco, não por dependência técnica: as duas dependem apenas da fase 2.

Fechamento [2026-09-14]: merge 76bc9cd na main, gates plan, qa e review verdes (processo padrão autônomo, .claude/gates/{plan,qa,review}/modularfit-F3-03.gate), deploy provado em produção (https://fit.modulareasy.com), versão em produção 5d5b2a0, final 76bc9cd; migração 0026_edicao_da_ficha.sql aplicada, última em produção passa de 0025 para 0026. Auxiliar mfit.pode_editar_por_autoria libera o Administrador nas políticas de UPDATE das duas tabelas e no USING da nova política de DELETE de ficha_item; restrição ficha_item_ficha_ordem_unq recriada como DEFERRABLE; gatilhos de auditoria de criação e de alteração instalados nas duas tabelas, sem linha dobrada na transição de estado. PATCH /api/fichas/:id edita numa transação única, reconciliando a lista de itens por identificador (item conhecido com diferença recebe UPDATE, sem identificador recebe INSERT, ausente no corpo recebe DELETE, identificador alheio é recusado antes do banco); status fica fora do PATCH, com desativar e reativar em rotas próprias. /fichas/:id/editar é ESTADO da mesma tela /fichas/nova, sem tela nova. Critério de tabela alterável com auditoria de alteração fecha 7 servidas + 2 declaradas = 9 de 9. Perda declarada e única: o UPDATE do Administrador deixa de ser recusado pela política, RN-009 servida pelas duas camadas. {TA-09} fecha inteiro; {TA-26} continua [ ] com Nota nominal, a metade que falta depende de {F3-09} (duplicar, pendente); {TA-08} sobe de 1 de 11 para 2 de 11, sem fechar. Nenhum outro papel perde capacidade.

Fechamento [2026-09-14]: merge 8f0f9fd na main, gates plan, qa e review verdes (processo padrão autônomo, .claude/gates/{plan,qa,review}/modularfit-F3-04.gate), deploy provado em produção (https://fit.modulareasy.com), versão em produção 8f0f9fd; migração 0027_solicitacao_de_ficha.sql aplicada, última em produção passa de 0026 para 0027. Ficou pronto: as duas formas de pedido (ficha nova e ajuste de uma existente) em colunas próprias (ficha_alvo_id, ficha_id), com motivo_recusa, criado_em e resolvido_em; máquina de estados por gatilho BEFORE UPDATE OF estado, recusando por construção qualquer volta a aberta; três avisos por gatilho na origem (criação, atendimento e recusa), cobrindo por transição os dois caminhos de atendimento, criar ficha ou alterar a existente; quatro rotas (POST /api/solicitacoes, GET /api/solicitacoes, atender, recusar), camada 1 com listas fechadas por papel e o destinatário resolvendo o próprio pedido; os quatro caminhos de tela (/treinos, /treinos/:id, /pro/painel, /fichas/nova?solicitacao=), nenhuma rota nova de catálogo. {TA-27} fecha inteiro; {TA-26} continua [ ] com a Nota atualizada; {ART-WF-05} fecha [x]; {ART-ENT-04} passa a 3 de 6; {ART-SM-03} continua [ ]. Única mudança de comportamento declarada (D-16): a tela de detalhe da ficha, que desde {F3-03} oferecia ao não autor apenas consultar, passa a oferecer consultar e pedir ajuste. Nenhum outro papel perde capacidade.

Nota de escopo (gate {F3-05}, 2026-09-14): o card entrega RF-TREI-005 inteiro e nada além dele. Entra: as duas tabelas da execução (sessao_treino e sessao_serie), com a série gravada a cada registro; a navegação exercício a exercício com mídia, instruções de execução, erros comuns, dicas de execução e a observação do item; o cronômetro geral; o registro de série de carga e de série por tempo; a observação por série e a da sessão; pular exercício; encerrar a qualquer momento; e o bloqueio de tela do dispositivo. Não entra, com dono nominal: o cronômetro de descanso com aviso sonoro é RF-TREI-006 e {F3-06}; a carga anterior e a evolução por exercício são RF-TREI-007 e {F3-07}, e a tela de histórico também; o atalho de retomar no painel e na lista, a retomada e a passagem automática a abandonada são cláusulas do H1 de RF-TREI-010 e {F3-10}; as preferências de treino são {F3-08}; o painel do aluno, e com ele o "treino do dia", é {F7-06}. Ausência é ausência: nada de botão desabilitado, rótulo "em breve" ou banner para o que tem outro dono. Rota: /treinos/sessao é linha própria do Apêndice de catálogo de telas do DRS, com papéis, elementos e estados declarados, e {ART-SCR-01} a relaciona nominalmente a este card; ela não é detalhe de /treinos, ao contrário de /treinos/:id e de /fichas/:id/editar, que os gates de {F3-01} e de {F3-03} declararam como detalhe e estado. Por isso ela é declarada antes de /treinos/:id no arranjo de rotas: o padrão de identificador casa com o literal sessao em qualquer roteador que resolva por ordem de declaração. Persistência: a gravação da sessão e da série no banco a cada registro nasce aqui, por construção da tabela, e não em {F3-10}, cujo "O que implementar" foi reconciliado nesta data. Aritmética: {ART-ENT-04} passa de 3 de 6 para 5 de 6 tabelas e {ART-SCR-01} de 5 de 14 para 6 de 14 telas, e os dois placares só se movem no fechamento, medidos no dia, nunca projetados aqui.

Fechamento [2026-09-15]: merge 80c103e na main, gates plan, qa e review verdes (processo padrão autônomo, .claude/gates/{plan,qa,review}/modularfit-F3-05.gate), deploy provado em produção (https://fit.modulareasy.com), versões em produção 1ac391a e depois 2007262, versão corrente 80c103e; migração 0028_execucao_da_sessao.sql aplicada, última em produção passa de 0027 para 0028. Ficou pronto: as duas tabelas da execução, sessao_treino sem autor_id (Drift 2 corrigido) e sessao_serie; gatilho único que decide o resultado do encerramento pela contagem de séries registradas (concluída ou abandonada), gravando duração, volume por RN-004 e ultimo_registro_em no mesmo ponto; navegação exercício a exercício com mídia, instruções, erros comuns, dicas e observação do item pelo componente único; cronômetro geral; registro de série de carga e de série por tempo; observação por série e da sessão; pular exercício; encerrar a qualquer momento; bloqueio de tela com degradação silenciosa; rota própria /treinos/sessao, declarada antes de /treinos/:id; décimo oitavo verificador (ops/verifica-sessao.mjs). Placar de exibição de texto (verificador 14) medido em 2 de 2; placar de exibição de mídia (verificador 15) medido em 1 de 2, porque o catálogo em produção não tem nenhum exercício com mídia cadastrada, pendência do dono em docs/seed/midia/: {TA-21} continua [ ]. ENTIDADES_ESCRITA_ALUNO sobe de 22 para 24 (Drift 5, ficha_item e sessao_serie); alteração auditada fecha em 12 de 12; forma indireta fecha em 2 servidas + 4 pendentes = 6; autoria de terceiro passa de 11 para 10 pendências (Drift 2). {TA-28} fecha inteiro; {TA-24} fecha inteiro; {TA-20} fecha inteiro; {TA-21} continua [ ] com a Nota; {ART-ENT-04} passa a 5 de 6; {ART-SCR-01} passa a 6 de 14; {ART-SM-03} continua [ ]; {ART-WF-04} continua [ ]. Três mudanças de comportamento declaradas (D-17): /treinos e /treinos/:id passam a oferecer iniciar a sessão; /exercicios/:id passa a renderizar pelo componente único, saída visual inalterada; ficha_item passa a ter a escrita do aluno inativo verificada. Nenhum outro papel perde capacidade.

Nota de fechamento (gate {F3-06}, 2026-09-15): merge f21943f em main, prod f21943f, zero migração, 100 por cento web (web/src/sessoes/descanso.ts, 61 testes web); fonte da verdade é o instante de fim; +15 s; pular; aviso visível com região viva e som por Web Audio sem asset externo; vibração fora, ver {Q2}. {TA-29} continua [ ]: três das quatro cláusulas fecharam com dado real no smoke (começa em sessenta e decresce; o ajuste +15 s; o botão de pular), a quarta (zerar, emitir o aviso e liberar a série seguinte, com a metade de acessibilidade sem som) fechou só a metade sonora, e a metade de acessibilidade não foi testada isoladamente nesta rodada. Gates plan, qa e review verdes.

Nota de fechamento (gate {F3-07}, 2026-09-15): Fechamento [2026-09-15]: merge c331286 na main, gates plan, qa e review verdes (.claude/gates/{plan,qa,review}/modularfit-F3-07.gate), deploy provado em produção (https://fit.modulareasy.com), versões em produção durante o card 7b24dfa, 07cfe0b, final c331286; ZERO migração, última em produção continua 0028. GET /api/sessoes (só sessões concluídas, teto 50 com o total na mesma consulta, janela limite_historico_dias do plano aplicada na leitura, {Q3} Cenário 1); progressão de carga em ponto único server/src/sessoes/progressao.ts sobre TODO o histórico (a janela filtra a listagem, nunca a cadeia: I1 do review, D-8/D-14); carga_anterior_kg por item na execução; sexto critério do verificador de sessão (150 arquivos varridos, decoy visto reprovando); guarda de carregamento de dimensoes.ts estreitada (seção 8 do gate). Tela /treinos/historico (quatro estados de chip na família .mf-etiqueta), bloco de evolução no resumo da execução com Ver histórico, Anterior no item em execução. Testes do web 61 -> 74; server 951 casos. Perda declarada: nenhuma. Achado do qa corrigido no card: chip sem espaço entre nome e valor (gap na família .mf-etiqueta).

Nota de fechamento (gate {F3-08}, 2026-09-15): Fechamento [2026-09-15]: merge ce1787b na main, gates plan, db, qa e review verdes (.claude/gates/{plan,db,qa,review}/modularfit-F3-08.gate), deploy provado em produção (https://fit.modulareasy.com), versões em produção durante o card 10b354b, dfbc498, final ce1787b; migração 0029_preferencia_treino.sql aplicada (3 enums, tabela com 11 colunas, 8 CHECKs, UNIQUE por aluno, RLS com escrita só do papel aluno, REVOKE DELETE, auditoria reusada), última em produção passa de 0028 para 0029. GET/PUT /api/preferencias (upsert único com deduplicação e ordem crescente de dias; 422 por campo; 403 nomeado a administrador e profissional na escrita; ?aluno= só na leitura pelo vinculado) e GET /api/preferencias/catalogo (listas fechadas servidas pela API, fonte única); 19º verificador verifica-preferencias (bijeção 8/3/26 contra pg_enum); placares do verificador de acesso 19 / 24 / 13. Tela /treinos/preferencias nos dois modos (edição do aluno, leitura do profissional vinculado), botão Preferências em /treinos. Testes do web 74 -> 90; server 991. Achados do qa corrigidos no card: arrays de enum devolvidos como texto cru pelo driver (cast ::text[]), e o comando de limpeza recusando conta com preferências. Perda declarada: nenhuma.

Nota de fechamento (gate {F3-09}, 2026-09-15): merge e931e3b na main, gates plan, db, qa e review verdes (.claude/gates/{plan,db,qa,review}/modularfit-F3-09.gate), deploy provado em produção (https://fit.modulareasy.com), versões em produção durante o card c24d6cc, final e931e3b; migração 0030_duplicacao_da_ficha.sql aplicada (só troca a restrição de ficha_origem_id para ON DELETE SET NULL e reescreve o comentário; zero tabela, coluna, índice ou política), última em produção passa de 0029 para 0030. POST /api/fichas/:id/duplicar em transação única (leitura da origem pela RLS do leitor, 404 quando negada; guarda de papel em lista fechada aluno e profissional, administrador 403 nomeado; autor não duplica a própria, 403 nomeado; INSERT ... SELECT dos itens preservando ordem; cópia com o mesmo titular, autor = leitor, ficha_origem_id; 409 limite_do_plano pelo mecanismo existente; origem inalterada). podeDuplicar no ponto único de autoria, botão Duplicar no detalhe só ao não autor, linha Duplicada de com a origem. Testes web 96 -> 102; server 1004 com banco real (qa). Perda declarada: nenhuma. Achado do qa: nenhum bloqueante. {TA-26} e {TA-32} fecham inteiros; {TB-05} continua [ ], beta com aluno real. Placares: {ART-ENT-04}, {ART-SCR-01}, {ART-SCR-02}, {ART-FORM-01}, {ART-CFG-01} e {ART-SM-03} não mudam, nenhuma entidade ou rota nasce; {TA-06} não sobe.

Nota de correção (gate {F4-03}, Drift 5, 2026-09-30): a frase da Nota de escopo acima, "duplicar plano alimentar é da Fase 4 ({F4-03})", está corrigida: duplicar plano alimentar não tem requisito e não é de {F4-03} nem de card nenhum; se o dono quiser, é RF novo mais card. Nada do que {F3-09} entregou muda.

Nota de fechamento (gate {F3-10}, 2026-09-29): merge 047f3bc na main, gates plan, qa (PASS COM RESSALVAS, só de P2 depois da correção de contraste) e review (APPROVED) verdes (.claude/gates/{plan,qa,review}/modularfit-F3-10.gate), deploy provado em produção (https://fit.modulareasy.com), versões em produção durante o card 7b07990 e 3dba4d0, final 047f3bc; migração 0042_abandono_da_sessao_por_prazo.sql aplicada (só reescreve a função mfit.consolidar_sessao() e comentários; zero tabela, coluna, índice, política, gatilho ou concessão), última em produção passa de 0041 para 0042. O que entrou: o atalho de retomar no painel e em /treinos (só para o papel aluno); GET /api/sessoes/atual filtra por predicado e responde 204 à sessão vencida sem escrever; a passagem a abandonada tem escritor único e é acionada de forma preguiçosa nos quatro caminhos de escrita do titular (iniciar, registrar série, atualizar posição e encerrar); uma rotina de operação de hora em hora, em linha própria do agendador do servidor, cobre quem nunca volta; a tela de sessão mostra a mensagem do servidor no 409. O gatilho de encerramento passou a distinguir os dois eventos de E.3: a sessão com séries que passou do prazo termina abandonada, nunca concluída (Drift 1 do gate). Transições de E.3 da sessão servidas por caminho alcançável: 5 de 5 (retomar e prazo decorrido passam a servidas). O prazo é lido de sessao_abandono_horas (24, faixa 2 a 72), editável em /admin/parametros e valendo na próxima avaliação: provado com 24, 2, 4 e 24 sem reiniciar. Perda declarada: a sessão com séries que passou do prazo vira abandonada e suas séries deixam de contar (é o que RF-TREI-010 manda); o atalho some e GET /api/sessoes/atual devolve 204; o erro genérico de encerrar deu lugar à mensagem do servidor no 409; UPDATE direto para abandonada numa sessão com séries passa a produzir abandonada; o painel-marcador deixa de ter só Meu perfil. Para profissional, administrador e super administrador nada muda (provado pelo qa). Ressalvas P2 do qa, que não bloqueiam: P2-01, a mensagem do 409 aparece sem role=alert e não é anunciada por leitor de tela; P2-02, a 400 px o cronômetro quebra para a segunda linha e o aviso de falha fica alinhado à esquerda numa página centralizada; P2-03, a abandonada pela rotina grava fim e duração do momento do fechamento, não do último registro, o que é invisível hoje e deve ser avisado a quem consumir a métrica de {F7-15}. O P1 de contraste do atalho no painel claro (4,36 para 1) foi corrigido e reconferido em produção (4,96 para 1 no claro, 6,25 para 1 no escuro). Lacunas declaradas: a primeira execução automática da rotina horária ainda não foi observada (a linha do agendador foi instalada às 23h12 UTC de 29/09 e o primeiro disparo é às 00h00 UTC de 30/09; o comando é o mesmo que o qa rodou à mão, com contagem 1 e depois 0, idempotente), e o aluno de acesso inativo não foi exercitado. A Fase 3 fecha em código com este card: os dez cards {F3-01} a {F3-10} estão entregues. Da Definição de Pronto da Fase 3, a cláusula da sessão interrompida retomada sem perder série está provada em produção; {TA-79} fecha inteiro (as cláusulas de sequência, calendário e conquistas passaram aos casos donos {TA-55}, {TA-56} e {TA-57}), e o beta de execução continua [ ] por ser beta com aluno real. Placares: {ART-SM-03} fecha (5 de 5), {ART-ENT-04} permanece 6 de 6, {ART-CFG-01} sobe de 33 para 34 de 46 com consumidor no ponto único; {ART-SCR-01} e {ART-SCR-02} não mudam, nenhuma rota de tela nasce.

Definição de Pronto da Fase 3: o aluno executa uma sessão completa no celular, uma sessão interrompida é retomada sem perder série, o histórico mostra a progressão e a autoria da ficha é respeitada em toda edição.

Fase 4, Dieta

Complementar ao núcleo: entra depois do treino inteiro estar no ar, e depende tecnicamente apenas da fase 2.
Definição de Pronto da Fase 4: o aluno registra e enxerga o dia contra a meta, e o nutricionista prescreve e acompanha sem tocar em dado de aluno de outro profissional.

Fase 5, Saúde clínica e evolução

Complementar ao núcleo, e a fase de maior consequência jurídica: nenhuma tela clínica sobe sem o consentimento da fase 1 e sem o aviso de natureza não clínica de RF-CORE-012 no topo dela.

Nota (Inspeção, gate {F5-05}, Drift 2, 2026-10-06): a tabela mfit.prescricao nasce em {F5-05} COM observacoes e SEM a coluna de explicação gerada. Essa coluna é deste card, que a acrescenta à prescrição, por migração própria, ao entregar a explicação nos quatro registros. O H1 não muda e o cartão continua [ ]. Nota (Inspeção, gate {F5-06}, Drift 4, 2026-10-06): a tabela mfit.sessao_reabilitacao nasce em {F5-06} SEM as colunas de explicação gerada (explicacao_gerada e explicacao_gerada_em), que constam da ficha antiga de {ART-ENT-06}. Essas colunas são deste card, que as acrescenta à sessão de reabilitação, por migração própria, ao entregar a explicação nos quatro registros. O H1 não muda e o cartão continua [ ].

Definição de Pronto da Fase 5: nenhuma categoria sensível grava sem consentimento, todo arquivo sensível só sai por endereço assinado e a anamnese do aluno é uma só.

Fase 6, Comunicação

Definição de Pronto da Fase 6: as três formas de conversa funcionam com o isolamento correto, nenhum arquivo entra pelo chat e a notificação não acumula repetição.

Fase 7, Engajamento, painéis e relatórios

Definição de Pronto da Fase 7: cada papel tem o painel da especialidade dele com dado real, o engajamento do aluno reage às ações e os relatórios batem com a base.

Fase 8, Cobrança, geração assistida e integrações

Definição de Pronto da Fase 8: a cobrança fecha aritmeticamente, a geração assistida nunca grava sem revisão humana e o titular consegue levar os dados dele embora.

Fase 9, Guia da plataforma

Dependência: os módulos que o guia descreve já construídos (fases 1 a 8) e a camada interna de geração assistida (F8-05). Escrever o guia de um módulo que ainda vai mudar produz conteúdo que nasce errado.
Definição de Pronto da Fase 9: todo par módulo e papel alcançável tem guia publicado com os sete blocos, o leitor nunca vê rascunho e nenhum conteúdo gerado chegou ao leitor sem revisão humana.

Rotinas de operação a implantar junto da Fase 8

Documento ModularFit: Roadmap de Implementacao
Metodologia MDS · Modular Development Style · 15 blocos / 86 campos
Publicado por Modulareasy
Site modulareasy.com/metodologias/mds