Pular para o conteúdo principal
Modular Development Style · Inventario de Artefatos

ModularFit

Tudo que precisa existir no ModularFit, agrupado por tipo, com a ficha tecnica de cada artefato.

Publicado em 05 de setembro de 2026 Modulareasy · modulareasy.com/mds
Artefatos provisionados ...
Marque cada artefato conforme for criado; o progresso é salvo e compartilhado.

ModularFit: Inventário de Artefatos

CampoValor
ProdutoModularFit
Documento baseDRS do ModularFit
CompanheirosRoadmap de Implementação · Jornadas dos Atores · Plano de Testes
EstágioRascunho para validação
Data2026-09-04
Este documento é o registro de completude do ModularFit: tudo que precisa existir para o sistema funcionar, agrupado por tipo, com a ficha técnica de cada item. Cada cartão responde quatro coisas: para que serve, com o que se relaciona, onde fica e como deve ser. A quarta é a que permite construir sem perguntar; um artefato só listado, sem ficha, é inventário incompleto.

Como usar

  • Marque o artefato quando ele existir no sistema real e a ficha estiver cumprida, não quando a tarefa do roadmap for iniciada.
  • Fichas extensas (formulários, planos, matriz de permissão, catálogo de telas) vivem nos apêndices do DRS; o cartão aponta para lá em vez de repetir.
  • Cada cartão aponta o requisito e a tarefa do roadmap que o criam. Se a tarefa está fechada e o artefato não confere, algo ficou pelo caminho.

Tipos de artefato neste projeto

TipoCódigoQuantosOnde vivem
EntidadeART-ENT9 cartões cobrindo 39 tabelasBanco de dados
FormulárioART-FORM15 cartões cobrindo 16 formuláriosTelas de captura
TelaART-SCR5 cartões cobrindo 38 das 40 rotas do catálogo de telasAplicação
Menu e navegaçãoART-NAV1Aplicação
Papel e permissãoART-ACS13Políticas de acesso
AuditoriaART-AUD1Banco de dados
Máquina de estadosART-SM4Regras de domínio
AutomaçãoART-WF19 cartões, sendo 17 de automação, 1 de semente de contas e 1 de rotina de operaçãoServidor de aplicação
Rotina agendadaART-JOB7Agendador
NotificaçãoART-NOT1 cartão cobrindo 12 tiposCentral de notificações
Mensagem de e-mailART-MSG3Envio transacional
Plano e ofertaART-PROD1 cartão cobrindo 3 planosAdministração de planos
Parâmetro de configuraçãoART-CFG3 cartões: o catálogo de parâmetros (38 fichas desde {AUD-10}, 48 antes), o ponto único que os protege e os modelos de e-mailAdministração
Painel e relatórioART-DASH7Aplicação
MétricaART-KPI1 cartão cobrindo 9 métricasRelatórios e painéis
Serviço externoART-INT4Servidor de aplicação
Segredo de configuraçãoART-ENVV1 cartão cobrindo 12 variáveisAmbiente do servidor
Serviço de infraestruturaART-INFRA1 cartão cobrindo 2 processos e 6 papéisHospedagem
Asset de marcaART-MEDIA1 cartão cobrindo 5 assetsRepositório de mídia

Atualização de 2026-09-30, Inspeção: cards {AUD-11} e {AUD-10}. Um cartão novo, {ART-CFG-03} (modelos de e-mail editáveis), aberto, e Notas nos cartões {ART-ENT-05}, {ART-ACS-09}, {ART-SCR-03}, {ART-CFG-01} e {ART-MSG-01} a {ART-MSG-03}. O documento passa de 96 para 97 cartões, 32 marcados, nenhuma marcação alterada. Na tabela de tipos acima, as telas passam a 40 rotas no catálogo do DRS, a quadragésima é /admin/emails, e 38 delas estão em cartão, conta: 37 mais /admin/emails igual 38, mais /redefinir e /confirmar sem cartão igual 40; o tipo parâmetro passa a três cartões, e a contagem de fichas do catálogo vive em {ART-CFG-01}.
Atualização de 2026-09-30, Inspeção: drifts do gate de {F4-03}. Um cartão novo, {ART-FORM-15} (Plano alimentar), aberto, e Notas ou correções de ficha nos cartões {ART-ENT-05}, {ART-ACS-01}, {ART-ACS-05}, {ART-ACS-07}, {ART-SCR-01}, {ART-WF-06} e {ART-CFG-01}. O documento passa de 97 para 98 cartões, 32 marcados, nenhuma marcação alterada. Na tabela de tipos acima, o formulário passa a 15 cartões cobrindo 16 formulários, conta: 14 cartões mais {ART-FORM-15} igual a 15, e 15 formulários mais o de plano alimentar igual a 16.
Atualização de 2026-09-30, Inspeção: drifts do gate de {AUD-10}. Notas nos cartões {ART-CFG-03} (endereço proibido no assunto, forma da entidade com versão vigente derivada, rotulo, faixa e parametro_legado_id, prévia para os dois papéis, ortografia) e {ART-CFG-01} (a trilha das alterações antigas de assunto continua legível). Nenhum cartão novo, nenhuma marcação alterada.
Atualização de 2026-09-30, Inspeção: drifts do gate de {AUD-11}. Notas nos cartões {ART-AUD-02} (cada entidade sensível declara o seu leitor, no campo leitorUnico, e o leitor de módulo chama registrarSeAdministrativo), {ART-ACS-09} (a restrição por especialidade governa também a escrita da meta) e {ART-CFG-01} (onde vivem os textos de consentimento). Nenhum cartão novo, 98 cartões, 32 marcados, nenhuma marcação alterada.
Atualização de 2026-09-30, fechamento de {AUD-11}. Notas de fechamento nos cartões {ART-ACS-09} (consentimento por entidade 2 de 10, sete categorias), {ART-AUD-02} (leitor único 2 de 10, leitorUnico nas dez entidades) e {ART-ENT-05} (3 de 5 tabelas, inalterado, agora sob a categoria nutrição), em produção no merge 6490072 (migrações 0046 e 0047). Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 33 marcados, medidos na contagem de cartões do endpoint de estado antes e depois.
Atualização de 2026-09-30, fechamento de {AUD-09}. A capacidade "criar ficha de treino" (com duplicar, editar, desativar, reativar, atender e recusar) passa a ser aplicada por especialidade no banco, em produção (merge d760b2d, migração 0045). Um cartão marcado, {ART-FORM-14} (Meta nutricional), entregue por {F4-02} e provado em produção, e Notas nos cartões {ART-ACS-03} e {ART-ACS-05}. O documento continua com 98 cartões e passa de 32 para 33 marcados (32 mais {ART-FORM-14} igual 33), sem cartão novo.
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). Um cartão marcado, {ART-CFG-03} (11 de 11 modelos, conforme o gate), e Fechamentos nos cartões {ART-CFG-01} (os 11 assuntos migrados, catálogo de 48 para 38 fichas, mfit.parametro de 44 para 33), {ART-SCR-03} (/admin/emails, placar de 8 de 11 para 9 de 11) e {ART-MSG-01} a {ART-MSG-03} (texto editável). O documento continua com 98 cartões e passa de 33 para 34 marcados (33 mais {ART-CFG-03}), medidos na contagem de cartões do texto. Nenhum cartão novo.
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). Fechamento no cartão {ART-CFG-01} (consentimento_textos com o consumidor no ponto único, Estado 27 + 0 + 11 = 38, verificador 51 de 98, C 54, universo 152, texto de consentimento em código 7 para 0) e no cartão {ART-SCR-03} (/admin/textos com o grupo Consentimentos, placar 9 de 11 inalterado). Nenhuma marcação alterada: continuam 98 cartões e 34 marcados, medidos na contagem de cartões do endpoint de estado antes e depois; {ART-CFG-01} segue aberto por causa dos 11 parâmetros sem consumidor.
Atualização de 2026-09-30, fechamento de {F4-03}. Plano alimentar entregue e em produção (merge 2f5c560, migração 0052, https://fit.modulareasy.com, /api/estado na versão 2f5c560). Três cartões marcados, {ART-ENT-05} (5 de 5 tabelas), {ART-ACS-05} (papel Nutricionista, com o plano alimentar que faltava) e {ART-FORM-15} (formulário Plano alimentar), e Fechamentos nos cartões {ART-ACS-07} (fronteira de dado clínico 3 de 13, leitor único 3 de 10, consentimento por entidade 3 de 10, capacidade por especialidade 12 de 12) e {ART-SCR-01} (/nutricao/planos, placar de 9 de 15 para 10 de 15). O documento continua com 98 cartões e passa de 34 para 37 marcados (34 mais {ART-ENT-05}, {ART-ACS-05} e {ART-FORM-15}), medidos na contagem de cartões do endpoint de estado antes e depois. Nenhum cartão novo.
Atualização de 2026-09-30, Inspeção: drifts do gate de {F4-04}. Nota no cartão {ART-ENT-05} (a função mfit.comparacao_com_meta, migração 0053, como regra única da comparação do consumo com a meta). Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 37 marcados, medidos na contagem de cartões antes e depois.
Atualização de 2026-09-30, fechamento de {F4-04}. Painel diário de consumo entregue e em produção (merge a6624e9, migração 0053, https://fit.modulareasy.com). Fechamentos nos cartões {ART-ENT-05} (a função mfit.comparacao_com_meta, regra única da comparação; placar inalterado em 5 de 5 tabelas, funções do schema de 57 para 58), {ART-FORM-14} (a meta passa a ser comparada com o consumo, e GET e POST /api/metas ganham o campo painel) e {ART-SCR-01} (/nutricao completa, placar inalterado em 10 de 15). O documento continua com 98 cartões e 37 marcados, medidos na contagem de cartões do endpoint de estado antes e depois: nenhum artefato novo nasce e nenhum muda de marca, porque {ART-ENT-05} e {ART-FORM-14} já estavam marcados e {ART-SCR-01} segue [ ]. Nenhum cartão novo.
Atualização de 2026-09-30, Inspeção: drifts do gate de {F4-05}. Notas nos cartões {ART-CFG-01} (a ficha de nutricao_meta_tolerancia_pct, a entregar em {F4-05} na migração 0054: catálogo de 38 para 39 fichas, mfit.parametro de 33 para 34, Estado 27 + 0 + 11 + 1 a entregar = 39) e {ART-DASH-03} (a regra de meta atingida mora em mfit.meta_atingida, e {F7-08} a consome). A regra do acompanhamento está em RF-DIET-005 do DRS, e a tolerância em L.2. Nenhum cartão novo, 98 cartões, 37 marcados, nenhuma marcação alterada, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-01, fechamento de {F4-05}. Acompanhamento nutricional entregue e em produção (merge f609a9c, migrações 0054 e 0055, https://fit.modulareasy.com). Fechamentos nos cartões {ART-CFG-01} (o parâmetro nutricao_meta_tolerancia_pct ganha o consumidor no ponto único: catálogo de 38 para 39 fichas, mfit.parametro de 33 para 34, Estado 28 com consumidor + 0 + 11 sem consumidor = 39), {ART-ENT-05} (a função mfit.meta_atingida, funções do schema de 58 para 59, placar inalterado em 5 de 5 tabelas), {ART-SCR-01} (/nutricao/acompanhamento é estado de /nutricao, placar inalterado) e {ART-DASH-03} (a regra e a agregação que o painel consome estão entregues; o painel segue [ ] em {F7-08}). O documento continua com 98 cartões e 37 marcados, medidos na contagem de cartões do texto antes e depois: nenhum artefato muda de marca, porque {ART-ENT-05} já estava marcado e os outros três seguem abertos. Verificador de parâmetros: 51 de 98, C 56, universo 154. Nenhum cartão novo.
Atualização de 2026-10-01, Inspeção: drifts do gate de {F5-01}. Notas e correção de ficha nos cartões {ART-FORM-04} (a ficha dos 46 campos, quem preenche qual seção, anamnese sem edição de conteúdo), {ART-ENT-06} (ficha de anamnese corrigida: data sem criado_em, mais desativado_em e desativado_por) e {ART-CFG-01} (as fichas dos dois tetos de texto da anamnese, a entregar em {F5-01} na migração 0056, sem marcar entrega: catálogo de 39 para 41 fichas, mfit.parametro de 34 para 36, Estado 28 + 0 + 11 + 2 a entregar = 41). A decisão de produto está no DRS (RF-SAUD-001, RN-009, L.2 e Apêndice de formulários). Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 37 marcados, medidos na contagem de cartões 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)). Fechamentos nos cartões {ART-FORM-04} (formulário e lista entregues, cartão passa a [x]), {ART-ENT-06} (a tabela anamnese existe, 1 de 9, cartão segue [ ]), {ART-SCR-01} (/saude entregue, 11 de 15, cartão segue [ ]) e {ART-CFG-01} (as duas fichas dos tetos de texto ganham o consumidor no ponto único: catálogo de 39 para 41 fichas, mfit.parametro de 34 para 36, Estado 30 com consumidor + 0 + 11 sem consumidor = 41). O documento continua com 98 cartões e passa de 37 para 38 marcados (37 mais {ART-FORM-04}), medidos na contagem de cartões do texto antes e depois. Verificador de parâmetros: 51 de 98, C 57, universo 155. As rotas /api/anamneses* e o contrato de 46 campos estão descritos nos cartões acima. Nenhum cartão novo.
Atualização de 2026-10-01, Inspeção: drifts do gate de {F5-02}. Notas e correção de ficha nos cartões {ART-FORM-05} (a ficha dos campos da avaliação física, sem edição de conteúdo, regra da comparação), {ART-ENT-06} (ficha de avaliacao_fisica corrigida: sai calculos derivados, entram especialidade_autor, dobras_pontos, dobras_mm, desativado_em e desativado_por; migração 0057) e {ART-CFG-01} (as fichas dos dois tetos de texto da avaliação e a lista ponto_dobra_cutanea, a entregar em {F5-02} na migração 0057, sem marcar entrega: catálogo de 41 para 43 fichas, mfit.parametro de 36 para 38, Estado 30 + 0 + 11 + 2 a entregar = 43, listas fechadas com consumidor de sete para oito no fechamento). A decisão de produto está no DRS (RF-SAUD-002, RN-009, L.2, E.1 e Apêndice de formulários). Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 38 marcados, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-03}. Nota no cartão {ART-FORM-05} (o desenho do bloco de cálculos: detalhe e comparação com a lista de fora, zonas fora da comparação, "não calculado", arredondamento meio para cima e constantes de literatura como exceção C nomeada no verificador de parâmetros), sem marcar entrega. As Notas de RF-SAUD-002, RF-SAUD-003 e RN-004 estão no DRS. Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 39 marcados, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-06, fechamento de {F5-02}. Avaliação física 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)). Fechamentos nos cartões {ART-FORM-05} (formulário, detalhe e comparação entregues, cartão passa a [x]), {ART-ENT-06} (a tabela avaliacao_fisica existe, 2 de 9, cartão segue [ ]), {ART-SCR-01} (as telas /saude/avaliacoes, /saude/avaliacoes/nova e /saude/avaliacoes/:id são estados da casca de /saude, sem décima sexta tela: placar 11 de 15 inalterado) e {ART-CFG-01} (as duas fichas dos tetos de texto da avaliação ganham o consumidor no ponto único e a oitava lista, ponto_dobra_cutanea, entra em produção: catálogo de 41 para 43 fichas, mfit.parametro de 36 para 38, Estado 32 com consumidor + 0 + 11 sem consumidor = 43). A migração 0058 (CHECK estrito de secoes da anamnese, aprovada pelo Fiscal sem card) não muda ficha nenhuma: troca só a forma do CHECK da tabela anamnese já descrita em {ART-ENT-06}. O documento continua com 98 cartões e passa de 38 para 39 marcados (38 mais {ART-FORM-05}), medidos na contagem de cartões do texto antes e depois. Verificador de parâmetros: 51 de 98, C 58, universo 156, 8 listas. Nenhum cartão novo.
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). Fechamento no cartão {ART-FORM-05} (o bloco de cálculos, no detalhe e na comparação, em produção, sem coluna e sem migração; o cartão já estava [x] desde {F5-02}). Nenhuma ficha de configuração muda: as constantes de literatura (220 menos a idade, o índice de massa corporal, a relação cintura quadril e as cinco zonas) não são parâmetro, e o verificador de parâmetros passa de universo 156 para 157 e de exceção C 58 para 59, com 51 de 98 inalterado; mfit.parametro segue em 38 linhas e as listas fechadas em 8. O documento continua com 98 cartões e 39 marcados, medidos na contagem de cartões do texto antes e depois. Nenhum cartão novo.
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). Nenhuma ficha de configuração muda e nenhum cartão do Inventário é tocado: o ponto único server/src/http/corpoJson.ts não cria artefato novo de catálogo, e o verificador verificar:corpo (52 = 37 JSON + 1 multipart + 14 sem corpo; tabela 38 = 38; 13 decoys) entra ao lado dos demais verificadores. O documento continua com 98 cartões e 39 marcados, medidos na contagem de cartões do texto antes e depois. Nenhum cartão novo.
Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-04}. Notas nos cartões {ART-ENT-06} (a ficha de exame corrigida e a migração 0059), {ART-FORM-07} (o exame não se edita, a data, os tetos, o tipo pelos bytes), {ART-INT-02} (limite de envio, desativar sem apagar o objeto, diretório vazio), {ART-ACS-08} (desativação do exame), {ART-ACS-10} (ramo de cota de anexos) e {ART-CFG-01} (três tetos de texto, a lista tipo_exame e a aritmética do catálogo), todas a entregar em {F5-04}, sem marcar entrega. Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 39 marcados, medidos na contagem de cartões 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, 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). Fechamentos nos cartões {ART-FORM-07} (formulário, lista e detalhe entregues, cartão passa a [x]), {ART-ENT-06} (a tabela exame existe, 3 de 9, cartão segue [ ]), {ART-INT-02} (escrita no repositório privado entregue, 2 de 2 repositórios com escrita, cartão segue [ ] por {F5-09} e {F5-08}), {ART-ACS-08} (desativação do exame), {ART-ACS-10} (ramo de cota de anexos) e {ART-CFG-01} (as três fichas dos tetos de texto e a lista tipo_exame ganham o consumidor: catálogo de 43 para 46 fichas, mfit.parametro de 38 para 41, listas fechadas de 8 para 9, Estado 35 com consumidor + 0 + 11 sem consumidor = 46). O documento continua com 98 cartões e passa de 39 para 40 marcados (39 mais {ART-FORM-07}), medidos na contagem de cartões do texto antes e depois. Nenhum cartão novo.
Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-05}. Notas nos cartões {ART-FORM-08} (o cartão cobre dois formulários e {F5-05} entrega só a prescrição, sem marcar; duração estruturada, aviso do receituário como texto versionado) e {ART-CFG-01} (a ficha de prescricao_texto_longo_max_caracteres, a entregar em {F5-05}; o catálogo de 46 para 47 fichas e mfit.parametro de 41 para 42 linhas, sem marcar entrega). Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 40 marcados, medidos na contagem de cartões 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). Fechamentos nos cartões {ART-ENT-06} (a tabela prescricao existe, 4 de 9, cartão segue [ ]), {ART-FORM-08} (a metade da prescrição entregue, cartão segue [ ] e só {F5-06} o marca) e {ART-CFG-01} (a ficha prescricao_texto_longo_max_caracteres ganha o consumidor: catálogo de 46 para 47 fichas, mfit.parametro de 41 para 42 linhas, Estado 36 com consumidor + 0 + 11 sem consumidor = 47, cartão segue [ ]). Nenhum cartão muda de marca e nenhum nasce: continuam 98 cartões e 40 marcados, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-06}. Notas nos cartões {ART-ENT-06} (a ficha de sessao_reabilitacao corrigida, migração 0062; tabelas deste cartão de 4 para 5 de 9 na entrega, sem marcar), {ART-FORM-08} (a sessão de reabilitação é a metade que fecha o cartão, a entregar em {F5-06}, sem marcar) e {ART-CFG-01} (a ficha de reabilitacao_texto_longo_max_caracteres e a lista regiao_corporal, a entregar em {F5-06}; o catálogo de 47 para 48 fichas, mfit.parametro de 42 para 43 linhas e as listas fechadas de 9 para 10, sem marcar entrega). Nenhum cartão novo e nenhuma marcação alterada: continuam 98 cartões e 40 marcados, medidos na contagem de cartões do texto antes e depois.

Entidades

Fechamento [2026-09-14]: solicitacao_ficha em produção (migração 0027_solicitacao_de_ficha.sql, merge 8f0f9fd), com as colunas reconciliadas (ficha_alvo_id, ficha_id, motivo_recusa, criado_em, resolvido_em) e os dois índices por papel. Placar passa de 2 de 6 para 3 de 6 tabelas; sessao_treino, sessao_serie e preferencia_treino seguem pendentes, donos {F3-05}, {F3-08} e {F3-10}.

Nota (gate {F3-08}, Drift 7, 2026-09-15): a ficha de preferencia_treino acima foi reconciliada nesta data, e a reconciliação é da FICHA, nunca do requisito. Três lacunas medidas e fechadas: objetivos, equipamentos e dias não declaravam tipo nenhum, e quem fosse codar escolheria entre conjunto, texto separado por vírgula e tabela filha em silêncio; não havia coluna de auditoria, e sem atualizado_em a leitura do valor vigente que M.3 exige não tem como se provar; e a cláusula de índices nomeava seis índices, nenhum desta tabela. Uma contradição também se resolve: E.2 dizia um para muitos e {ART-ENT-04} diz aluno_id único, dois artefatos publicados dizendo coisas incompatíveis sobre a mesma tabela, e o diagrama do DRS foi corrigido para um para um, porque o cartão e o H1 (os valores aparecem preenchidos ao reabrir a tela, no singular) mandam uma linha por aluno. Daí decorre a declaração de histórico, que se escreve porque toda entidade de registro a deve: preferência não guarda série, guarda o valor vigente, e o passado não se perde, porque a trilha imutável de RF-CORE-009 grava valor anterior e valor novo a cada alteração pelo gatilho genérico; tela de histórico de preferências, se o dono a quiser, é card novo. Este cartão fecha [x] em 6 de 6 tabelas quando {F3-08} entregar: preferencia_treino é a sexta e última. E uma atribuição errada, publicada na Nota do gate {F3-04}, se corrige de passagem: sessao_serie é de {F3-05}, não de {F3-10}; a frase que diz "donos {F3-05}, {F3-08} e {F3-10}" ordena as três tabelas de modo a sugerir o contrário, e índice que atribui errado também faz placar mentir. Fechamento [2026-09-15]: preferencia_treino em produção (migração 0029_preferencia_treino.sql, merge ce1787b, https://fit.modulareasy.com). Placar fecha em 6 de 6 tabelas, a sexta e última. Nota (gate {F3-09}, Drift 7, 2026-09-15): a coluna ficha_origem_id de ficha_treino, já escrita por extenso nesta Especificação, ganha caminho de escrita em {F3-09}, e nenhuma tabela nasce: o placar deste cartão não se move por este card. A dívida deixada por declarar na migração que criou a coluna, com {F3-09} nominado dono por escrito, fecha aqui: a referência passa a ser anulada quando a ficha de origem é excluída em definitivo. As alternativas de recusa fariam a primeira cópia criada em produção revogar na prática o direito de exclusão em definitivo que RF-CORE-008 e RN-008 dão ao Administrador sobre a origem, e o sintoma chegaria como erro de banco sem mensagem de produto; a alternativa em cascata apagaria as fichas que os alunos construíram a partir dela, que são registros de outra autoria e outro titular, contradizendo de frente a consequência escrita de ADR-006. Anular perde a referência, que é o único fato que deixa de ter onde apontar, e não perde a cópia nem a história: o momento da duplicação fica na trilha imutável de RF-CORE-009 gravada pelo gatilho de criação, e a própria anulação gera entrada de auditoria pelo gatilho de alteração, de modo que a pergunta de onde esta ficha veio continua respondível depois de a origem sumir. Duas ausências declaradas, porque ausência não declarada vira suspeita: sem índice em ficha_origem_id, porque consulta nenhuma do produto filtra por ela e a leitura vai sempre da cópia para a origem por chave primária, e o índice nasce com a consulta de cópias de uma ficha se ela vier a existir, em card novo; e sem restrição de verificação impedindo a ficha de apontar para si mesma, porque é inalcançável por construção, já que o identificador da cópia é gerado no próprio comando de inserção e não há caminho de atualização que escreva a coluna. Placar que não muda também se declara, senão o leitor supõe que ninguém olhou.

Fechamento [2026-09-15]: {F3-09} em produção (merge e931e3b, migração 0030_duplicacao_da_ficha.sql aplicada, última em produção passa de 0029 para 0030, https://fit.modulareasy.com). A dívida do ON DELETE de ficha_origem_id, deixada por declarar em 0025 e nominada a este card na Nota acima, fecha em produção: ON DELETE SET NULL confirmado (confdeltype = 'n', gate de db-ops). Placar não se move, continua 6 de 6 tabelas.

Nota (gate {F3-05}, Drifts 2, 6 e 11, 2026-09-14): três declarações sobre as duas tabelas da execução, e nenhuma delas muda o placar deste cartão, que continua 3 de 6 tabelas até o fechamento. Primeira, autoria. sessao_treino não tem autor_id e não passa a ter: a sessão é sempre executada pelo próprio aluno titular, a Matriz Ator por Capacidade dá a capacidade de executar e retomar sessão de treino ao Aluno e a nega aos cinco demais papéis, e a lista de autoria de RN-009 não a inclui. Não existe terceiro a autorar uma execução, e a especificação acima sempre esteve certa. A consequência é do lado do verificador, que enumera o universo de autoria por catálogo (toda tabela com coluna autor_id) e por isso nunca alcançaria esta tabela: a declaração antecipada de autoria de terceiro que vive no código desde {F2-07} é corrigida em {F3-05}, com a aritmética e o motivo do eixo reescritos, e não o contrário. Sem essa correção o nome da tabela ficaria pendente para sempre num placar que nenhum card poderia fechar. Segunda, persistência. A série gravada a cada registro, que esta ficha já exige, é obrigação de {F3-05} por construção da tabela, e o "O que implementar" de {F3-10} foi reconciliado nesta data para deixar de reivindicá-la. Terceira, tempo sob tensão. O cálculo derivado de RN-004, soma do tempo de execução das séries registradas por tempo, não ganha coluna aqui e não tem ponto de exibição: o dado bruto existe em sessao_serie.duracao_segundos, linha a linha, e o total é derivável a qualquer momento por quem tiver onde mostrá-lo. Criar coluna agora seria guardar número que ninguém lê, e inventar tela seria escopo nascido num gate. Se o cálculo precisar de dono, isso é card novo no roadmap, nunca coluna silenciosa aqui. Ausência declarada, no molde das de {ART-CFG-01} e {ART-ACS-08}.

Nota (gate {F3-06}, 2026-09-15): o descanso real decorrido entre séries não ganha coluna, não ganha ponto de exibição e não entra em RN-004; o alvo prescrito continua em ficha_item.descanso e o decorrido é estado efêmero de tela. Se um dia precisar de dono, é card novo no roadmap, nunca coluna silenciosa aqui. O placar deste cartão fica em 5 de 6 tabelas, o valor que {F3-05} deixa: {F3-06} não cria tabela, coluna, índice, restrição, política, gatilho nem função. A sexta, preferencia_treino, continua em {F3-08}.

Decisão declarada (gate {F3-05}, D-8, 2026-09-14): o encerramento da sessão decide pelo resultado, não pelo que a tela pediu, e a decisão vive num ponto único no banco: um gatilho de BEFORE UPDATE OF status em sessao_treino, disparado quando o status sai de em andamento, conta as séries registradas naquele instante e naquela transação e grava concluida se houver ao menos uma, abandonada se não houver. A rota pede "encerrar" e nunca manda um estado: E.3 não dá essa escolha ao ator, e deixar a rota escolher daria ao cliente o poder de gravar concluída numa sessão vazia, o que transformaria status num campo que assume o valor que a tela mandou, isto é, enfeite. No mesmo gatilho e na mesma transação são gravados fim, duracao_segundos (do relógio do servidor, a partir de inicio, nunca do cronômetro da tela, que é desenho) e volume_kg pela fórmula de RN-004 escrita uma vez, somando apenas as séries com carga e repetições preenchidas e ignorando as séries por tempo, sem erro e sem contar zero no lugar de vazio; sessão sem nenhuma série de carga tem volume zero porque não há o que somar, não porque alguém escreveu zero. ultimo_registro_em também é do gatilho, tanto no UPDATE da sessão quanto no INSERT e no UPDATE da série, por gatilho próprio na tabela filha, e a rota nunca escreve essa coluna: se escrevesse, um caminho novo de registro nasceria mudo e a retomada de {F3-10} leria uma verdade velha. Por que no banco e não na aplicação: a fórmula de RN-004 terá três leitores ({F3-05} no encerramento, {F3-07} no histórico e na progressão, {F7-05} no gráfico) e dois escritores de sessão (a rota de hoje e a retomada de {F3-10}); no gatilho ela é exaustiva por construção, inclusive para o caminho que ainda não existe, e na aplicação seria exaustiva por disciplina, que falha em silêncio, porque volume errado não levanta erro. É o mesmo raciocínio que já pôs a notificação no gatilho da origem. Consequência: não existe janela em que uma sessão esteja concluída sem volume, e por isso a cláusula de duração maior que zero do H1 de RF-TREI-005 é provável.

Nota (gate {F3-10}, Drift 1, 2026-09-29): o gatilho distingue os dois eventos de E.3 que saem de em andamento: encerrar, decidido pelo resultado (contagem de séries), e prazo decorrido, cujo resultado é a própria guarda de tempo, avaliada no relógio do banco pelo escritor único (D-2); prazo decorrido leva a abandonada com qualquer número de séries.

Nota (gate {F3-10}, Drift 4, 2026-09-29): o evento prazo decorrido de E.3 tem executor, e nenhum deles é um {ART-JOB} nem um {ART-WF}. Quatro pontos preguiçosos de escrita (iniciar, registrar série, atualizar posição e encerrar, todos do aluno titular) passam a abandonada a sessão vencida de quem volta; a leitura por predicado garante que esse aluno nunca veja a sessão vencida como em andamento; e uma rotina de operação de hora em hora, uma linha de crontab e NÃO um {ART-JOB}, cobre quem nunca volta. A janela aberta é de até uma hora e vale só para leitores terceiros, porque o próprio aluno nunca a vê.

Fechamento [2026-09-15]: sessao_treino e sessao_serie em produção (migração 0028_execucao_da_sessao.sql, merge 80c103e), com as colunas, os índices e as integridades desta ficha, sem autor_id em sessao_treino (Drift 2). Placar passa de 3 de 6 para 5 de 6 tabelas; preferencia_treino segue pendente, dono {F3-08}.

Fechamento [2026-09-29] de {F3-10}: em produção (migração 0042_abandono_da_sessao_por_prazo.sql, merge 047f3bc): a decisão declarada acima passa a distinguir os dois eventos de E.3 que saem de em andamento. Encerrar continua decidido pelo resultado (com série, concluída; sem série, abandonada); prazo decorrido leva a abandonada com qualquer número de séries, porque a guarda de tempo já foi avaliada no relógio do banco pelo escritor único. fim, duracao_segundos e volume_kg continuam calculados no mesmo gatilho para os dois eventos. A migração só reescreve a função do gatilho e comentários: nenhuma tabela, coluna, índice, política, gatilho ou concessão nasce, e o placar deste cartão permanece 6 de 6.


Formulários


Telas e navegação

Nota (gate {F3-05}, Drift 10, 2026-09-14): este é o primeiro card da Fase 3 que acrescenta rota ao catálogo, e o placar só se move no fechamento, medido no dia: 5 de 14 passa a 6 de 14 com /treinos/sessao. Ela é linha própria do Apêndice de catálogo de telas do DRS, com papéis, elementos e estados declarados, e este cartão já a relaciona nominalmente ao card {F3-05}; por isso ela não recebe o tratamento de /treinos/:id e de /fichas/:id/editar, que os gates de {F3-01} e de {F3-03} declararam detalhe e estado de outra tela. Decisão de desenho que vem junto: /treinos/sessao é declarada antes de /treinos/:id no arranjo de rotas, porque o padrão de identificador casa com o literal sessao em qualquer roteador que resolva por ordem de declaração, e a prova é pela URL real, abrindo a execução e não o detalhe de uma ficha chamada "sessao".

Fechamento [2026-09-15]: /treinos/sessao em produção (merge 80c103e, https://fit.modulareasy.com), declarada antes de /treinos/:id no arranjo de rotas, provado pela URL real abrindo a execução. Placar sobe de 5 de 14 para 6 de 14.

Nota (gate {F3-07}, 2026-09-15): /treinos/historico é a segunda rota que a Fase 3 acrescenta ao placar, e ele só se move no fechamento, medido no dia: 6 de 14 passa a 7 de 14. Ela é linha própria do Apêndice de catálogo de telas do DRS, com rota, papéis, elementos e estados declarados, e por isso não recebe o tratamento de /treinos/:id e de /fichas/:id/editar, que os gates de {F3-01} e de {F3-03} declararam detalhe e estado de outra tela. Ela serve os dois papéis (o Apêndice declara Aluno, Profissional) e por isso não conta de novo em {ART-SCR-02}, que continua 1 de 4: o profissional chega à mesma rota com o aluno na consulta, no precedente literal de /perfil, de /treinos e de /fichas/nova. A rota é declarada antes de /treinos/:id no arranjo, pelo mesmo motivo já escrito para /treinos/sessao: o roteador resolve por ordem de declaração. Os dois pontos de entrada nascem juntos, o botão Histórico no cabeçalho de /treinos, desenhado desde o início e nunca construído, e o link Ver histórico no resumo da execução, que desfaz o beco sem saída hoje declarado por comentário datado no código. A janela de retenção do histórico visível do plano é aplicada nesta leitura, e a dimensão, que não tinha card dono em nenhuma das oito fases, passa a ter {F3-07} como dono declarado; os dois cenários e a decisão estão em {Q3} do Questionário.

Fechamento [2026-09-15]: /treinos/historico em produção (merge c331286, https://fit.modulareasy.com). Placar sobe de 6 de 15 para 7 de 15.

Nota (gate {F3-08}, 2026-09-15): o universo deste cartão passa de 14 para 15 telas. A tela de preferências de treino, /treinos/preferencias, ganhou linha própria no Apêndice de catálogo de telas do DRS nesta mesma republicação: ela não existia em catálogo nenhum, embora o H1 de RF-TREI-008 comece por "Dado um aluno na tela de preferências" e {ART-FORM-03} já declarasse que o formulário fica nela. É linha própria, e não detalhe nem estado de /treinos, porque os sete campos são outros sete, com formulário próprio, ficha própria e navegação própria, ao contrário de /treinos/:id, de /exercicios/:id e de /fichas/:id/editar. Ela serve os dois papéis (o Apêndice declara Aluno e Profissional) e por isso é contada uma vez, aqui, e não conta de novo em {ART-SCR-02}, que continua 1 de 4: o profissional chega à mesma rota com o aluno na consulta, em somente leitura, no precedente literal de /perfil, de /treinos, de /fichas/nova e de /treinos/historico. Nova aritmética, conferida somando: 6 entregues mais 1 marcador (/painel) mais 8 pendentes igual a 15. Nenhuma entrega muda nesta data, só o universo. Duas consequências de placar, e as duas se escrevem para ninguém supor: o fechamento de {F3-07} vale 7 de 15, e a Nota dele acima diz 7 de 14 porque foi escrita antes desta mudança de universo, divergência de data e não de contagem; e o fechamento de {F3-08} vale 8 de 15, medido no dia, nunca projetado. A rota é declarada antes de /treinos/:id no arranjo, pelo mesmo motivo já escrito para /treinos/sessao e para /treinos/historico: o roteador resolve por ordem de declaração.

Fechamento [2026-09-15]: /treinos/preferencias em produção (merge ce1787b, https://fit.modulareasy.com), tela única servindo os dois papéis (edição do aluno, leitura somente do profissional vinculado). Placar sobe de 7 de 15 para 8 de 15.

Fechamento [2026-09-30] de {F4-01}: /nutricao em produção (merge 5e36145, https://fit.modulareasy.com), em versão mínima, no tratamento que {F3-01} deu a /treinos: navegador de data, refeições do dia com os quatro totais de cada uma, Registrar refeição, Desativar e o vazio do dia. /nutricao/refeicoes/nova é estado da mesma tela, sem rota contada à parte. Placar sobe de 8 de 15 para 9 de 15; {F4-04} completa a tela com os quatro cartões contra a meta e o total do dia. Para o Administrador nenhuma das duas rotas existe: ambas redirecionam a /admin, e o painel dele não mostra Nutrição. Nota (gate {F4-02}, Drift 4, 2026-09-29): {F4-02} abre /nutricao?aluno=<id> ao Profissional (leitura do dia pela API que {F4-01} já serve, sem Registrar refeição e sem Desativar) e entrega o bloco "Metas do dia" nas duas pontas, com Editar metas quando o servidor disser que pode, e o histórico de metas. /nutricao/metas é ESTADO de /nutricao, não uma décima sexta tela (mesmo critério de /nutricao/refeicoes/nova e de /fichas/:id/editar), e a tela continua contada uma vez só aqui, e não em {ART-SCR-02}, que continua 1 de 4, no precedente de /perfil, /treinos e /fichas/nova. A COMPARAÇÃO (consumido, restante, percentual) continua de {F4-04}, que lê a meta do dia do MESMO ponto único, mfit.meta_vigente; nenhum segundo leitor. O placar 9 de 15 não se move nesta Nota.

Fechamento [2026-09-30] de {F4-02}: em produção (merge b569460, https://fit.modulareasy.com), /nutricao ganha o bloco "Metas do dia" (os quatro valores da meta, o autor e o histórico de metas) e o formulário "Meta nutricional" (Editar metas, com confirmação, ficha em {ART-FORM-14}) para o aluno titular e para o Nutricionista de vínculo ativo. /nutricao?aluno=<id> abre ao Profissional de vínculo ativo, em leitura, sem Registrar refeição e sem Desativar; quando o servidor nega a leitura, a tela mostra o cartão "Sem permissão para ver estes dados" com "Voltar à carteira", nunca erro cru nem lista vazia. O Administrador é redirecionado a /admin (a API segue com 403 nomeado). /alunos ganha o link Nutrição no vínculo de Nutricionista. Nenhuma rota nova entra na contagem: o placar 9 de 15 segue inalterado, e a comparação do consumo com a meta continua de {F4-04}. Nota (gate {F4-03}, Drift 4, 2026-09-30): /nutricao/planos já é contada neste cartão e já é linha do Apêndice de catálogo de telas do DRS; {F4-03} a entrega com ESTADOS /nutricao/planos/:id, /nutricao/planos/novo e /nutricao/planos/:id/editar (formulário único), no precedente de /fichas/nova e de /fichas/:id/editar, e nenhum dos três é décima sexta tela. A rota /planos/novo do mockup não entra no catálogo, porque colidiria de leitura com /plano; o Profissional chega ao formulário vindo de /alunos, com o aluno na consulta. O placar 9 de 15 só muda no fechamento de {F4-03}, para 10 de 15, medido no dia e nunca projetado aqui. Fechamento [2026-09-30] de {F4-03}: /nutricao/planos em produção (merge 2f5c560, https://fit.modulareasy.com), para o aluno e para o Profissional vinculado (com ?aluno= vindo de /alunos), com os estados /nutricao/planos/:id, /nutricao/planos/novo e /nutricao/planos/:id/editar e sem rota nova contada à parte. Placar sobe de 9 de 15 para 10 de 15. Para o Administrador a API segue com 403 nomeado nas seis rotas. As cinco restantes (/nutricao completa por {F4-04}, /evolucao, /saude, /integracoes, /cobranca) continuam nos cards donos; o cartão permanece [ ]. Fechamento [2026-09-30] de {F4-04}: /nutricao completa em produção (merge a6624e9, https://fit.modulareasy.com): o bloco "Metas do dia" ganha no topo os quatro cartões contra a meta e o total do dia, no desenho da tela 11 do mockup, e o Profissional vinculado com a categoria de nutrição visível os vê em /nutricao?aluno=, sem Registrar nem Desativar. Sem rota nova: a tela já contava desde {F4-01}, por isso o placar fica inalterado, 10 de 15 (placar que não muda também se declara). As cinco restantes (/evolucao, /saude, /integracoes, /cobranca e o painel marcador /painel) continuam nos cards donos; o cartão permanece [ ]. Fechamento [2026-10-01] de {F4-05}: /nutricao/acompanhamento?aluno= em produção (merge f609a9c, https://fit.modulareasy.com) como ESTADO de /nutricao, no precedente de /nutricao/metas: sem linha nova no catálogo de telas e sem décima sexta tela. Placar inalterado, o declarado no fechamento de {F4-04}. A tarefa F4-05 entra no Relacionado deste cartão. O Aluno não ganha tela de acompanhamento: a rota o redireciona para /painel. Os links do topo das dezesseis telas passam a um componente único com área de toque de 2,75rem em 375 de largura, destino e texto iguais. Fechamento [2026-10-01] de {F5-01}: /saude em produção (merge 9cb16f3, repositório wladimirdjr/modularfit, migração 0056, https://fit.modulareasy.com (/api/estado na versão 9cb16f3)), com os estados /saude/anamneses/nova e /saude/anamneses/:id (sem décima sexta tela), para o aluno e para o Profissional vinculado (com ?aluno=); o Administrador volta a /admin. A casca traz o aviso de natureza não clínica no topo e serve as quatro telas clínicas por abas, de modo que as abas de exame, prescrição e reabilitação nascem dentro dela. Placar sobe de 10 de 15 para 11 de 15 (aritmética: 11 entregues mais 1 marcador /painel mais 3 pendentes, /evolucao, /integracoes e /cobranca, igual 15). Entradas por interface: link "Saúde" no painel do aluno e na linha ativa de /alunos. O cartão continua [ ]. Fechamento [2026-10-06] de {F5-02}: /saude/avaliacoes, /saude/avaliacoes/nova e /saude/avaliacoes/:id 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)) como ESTADOS da casca de /saude, no precedente das telas da anamnese: aba Avaliações dentro da casca, com o aviso não clínico no topo. Sem linha nova no catálogo de telas e sem décima sexta tela: o placar fica inalterado, 11 de 15 (placar que não muda também se declara), e as três pendentes (/evolucao, /integracoes e /cobranca), mais o painel marcador /painel, seguem nos cards donos (11 entregues mais 1 marcador mais 3 pendentes igual 15). O cartão continua [ ].

Nota (gate {F3-05}, 2026-09-14): nenhuma tela do profissional nasce, muda ou é alcançada aqui, e o placar continua 1 de 4. A execução da sessão é do aluno titular e de mais ninguém: nem o profissional vinculado nem o Administrador executam, retomam ou registram série, e a Matriz Ator por Capacidade nega a capacidade aos cinco papéis não titulares. O que o profissional passa a ver do treino executado é o histórico, cujo card dono é {F3-07}. Placar que não muda também se declara.

Fechamento [2026-09-15]: confirmado inalterado. Em produção (80c103e), nenhuma tela do profissional nasceu, mudou ou foi alcançada. Placar continua 1 de 4.

Nota (gate {F3-08}, 2026-09-15): nenhuma tela do profissional nasce aqui. /treinos/preferencias serve os dois papéis mas é contada uma vez só, em {ART-SCR-01}, pelo precedente já firmado de /perfil, /treinos, /fichas/nova e /treinos/historico; o profissional vinculado chega à mesma rota com o aluno na consulta, em somente leitura. Placar inalterado, 1 de 4. Fechamento [2026-09-15]: confirmado inalterado. Em produção (ce1787b), nenhuma tela do profissional nasceu. Placar continua 1 de 4.


Papéis, permissão e auditoria

Nota (gate {F3-05}, 2026-09-14): sessao_treino e sessao_serie nascem em {F3-05} e entram no universo deste auxiliar pelo critério que já existe, sem ninguém precisar lembrar: a primeira tem coluna aluno_id e recebe a política de leitura chamando mfit.pode_ler_aluno; a segunda não tem titular próprio e é alcançada pela sessão mãe, na forma indireta já usada por ficha_item. O total de dezoito não muda, e o motivo se escreve antes de alguém estranhar: as dezoito são as dezesseis entidades de dado de aluno nomeadas por RF-CORE-006 mais as duas de classe restrita, e sessao_treino já está entre as dezesseis desde que E.1 foi escrita. O que sobe é a contagem de servidas, e ela sobe no fechamento, medida no dia, nunca projetada aqui.

Fechamento [2026-09-15]: sessao_treino e sessao_serie em produção (migração 0028, merge 80c103e), cobertas pelo auxiliar: a primeira por política de leitura chamando mfit.pode_ler_aluno, a segunda pela forma indireta já usada por ficha_item. Placar de E.1 sobe de 4 servidas + 17 pendentes = 21 para 5 servidas + 16 pendentes = 21. Placar do critério (a), cobertas mais pendentes igual a 18, continua inalterado. Nota (gate {F4-02}, Drift 1, 2026-09-29): a lista única de entidades de E.1 em server/src/acesso/verificarPoliticas.ts marcava meta_nutricional como sem autor de terceiro (temAutorDeTerceiro: false), e a entrada estava errada desde {F2-07}: RF-DIET-002 dá a escrita ao Nutricionista vinculado, E.1 tem autor e a ficha de {ART-ENT-05} tem autor_id. Com o valor errado o critério (e) do verificador nunca olharia esta tabela, e a autoria na leitura (condição 3) e a negação de escrita do vínculo encerrado ficariam sem verificador. Só a lista única muda (passa a true, e a trava CARDS_AUTORIA_PENDENTES sobe de 10 para 11); nenhum requisito muda, e a correção de código é de {F4-02}. Nota (gate {F4-02}, Drift 3, 2026-09-29): o critério (e) do mesmo verificador lia errado a forma de quatro argumentos de mfit.pode_ler_aluno, que nasceu em {F4-01}: qualquer vírgula contava como "passa autor_id". O defeito só aparece agora porque meta_nutricional é a primeira tabela da fronteira clínica COM autor. Sem o conserto, a política de inserção correta reprovaria (NULL no segundo argumento visto como autor) e uma política de leitura errada passaria. A regra corrigida: o critério lê o SEGUNDO argumento literal, "com autor" é pode_ler_aluno(<coluna_titular>, autor_id e nada mais, e NULL no segundo argumento é "sem autor". Prova exigida: decoy nos dois sentidos (leitura com NULL reprova, inserção com autor_id reprova), controle (a forma certa passa) e os casos de três argumentos que já passavam continuando a passar. Nenhum requisito muda e a especificação do auxiliar acima não muda; a correção é do verificador, em {F4-02}. Fechamento [2026-09-30] de {F4-02}: meta_nutricional em produção (migração 0044, https://fit.modulareasy.com) é a segunda entidade da fronteira de dado clínico servida, 2 de 13, e a primeira com autor: as políticas chamam mfit.pode_ler_aluno com o quarto argumento 'meta_nutricional'. Medido pelo qa: o Administrador recebe 403 nomeado e lê 0 das 3 linhas existentes no banco, o INSERT dele é negado (42501), e o par positivo do titular lê as 3 e insere. O cartão continua [x], sem mudança de escopo. Nota de gabarito (gate {F4-03}, Drift 3, 2026-09-30): o gabarito de acesso passa a ter DUAS perguntas de capacidade por especialidade, cada uma com o seu auxiliar, e nenhuma delas é o auxiliar de leitura deste cartão, que continua um só. mfit.tem_vinculo_ativo_na_especialidade(p_aluno, p_especialidade) ({F4-02}) pergunta sobre o ATOR: o usuário atual, como profissional, tem vínculo ativo com o aluno naquela especialidade? mfit.aluno_tem_vinculo_ativo_na_especialidade(p_aluno, p_especialidade) ({F4-03}, migração 0046) pergunta sobre o TITULAR: o aluno tem, hoje, vínculo ativo com profissional daquela especialidade? O segundo é STABLE SECURITY DEFINER, responde somente a quem já lê o aluno e devolve false a quem não lê, nunca um oráculo, e é a mesma pergunta que RF-SAUD-001 fará em {F5-01} ("quando não há profissional daquela especialidade vinculado"). Ratificação da Inspeção: a ordem de {AUD-09} dizia "nunca um segundo auxiliar", e essa regra vale para a pergunta de capacidade do ATOR, que continua uma só; a cláusula "ou o próprio aluno na ausência de um" de RF-DIET-003 pergunta sobre o titular, e o auxiliar do ator não a responde. Alternativa recusada: um EXISTS colado na política e copiado no servidor, que dá duas cópias da mesma pergunta. Nota de correção (Inspeção, gate {F4-03}, Drift 9, 2026-09-30): na Nota de gabarito acima, a migração de mfit.aluno_tem_vinculo_ativo_na_especialidade ({F4-03}) é a 0052, e não a 0046. A 0046 é da categoria nutricao ({AUD-11}), que existe desde então. Fechamento [2026-09-30] de {F4-03}: plano_alimentar e plano_refeicao em produção (migração 0052, https://fit.modulareasy.com) chamam mfit.pode_ler_aluno com o quarto argumento 'plano_alimentar' em toda política das duas tabelas (a filha passa o nome da mãe). Fronteira de dado clínico: 3 de 13 entidades servidas. Medido pelo qa: o Administrador recebe 403 nomeado nas seis rotas, lê 0 das 7 linhas existentes no banco e tem a escrita recusada, com os pares positivos (titular lê, Nutricionista insere e atualiza). Placares: leitor único 3 de 10, consentimento por entidade 3 de 10, capacidade por especialidade 12 de 12. O verificador ganha a fronteira à esquerda do nome do auxiliar de capacidade (o auxiliar do titular deixa de ser lido como o do ator) e a exceção nominal FILHAS_COM_EXCLUSAO_NA_EDICAO para plano_refeicao, ratificada pelo Fiscal, com a forma exata do DELETE exigida. O cartão continua [x], sem mudança de escopo.

Nota (gate {F3-05}, 2026-09-14): o placar de remoção deste cartão fica inalterado, e o motivo se escreve. Nem sessao_treino nem sessao_serie estão entre as onze entidades que o H1 de RF-CORE-008 enumera (ficha, plano alimentar, refeição, medida, exame, prescrição, sessão de reabilitação, anamnese, avaliação, foto e vínculo): a sessão de treino é execução registrada, não prescrição, e a série é linha dela. As duas recebem a política de exclusão privativa do Administrador pelo gabarito, por critério, porque o verificador varre toda tabela de dado de aluno do esquema, e não por pertencerem à lista das onze. Somar uma coisa na outra faria o denominador crescer a cada tabela nova, e o placar deixaria de medir o que RF-CORE-008 enumera. O aluno não exclui sessão nem série: o que ele faz é encerrar, e encerrar é transição de estado.

Fechamento [2026-09-15]: confirmado em produção (migração 0028, merge 80c103e). sessao_treino e sessao_serie nasceram com a política de exclusão privativa do Administrador, por critério, não por pertencerem às onze de RF-CORE-008. Placar de remoção deste cartão continua inalterado. Nota (onda AUD, {AUD-04}, 2026-09-15): o literal que estas políticas exigem muda com {AUD-04}, e o placar deste cartão não. Onde as notas de fechamento datadas acima dizem exclusão privativa do Administrador, leia-se o papel que era o topo da escada até esta republicação: a partir de {AUD-04} a exclusão em definitivo é privativa do Super Administrador (RF-CORE-008 e RN-008), as políticas passam a chamar mfit.e_super_administrador() e nenhuma comparação com literal de papel sobrevive dentro de política, função ou gatilho. As notas acima não se reescrevem porque registram o que estava em produção na data delas; o que manda daqui para a frente é a Especificação. Nota (Inspeção, gate {F5-04}, Drift 3, 2026-10-06): para o exame, desativar não apaga o anexo: o objeto continua no repositório privado, legível ao titular e ao Super Administrador, e só sai na exclusão definitiva (hoje só a limpeza, sem rota de exclusão clínica, precedente da anamnese). O exame entra na lista de entidades removíveis com desativado_em e desativado_por e a política FOR DELETE do Super Administrador, na migração 0059 de {F5-04}. Ficha em {ART-ENT-06} e em {ART-INT-02}. O cartão continua [x]. Fechamento [2026-10-06] de {F5-04}: a desativação do exame está em produção como a Nota descreveu: a política FOR DELETE do Super Administrador e as colunas desativado_em e desativado_por na mfit.exame (migração 0059, merge b078e76); o autor e o Super Administrador desativam (200), a segunda vez dá 409, o titular que não é o autor, o Personal e o Médico sobre o exame do aluno recebem 403, e PATCH, PUT e DELETE não existem como rota (404). O objeto do anexo segue no disco e abre depois de desativar, provado. O cartão continua [x].

Nota (gate {F3-05}, 2026-09-14): sessao_treino e sessao_serie nascem com os gatilhos genéricos de trilha, sem nenhuma função de gatilho nova e sem nenhuma classe de evento nova: as classes continuam seis, e as genéricas que já servem as tabelas em produção não são tocadas. As duas entram no critério de alteração auditada que {F3-03} instalou, que enumera por catálogo toda tabela do esquema com política de atualização, e por isso o universo daquele critério passa de dez para doze tabelas. O placar da classe criar das dezesseis entidades de RF-CORE-006 também se move, porque sessao_treino é uma das dezesseis. Os dois placares só se movem no fechamento, medidos no dia, nunca projetados aqui.

Fechamento [2026-09-15]: os gatilhos genéricos de trilha em produção em sessao_treino e sessao_serie (migração 0028, merge 80c103e), sem função nova e sem classe de evento nova. O critério de alteração auditada fecha em 12 de 12 tabelas (dez mais estas duas). O placar da classe criar das dezesseis entidades de RF-CORE-006 sobe, sessao_treino entra como uma das dezesseis. Placar de classes de evento inalterado em seis.

Nota (gate {AUD-03}, 2026-09-15): o comando ops/limpar-contas-de-teste grava, na mesma transação da remoção, uma entrada excluir por conta removida, origem ops/limpar-contas-de-teste; a ação excluir já existe no enum de auditoria desde a migração 0010, então nenhuma classe de evento nasce aqui. Duas entradas gravadas na execução real (contas inspecao-qa-20260906 e inspecao-visual-20260907; as demais nomeadas no card já não existiam). Placar de classes de evento inalterado em seis.


Nota de conjunto (onda AUD, {AUD-04}, 2026-09-15; atualizada em 2026-09-29 por {AUD-06}, que acrescenta /admin/parametros, escrita do Super Administrador e leitura do Administrador, e leva as rotas de administração de nove para dez: 7 mais 1 mais 2 igual a 10): as nove rotas de administração deixam de servir um papel só. Sete servem aos dois papéis (/admin, /admin/usuarios, /admin/exercicios, /admin/vinculos, /admin/relatorios, /admin/guia e /admin/textos), uma serve apenas ao Super Administrador (/admin/auditoria) e uma tem escrita do Super Administrador e leitura do Administrador (/admin/planos): 7 mais 1 mais 1 igual a 9, fechando o universo. Nenhuma rota nova nasce, e por isso nenhum placar de tela se move. A faixa de personificação de {ART-ACS-13} é cromática do topo de toda tela, como a central de notificações, e também não é rota. O que muda em cada cartão de tela é a coluna de papéis, reconciliada no Apêndice de catálogo de telas do DRS na mesma republicação. Exceção nominal (onda AUD, {AUD-05}, 2026-09-15): a frase acima, sobre nenhum placar de tela se mover, foi escrita para {AUD-04} e continua valendo letra por letra para ele. Ela NÃO alcança {AUD-05}: decidido o ponto de entrada da personificação, a rota /admin/usuarios nasce mínima naquele card, com uma única ação, e o placar de {ART-SCR-03} sobe de 5 de 8 para 6 de 8 quando {AUD-05} entregar. Esta é a única exceção da onda e ela é nominal: nenhum outro cartão de tela se move, e a faixa de personificação continua sem pertencer a cartão de tela nenhum.

Nota de conjunto (onda AUD, {AUD-07}, 2026-09-29): /admin/listas acrescenta uma rota sobre o que {AUD-06} publicou, escrita do Super Administrador e leitura do Administrador, e leva as rotas de administração de dez para onze: sete servem aos dois papéis, uma serve apenas ao Super Administrador (/admin/auditoria) e três têm escrita do Super Administrador e leitura do Administrador (/admin/planos, /admin/parametros e /admin/listas): 7 mais 1 mais 3 igual a 11. O catálogo de telas do DRS passa a 41 linhas e 39 rotas (a nota de {AUD-06} dizia 40 e 38). A seção B.1 do DRS continua em oito capacidades privativas, porque manter as listas e manter o catálogo de parâmetros de operação (RF-PAIN-011) são a mesma capacidade, e a Matriz Ator por Capacidade não ganha linha.

Máquinas de estado

Nota (gate {F3-05}, 2026-09-14): a metade da sessão deste cartão anda aqui e não fecha, e por isso ele continua [ ] com motivo escrito, no molde exato da Nota que {F3-04} deixou para a metade da solicitação. {F3-05} entrega a abertura em andamento com no máximo uma por aluno, garantida por índice único parcial; o encerramento decidindo entre concluída e abandonada pela contagem de séries registradas, num ponto único; e as transições proibidas recusadas pelo banco, nomeando origem e destino. Continuam em {F3-10} a retomada oferecida enquanto em andamento e a passagem automática a abandonada por falta de registro além do parâmetro sessao_abandono_horas, que {F3-05} não lê e não escreve. A regra de que apenas a concluída conta para sequência, calendário, conquistas e progressão é consumida por {F3-07} e por {F7-02} a {F7-05}, e nenhuma delas nasce aqui.

Fechamento [2026-09-15]: em produção (migração 0028, merge 80c103e), 3 de 5 transições de E.3 servidas por caminho alcançável: abrir em andamento com a guarda de sessão única; encerrar com série registrada para concluída; encerrar sem série para abandonada. As duas pendentes, retomar e a passagem automática por prazo, seguem nomeadas para {F3-10}. Este cartão continua [ ], porque a metade da sessão anda aqui e só fecha com {F3-10}, no mesmo molde da Nota que {F3-04} deixou para a solicitação.

Nota (gate {F3-10}, Drift 1, 2026-09-29): o gatilho distingue os dois eventos de E.3 que saem de em andamento: encerrar, decidido pelo resultado (contagem de séries), e prazo decorrido, cujo resultado é a própria guarda de tempo, avaliada no relógio do banco pelo escritor único (D-2); prazo decorrido leva a abandonada com qualquer número de séries.

Nota (gate {F3-10}, Drift 4, 2026-09-29): o evento prazo decorrido de E.3 tem executor, e nenhum deles é um {ART-JOB} nem um {ART-WF}. Quatro pontos preguiçosos de escrita (iniciar, registrar série, atualizar posição e encerrar, todos do aluno titular) passam a abandonada a sessão vencida de quem volta; a leitura por predicado garante que esse aluno nunca veja a sessão vencida como em andamento; e uma rotina de operação de hora em hora, uma linha de crontab e NÃO um {ART-JOB}, cobre quem nunca volta. A janela aberta é de até uma hora e vale só para leitores terceiros, porque o próprio aluno nunca a vê.

Fechamento [2026-09-29] de {F3-10}: em produção (migração 0042, merge 047f3bc), 5 de 5 transições de E.3 servidas por caminho alcançável: às três de {F3-05} somam-se retomar (atalho nas duas telas e leitura por predicado em GET /api/sessoes/atual, que responde 204 à sessão vencida sem escrever) e prazo decorrido (escrita preguiçosa nos quatro caminhos do titular mais a rotina horária de operação, sempre pelo escritor único da passagem a abandonada). A sessão com séries que passou do prazo termina abandonada e as séries deixam de contar; provado em produção pelo qa (34 critérios, 0 reprovações, P2 declarados no card). As duas metades do cartão, solicitação ({F3-04}) e sessão, estão fechadas: este cartão passa a [x].


Automações

Nota (gate {F3-05}, 2026-09-14): dos cinco passos deste fluxo, {F3-05} entrega dois, e o cartão continua [ ]. Entregues: calcular a duração e calcular o volume ao encerrar, no mesmo ponto único que decide o desfecho, com o volume somando apenas as séries que têm carga e repetições preenchidas e ignorando as séries por tempo, conforme RN-004. Pendentes, com dono nominal: atualizar a sequência de dias e marcar o dia no calendário são {F7-02} e {F7-03}; recalcular a progressão dos exercícios executados é RF-TREI-007 e {F3-07}; avaliar os oito critérios de conquista é {F7-04} e {F7-05}. A condição e a idempotência da especificação valem desde já: a sessão só transita uma vez para concluída, e o encerramento sem nenhuma série registrada leva a abandonada, nunca a concluída. Ausência é ausência: o que tem outro dono não nasce aqui como aviso na tela.

Fechamento [2026-09-15]: em produção (migração 0028, merge 80c103e), dois dos cinco passos entregues: calcular a duração e calcular o volume ao encerrar, no ponto único do gatilho, conforme RN-004. Os três restantes seguem pendentes com dono nominal: sequência e calendário são {F7-02} e {F7-03}; progressão de carga é {F3-07}; conquistas são {F7-04} e {F7-05}. Este cartão continua [ ].

Nota (gate {F3-07}, 2026-09-15): o passo 4 deste fluxo muda de forma, não de dono. "Recalcular a progressão", num fluxo disparado pelo encerramento e sem espera, é verbo de escrita, e não existe onde escrever: {ART-ENT-04} declara seis tabelas de treino, nominalmente, e nenhuma delas é de progressão. A progressão passa a ser derivada na leitura, em ponto único, a partir das sessões concluídas, e o encerramento a cumpre por construção, ao fazer a sessão entrar no universo da derivação, de modo que não há agregado a atualizar e, portanto, não há caminho novo que possa esquecer de atualizá-lo. Alternativa recusada, e a condição em que ela volta: agregado materializado, que criaria uma sétima tabela ou colunas novas contradizendo a especificação publicada de {ART-ENT-04}; ela só volta a ser examinada se a cláusula da tabela de riscos do DRS (crescimento do histórico de séries, com agregados pré-calculados nos painéis) for medida e exigir pré-cálculo, e nesse dia é card novo, nunca este. Aritmética: com {F3-07} entregue este cartão passa de 2 de 5 para 3 de 5 passos e continua [ ]; os dois restantes seguem com dono nominal, sequência de dias e calendário em {F7-02} e {F7-03}, conquistas em {F7-04} e {F7-05}. RN-004, {ART-ENT-04} e a especificação de entidades do DRS não são editadas: as três estão certas, e quem estava com o verbo errado era a Especificação deste fluxo.

Fechamento [2026-09-15]: em produção (merge c331286), a progressão passa a ser derivada na leitura por server/src/sessoes/progressao.ts, cumprindo o passo por construção. Placar sobe de 2 de 5 para 3 de 5 passos; cartão continua [ ], os dois restantes com dono nominal, sequência e calendário em {F7-02} e {F7-03}, conquistas em {F7-04} e {F7-05}.

Fechamento [2026-09-14]: os três avisos em produção (migração 0027, merge 8f0f9fd), em fila de correio eletrônico por gatilho na origem, chave de evento garantindo que repetir o mesmo fato não gera segunda mensagem: criação do pedido notifica o profissional destinatário; a transição da solicitação para atendida (por criação ou por alteração da ficha) notifica o aluno com a ficha; a recusa notifica o aluno com o motivo. Fecha [x].


Rotinas agendadas


Notificações e mensagens

Nota (gate {F3-05}, 2026-09-14): nenhum tipo de notificação nasce, muda ou é removido, e este cartão continua [ ] e sem entrega. A execução da sessão não avisa ninguém: ela é do aluno titular, acontece na tela dele e termina nela, e nenhum dos doze tipos catalogados tem a sessão como gatilho. Os avisos que o treino executado alimenta, sequência e conquista, são de {F7-02} a {F7-05} e chegam pelos tipos já catalogados. Placar que não muda também se declara.

Fechamento [2026-09-15]: confirmado inalterado. Em produção (80c103e), nenhum tipo de notificação nasceu, mudou ou foi removido. Este cartão continua [ ] e sem entrega.


Planos, configuração e métricas

Nota (gate {F3-05}, 2026-09-14): nenhuma dimensão de plano nasce aqui e nenhum limite é consumido pela execução da sessão: treinar não é cobrado por cota, e a função única de consumo do aluno não ganha ramo novo. Os três planos e as seis dimensões de limite continuam exatamente como estão, e o placar continua 3 de 3 planos existentes, 2 de 3 com preço definido. Placar que não muda também se declara.

Fechamento [2026-09-15]: confirmado inalterado. Em produção (80c103e), nenhuma dimensão de plano nasceu e mfit.consumo_do_aluno não ganhou ramo novo. Placar continua 3 de 3 planos existentes, 2 de 3 com preço definido.

ParâmetroControlaTipoDefaultFaixa ou opçõesEfeito ao mudar
metas_padraometas nutricionais iniciais do aluno novoconjunto de números2000 kcal, 150 g, 250 g, 65 g800 a 6000 kcal; 0 a 1000 g cada macrovale para alunos novos
dias_inatividadeprazo do alerta de aluno inativonúmero73 a 30próximo cálculo diário
sessao_abandono_horastempo sem registro que passa a sessão em andamento para abandonadanúmero em horas242 a 72próxima avaliação da sessão
campos_completudeconjunto de campos do indicador de completude do perfillista de campos do perfildata de nascimento, sexo, altura, peso mais recente, fotocampos do perfil do alunoimediato, recalcula o percentual de todos
anexo_tamanho_maxlimite de tamanho do anexonúmero em megabytes201 a 50imediato
anexo_extensoesextensões aceitas de anexolistadocumento e imagemsubconjunto não vazio das 13 extensões de server/src/arquivos/tipoConteudo.tsimediato
midia_exercicio_tamanho_maxlimite de tamanho da imagem de exercícionúmero em megabytes51 a 20imediato
midia_exercicio_formatosformatos aceitos da imagem de exercíciolistapng, jpg, webp e gif (rótulo medido nos bytes, aspas jpeg fecha aspas é o tipo MIME, nunca o valor gravado)subconjunto não vazio de png, jpg, webp, gifimediato
url_assinada_validadevalidade do endereço assinadonúmero em minutos15 (código grava 900 segundos; conversão no ponto único, {ART-CFG-02})1 a 60imediato
bloqueio_tentativastentativas, janela e tempo de bloqueiotrês números6, 15 e 303 a 10, 5 a 60 e 5 a 120imediato
personificacao_duracao_minteto de duração de uma sessão de personificaçãonúmero em minutos305 a 120vale para a próxima personificação iniciada, não encurta as em curso
personificacao_aviso_minminutos restantes em que a faixa de personificação entra no estado de próxima da expiraçãonúmero em minutos51 a 30, e sempre menor que personificacao_duracao_minvale para a próxima personificação iniciada
listas_fechadassete listas com consumidor (as seis atuais, grupos musculares, dificuldade e categoria do exercício, objetivos, nível e equipamentos das preferências de treino, mais tipos de refeição, entregue em {F4-01}) mais as três com card dono (tipos de exame {F5-04}, pontos de dobra cutânea {F5-02}, categorias de pose {F5-08}); sete listas com consumidor desde o fechamento de {F4-01} (a sétima, tipos de refeição, em produção com oito itens); três nascem nos cards de módulo; a oitava lista com consumidor, ponto_dobra_cutanea (pontos de dobra cutânea, com quatro itens: Tríceps, Suprailíaca, Abdominal e Coxa), entregue em {F5-02} na migração 0057 (oito listas com consumidor em produção desde o fechamento de {F5-02})tabelasconforme apêndicesfora de mfit.parametro, tabela própria (D-15 do gate {AUD-06}); pendente, dono nominal {AUD-07}imediato nos formulários
consentimento_textostexto, finalidade e versão de cada categoriatabelaversão inicialfora de mfit.parametro, tabela própria (D-15 do gate {AUD-06}); entregue em {AUD-12} (merge 4e5ed26, migrações 0050 e 0051), mecanismo mfit.texto_versionado de {F1-18}, sete textos e sete finalidades, editáveis em /admin/textosversão nova vale para as próximas concessões; quem já consentiu guarda a versão aceita
termos_e_aviso_nao_clinicotexto e versão dos termos de uso e do aviso de que a plataforma não é registro clínicotabelaversão iniciallivreos quatro pontos de exibição passam a mostrar a versão nova, e os aceites antigos guardam a versão que aceitaram
provedores_atividadeserviços de atividade habilitados para conexãolistaStrava, Fitbit, Garmin, Polarprovedores com adaptador implementadoimediato na tela de integrações; desabilitar não desconecta quem já está conectado
sincronizacao_cadencia_horasintervalo entre sincronizações das contas conectadasnúmero em horas61 a 24próxima execução
conquistascatálogo e critériostabelaoito do apêndicelivrepróxima avaliação
visibilidade_cruzadapadrão de visibilidade entre especialidadesenumeradotodas as especialidades vinculadastodas ou apenas a especialidade correspondenteimediato, respeitando a restrição individual do aluno
modelo_geracaomodelo em uso na geração assistidatextodefinido na abertura da construçãolista fechada nomeada pelo card dono da geração assistida; até lá, não editável (editável = false), motivo "o catálogo de modelos nasce na Fase 8"próxima geração
retencao_mesesprazo de retenção antes da anonimizaçãonúmero6012 a 120próxima execução mensal
recuperacao_validade_minvalidade do endereço de uso único de recuperação de senhanúmero em minutos6015 a 120vale para o próximo endereço gerado
recuperacao_por_origem_maximoteto de pedidos de recuperação por endereço de origem, e a janeladois números5 e 602 a 20 e 15 a 120imediato
recuperacao_intervalo_conta_minintervalo mínimo entre dois e-mails de recuperação para a mesma contanúmero em minutos51 a 30imediato
email_rotina_intervalo_segcadência da rotina de envio de e-mailnúmero em segundos3010 a 300próximo ciclo
email_tentativas_recuotentativas máximas de envio de e-mail e o recuo progressivo, base e tetotrês números6, 60 e 60 (tentativas; base em segundos; teto em minutos, medido em config.ts:174)3 a 10; 10 a 600 s; 5 a 1440 minpróxima tentativa
email_fila_alerta_limitetamanho da fila de e-mail que dispara o alerta de acúmulonúmero5010 a 500próximo ciclo
email_retencao_corpo_horasprazo de retenção do corpo renderizado na fila de e-mailnúmero em horas241 a 168próximo expurgo
email_lote_por_cicloquantidade de e-mails processados por ciclo da rotinanúmero10fixo, não editável pela administraçãonenhum, parâmetro técnico
vinculo_convites_pendentes_teto_linhasteto de linhas retornado por GET /api/vinculos para aluno e profissionalnúmero50fixo, não editável pela administraçãonenhum, parâmetro técnico; sem paginação nem contagem do universo, medido em {F2-08}, evolução em {F7-07}
sessao_acesso_validade_minvalidade do token de acesso (cookie de sessão)número em minutos155 a 60vale para a próxima sessão emitida
sessao_renovacao_validade_diasvalidade do cookie de renovaçãonúmero em dias301 a 90vale para a próxima sessão emitida
senha_minima_caracterestamanho mínimo da senha no cadastro e na redefiniçãonúmero em caracteres88 a 64vale para a próxima senha definida; senha já gravada continua válida
cadastro_por_origem_maximoteto de cadastros por endereço de origem, e a janeladois números10 e 602 a 100 e 15 a 240 minutosimediato
perfil_biografia_max_caracteresteto de caracteres da biografia do profissionalnúmero1000200 a 5000vale para a próxima gravação da biografia; a já gravada acima do teto continua exibida
modelos_emailos onze modelos de e-mail transacional, assunto e corpo com variáveis e versõestabelaa versão 1 de cada modelo, igual ao texto de antesfaixa por modelo como dado: assunto de 3 a 120 caracteres em linha única, corpo de 20 a 5000fora de mfit.parametro, tabela própria; vale para o próximo e-mail renderizado, sem reiniciar; ficha completa em {ART-CFG-03}
refeicao_nome_max_caracterestamanho máximo de nome em nutrição: refeição, alimento e plano alimentarnúmero em caracteres12040 a 280vale para o próximo registro; entregue em {F4-01}
refeicao_observacoes_max_caracterestamanho máximo de observações e notas em nutrição: refeição e plano alimentarnúmero em caracteres1000280 a 5000vale para o próximo registro; entregue em {F4-01}
nutricao_meta_tolerancia_pctfaixa, para mais e para menos, em torno da meta de calorias em que o dia conta como meta atingida no acompanhamento nutricional (grupo nutrição)número em porcentagem101 a 50vale na próxima leitura do acompanhamento, sem recálculo guardado; entregue em {F4-05}
anamnese_texto_curto_max_caracterestamanho máximo de um campo de texto curto da anamnese (grupo saúde)número em caracteres20080 a 500vale para o próximo registro; a anamnese gravada acima do teto continua exibida; entregue em {F5-01}
anamnese_texto_longo_max_caracterestamanho máximo de um campo de texto longo da anamnese (grupo saúde)número em caracteres2000500 a 10000vale para o próximo registro; a anamnese gravada acima do teto continua exibida; entregue em {F5-01}
avaliacao_texto_curto_max_caracterestamanho máximo de um campo de texto curto da avaliação física (grupo saúde)número em caracteres20080 a 500vale para o próximo registro; a avaliação gravada acima do teto continua exibida; entregue em {F5-02}
avaliacao_texto_longo_max_caracterestamanho máximo de um campo de texto longo da avaliação física (grupo saúde)número em caracteres2000500 a 10000vale para o próximo registro; a avaliação gravada acima do teto continua exibida; entregue em {F5-02}
exame_nome_max_caracterestamanho máximo do nome de um exame (grupo saúde)número em caracteres16080 a 500; o mínimo de 3 caracteres é regra fixavale para o próximo registro; o exame gravado acima do teto continua exibido; a entregar em {F5-04}
exame_resumo_max_caracterestamanho máximo do resumo dos resultados de um exame (grupo saúde)número em caracteres4000500 a 10000vale para o próximo registro; o exame gravado acima do teto continua exibido; a entregar em {F5-04}
exame_observacoes_max_caracterestamanho máximo das observações de um exame (grupo saúde)número em caracteres2000500 a 10000vale para o próximo registro; o exame gravado acima do teto continua exibido; a entregar em {F5-04}

Nota (R-2, {F2-02}): midia_exercicio_tamanho_max e midia_exercicio_formatos são de mídia de exercício, servida sem sessão pelo repositório público; não confundir com anexo_tamanho_max e anexo_extensoes, que são de anexo sensível do repositório privado, outro limite e outro repositório. Aritmética publicada: 25 existentes + 2 novos de {F2-02} + 1 novo de {F2-08} + 2 de {AUD-05} (personificacao_duracao_min, personificacao_aviso_min) + 2 de {AUD-06} (validades de sessão) = 32, dos quais 1 materializado, 18 com valor vivo e 13 sem consumidor (medido em 2026-09-29, depois de {AUD-05}; anexo_tamanho_max reclassificado por zero leitores em 3dabc30). Nota R-2 recontada em {AUD-06}: 25 + 2 + 1 + 2 de {AUD-05} + 2 de {AUD-06} = 32, porque {AUD-05} contribuiu duas linhas (personificacao_duracao_min e personificacao_aviso_min) e não uma, catalogada esta última na republicação de {AUD-06}.

Nota (gate {AUD-08}, 2026-09-29): email_remetente e ajuda_registro_profissional não são parâmetro: C nomeado no verificador, motivos em L.2.

Quem edita: Super Administrador, exceto email_lote_por_ciclo e vinculo_convites_pendentes_teto_linhas (parâmetros técnicos não editáveis) e modelo_geracao (não editável até a Fase 8, catálogo de modelos ainda sem dono). Auditado: sim, todos os editáveis. Requisitos associados: RF-DIET-002, RF-PAIN-006, RF-TREI-008, RF-TREI-010, RF-ENGA-006, RF-SAUD-004, RF-SAUD-008, RF-SAUD-009, RF-CORE-001, RF-CORE-002, RF-CORE-004, RF-CORE-005, RF-CORE-010, RF-CORE-012, RF-ENGA-004, RF-INTE-003, RF-INTE-004, RN-003, ADR-014, RF-IAGE-001 e D.6. A lista listas_fechadas cobre também as categorias de pose da foto de progresso, os pontos de dobra cutânea da avaliação física e, das preferências de treino do aluno (RF-TREI-008), os objetivos e os equipamentos, que são duas das cinco listas nomeadas no parâmetro. Nota (gate {F3-08}, 2026-09-15): neste card nenhum parâmetro nasce, nenhum é materializado e nenhum é lido, e o total continua em trinta e um. As duas listas fechadas de RF-TREI-008 nascem como tipo enumerado no banco mais um catálogo único de rótulo no código, fonte única, e isso não fecha a porta da administração editável: o precedente de {F1-18} mostra o caminho, a constante virou tabela mantendo a mesma forma de import, e o enumerado de hoje é a semente daquela tabela. Materializar listas_fechadas aqui significaria construir a tabela editável das cinco listas, mais a tela de administração delas, mais a migração das três que pertencem a outros módulos, o que é maior que este card inteiro e que artefato nenhum lhe atribui. A pendência que fica já existia, e este card a nomeia em vez de a criar: 1 de 31 materializado, dono confirmado em {AUD-06}.

Nota ({F1-12}): dois parâmetros já listados aqui têm consumidor novo, e nenhum parâmetro nasce. consentimento_textos já cobre os seis textos, as seis versões e as seis finalidades das categorias de RN-001; eles nascem em server/src/config.ts, o ponto único que o dono a confirmar deste card substitui por tabela editável mantendo a mesma forma de import ({F1-13} não toca este arquivo além de corrigir o comentário que apontava para ele). visibilidade_cruzada: o auxiliar mfit.consentimento_visivel implementa hoje o padrão publicado (todas as especialidades vinculadas) mais a restrição individual do aluno, e passa a ler este parâmetro quando a tabela de configuração do dono a confirmar existir. Nota (gate {F3-02}, 2026-09-14): nenhum parâmetro editável nasce aqui. Quais papéis criam ficha é lista fechada em código, derivada dos Atores de RF-TREI-001 e RF-TREI-002, e parametrizar isso por tela de administração transformaria decisão de privacidade em configuração, o que D.2 e RN-003 não admitem. O limite de fichas ativas por plano já é editável desde {F1-13} e não é tocado. Placar de parâmetros inalterado. Fechamento [2026-09-14]: confirmado inalterado. Em produção (3d25e27), nenhum parâmetro novo. Placar de parâmetros inalterado. Nota (gate {F3-03}, 2026-09-14): nenhum parâmetro novo nasce e nenhum existente é tocado. A janela de anti-duplicação da notificação de prescrição alterada, que seria parâmetro de operação, não é escrita aqui, porque a notificação não é deste card ({ART-WF-06}); o teto de fichas ativas por plano já é editável desde {F1-13} e é apenas consumido pela reativação, pelo mesmo tradutor único de recusa, sem segunda contagem e sem mensagem nova. Placar de parâmetros inalterado. Nota (gate {F3-04}, 2026-09-14): {F3-04} não cria parâmetro de operação nenhum e não mexe em nenhum existente. Em particular, não nasce teto de solicitações abertas por aluno: requisito nenhum o impõe, e inventar um limite numa implementação seria escrever regra de produto sem dono. A defesa contra pedido repetido é a TELA, que mostra ao aluno o pedido aberto no lugar de oferecer a ação de novo, e o banco não impede o pedido repetido, o que se declara aqui para ninguém ler a tela como garantia. Se a garantia for desejada, ela vira card próprio com a regra escrita. Placar inalterado.

Nota (gate {F3-05}, 2026-09-14): nenhum parâmetro de operação nasce aqui e nenhum existente é tocado. sessao_abandono_horas, o único parâmetro que a execução da sessão encosta, já está catalogado, e quem o consome é {F3-10}, na passagem automática a abandonada; {F3-05} não o lê e não o escreve. Placar de parâmetros inalterado, e placar que não muda também se declara.

Nota (gate {F4-01}, Drift 9, 2026-09-29): duas fichas novas, refeicao_nome_max_caracteres e refeicao_observacoes_max_caracteres (grupo Nutrição, valores iniciais 120 e 1000), a entregar em {F4-01}, e a lista tipo_refeicao (oito itens) que passa a ser a sétima lista fechada, também a entregar em {F4-01}. O catálogo sobe de 46 para 48 fichas, sem marcar entrega. Soma do Estado recalculada: 33 com o consumidor no ponto único + 1 com valor vivo fora do ponto único (consentimento_textos) + 12 sem consumidor + 2 a entregar em {F4-01} = 48; nada foi somado a "com consumidor", porque as duas fichas novas só têm consumidor quando {F4-01} fechar. Em mfit.parametro as linhas passam de 42 para 44 no fechamento de {F4-01} (48 menos 4 de forma tabular). Os trechos acima que falam em 46 fichas e em quatro listas sem módulo descrevem o estado anterior a esta reconciliação. O cartão continua [ ]. Fechamento [2026-09-30] de {F4-01}: as duas fichas (refeicao_nome_max_caracteres, 120, faixa 40 a 280, e refeicao_observacoes_max_caracteres, 1000, faixa 280 a 5000) estão em mfit.parametro em produção, que passa de 42 para 44 linhas, e a lista tipo_refeicao (oito itens, 60 no total da tabela de listas) é a sétima lista fechada com consumidor. O consumidor das duas fichas é a rota de refeição, pelo ponto único de leitura, e a mudança vale na chamada seguinte (provado pelo qa, com o valor restaurado ao fim). Soma do Estado recalculada: 35 com o consumidor no ponto único (33 mais as 2 de {F4-01}) + 1 com valor vivo fora do ponto único (consentimento_textos) + 12 sem consumidor = 48. Placar do verificador de parâmetros: 52 pendentes de 98, C 51, universo 149. Nota (gate {F4-02}, Drift 9, 2026-09-29): metas_padrao passa a ter consumidor no ponto único, a ENTREGAR em {F4-02}: semearMetaPadrao lê parametro("metas_padrao") quando o aluno é criado e grava a vigência padrão (nenhuma ficha nova; valor, faixa e efeito "vale para alunos novos" seguem como na linha da tabela acima, e o aluno existente guarda a vigência padrão que recebeu, sem recálculo do passado). Não é entrega: o parâmetro continua contado entre os sem consumidor até o fechamento de {F4-02}, quando o placar ganha mais um com consumidor e menos um sem, medido no dia. Fechamento [2026-09-30] de {F4-02}: metas_padrao passa a ter o consumidor no ponto único: semearMetaPadrao lê parametro("metas_padrao") na criação do aluno e grava a vigência padrão (migração 0044, https://fit.modulareasy.com). Provado pelo qa: o aluno novo nasce com 2000, 150, 250 e 65; mudar o valor em /admin/parametros vale para o aluno seguinte, sem reiniciar; o aluno antigo não é alcançado; o valor foi restaurado e provado por SELECT. Soma do Estado recalculada: 36 com o consumidor no ponto único (35 mais metas_padrao) + 1 com valor vivo fora do ponto único (consentimento_textos) + 11 sem consumidor = 48. Placar do verificador de parâmetros: 52 pendentes de 98, C 53, universo 151. Nota (Inspeção, {AUD-10} e {AUD-11}, 2026-09-30): duas mudanças de catálogo, a entregar, sem marcar entrega. (1) {AUD-10}: as onze fichas email_assunto_<modelo> saem da forma escalar e entra uma ficha de forma tabular, modelos_email (os onze modelos de e-mail, assunto e corpo com variáveis e versões, tabela própria, D-15 do gate {AUD-06}; ficha completa no cartão {ART-CFG-03}). Aritmética do catálogo: 48 fichas menos 11 mais 1 igual 38. Em mfit.parametro: 44 linhas menos 11 igual 33, e a trava de cardinalidade da carga passa a 33. Formas tabulares: 4 (listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico e conquistas) mais modelos_email igual 5; 33 mais 5 igual 38. Soma do Estado depois de {AUD-10}: 26 com o consumidor no ponto único (36 menos os 11 assuntos igual 25, mais modelos_email, lido pelo renderizador único) + 1 com valor vivo fora do ponto único (consentimento_textos) + 11 sem consumidor = 38. Até {AUD-10} fechar, o Estado vigente continua o de {F4-02}, 36 + 1 + 11 = 48, e as onze linhas email_assunto_ da tabela acima continuam valendo. (2) {AUD-11}: consentimento_textos passa de seis para sete textos, o de nutrição na versão 1, escrito e carregado por {AUD-11}; a ficha continua uma só e o total não muda. O cartão continua [ ]. Nota (Inspeção, gate {AUD-10}, drift 3, 2026-09-30): a trilha das alterações de assunto continua legível. As onze linhas email_assunto_<modelo> saem de mfit.parametro, e as entradas antigas da trilha (entidade igual a parametro) deixariam de ter frase; a ficha modelos_email guarda por modelo o parametro_legado_id (o id da linha removida) e /admin/auditoria resolve por ele a frase "Assunto do e-mail <rótulo>: antigo para novo". As alterações antigas não viram versões do modelo (a versão 1 parte do valor vigente), e o mesmo id permite ao desfazer da migração recriar as onze linhas com o id original. O cartão continua [ ]. Nota (gate {F4-03}, Drift 8, 2026-09-30): nenhuma ficha nova e nenhum parâmetro novo: o catálogo não muda de tamanho. refeicao_nome_max_caracteres e refeicao_observacoes_max_caracteres ganham consumidores no plano alimentar (título do plano, nome da refeição do plano, nome e quantidade do alimento; descrição do plano e notas da refeição do plano), e a descrição das duas linhas da tabela acima passa a nomear o plano alimentar: "tamanho máximo de nome em nutrição: refeição, alimento e plano alimentar" e "tamanho máximo de observações e notas em nutrição: refeição e plano alimentar". Mudar o valor delas passa a valer também para o plano. Valores e faixas ficam como estão. Fechamento [2026-09-30] de {AUD-10} (merge 17b62d6, migrações 0048 e 0049, https://fit.modulareasy.com, /api/estado na versão 17b62d6): as onze fichas email_assunto_<modelo> saíram de mfit.parametro, que passou de 44 para 33 linhas (nenhuma email_assunto_ sobrou, trava de cardinalidade 33), e entrou a ficha de forma tabular modelos_email, com os 11 assuntos migrados para a tabela de modelos (a versão 1 de cada um parte do valor que estava vigente, conferido nos onze). Catálogo: 48 fichas menos 11 mais 1 igual 38 (33 escalares mais 5 tabulares: listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email). Soma do Estado recalculada: 26 com o consumidor no ponto único (36 menos os 11 assuntos, mais modelos_email, lido pelo renderizador único) + 1 com valor vivo fora do ponto único (consentimento_textos) + 11 sem consumidor = 38. Placar do verificador de parâmetros inalterado: 52 pendentes de 98, C 53, universo 151; texto de e-mail em código 11 antes, 0 depois. Os trechos acima que falam em 48 fichas, em 36 + 1 + 11 = 48 e nas onze linhas email_assunto_ descrevem o estado anterior a este fechamento. O cartão continua [ ] porque restam 11 parâmetros sem consumidor. Nota (Inspeção, {AUD-11}, drift 5, 2026-09-30): os textos de consentimento vivem hoje em config.consentimentoCategorias (server/src/config.ts, versão 1.3), não na tabela consentimento_textos. O sétimo texto (nutrição, versão 1) entra ali e em docs/textos/consentimentos.md, e a tabela consentimento_textos segue com dono a confirmar, sem mudar o número de literais do verificador de parâmetros. Os Termos de Uso vigentes e a política de privacidade listam seis categorias; atualizá-los, com nova versão dos Termos por /admin/textos, é decisão do operador e fica fora de {AUD-11}. Nota (Inspeção, {AUD-12}, 2026-09-30): consentimento_textos passa a ter dono nominal, a tarefa {AUD-12}, e deixa de ser "a confirmar" (na linha da tabela acima e nas Notas de {F1-12} e de {AUD-11}, que ficam superadas neste ponto). O mecanismo é o 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, no lugar da constante config.consentimentoCategorias, que deixa de existir. O estado da ficha e o checkbox não mudam: continua pendente, entregue só quando {AUD-12} fechar. Nota (Inspeção, {AUD-12}, drift 2, 2026-09-30): na linha consentimento_textos da tabela acima, o efeito ao mudar, "versão nova exige novo consentimento", está superado: versão nova de texto vale para as próximas concessões; quem já consentiu guarda a versão aceita e o consentimento continua válido. Forçar novo consentimento a cada versão não é deste card; é card próprio se o dono pedir. A semente da tabela são os textos e finalidades carimbados nos consentimentos existentes (versões 1.3 e 1), e a finalidade é publicada como segunda chave, na mesma versão do texto. Fechamento [2026-09-30] de {AUD-12} (merge 4e5ed26, migrações 0050 e 0051, https://fit.modulareasy.com; o qa provou em produção na versão 53c7fd2, mesmo código do merge): consentimento_textos deixa de ser "valor vivo fora do ponto único" e passa a ter o consumidor no ponto único: os sete textos e as sete finalidades vivem em mfit.texto_versionado (14 linhas de semente, md5 igual ao texto carimbado nos consentimentos existentes, versões 1.3 e 1), editáveis em /admin/textos, e a constante config.consentimentoCategorias morreu (texto de consentimento em código 7 antes, 0 depois). Catálogo inalterado em 38 fichas (33 escalares mais 5 tabulares) e mfit.parametro inalterado em 33 linhas. Soma do Estado recalculada: 27 com o consumidor no ponto único (26 mais consentimento_textos) + 0 com valor vivo fora do ponto único + 11 sem consumidor = 38. Placar do verificador de parâmetros: de 52 pendentes de 98 para 51 de 98, C 54, universo 152. Os trechos acima e abaixo que falam em 1 valor vivo fora do ponto único e em consentimento_textos pendente descrevem o estado anterior a este fechamento. O cartão continua [ ] porque restam 11 parâmetros sem consumidor. Nota (Inspeção, gate {AUD-12}, drift 7, 2026-09-30): a finalidade também é texto versionado. A ficha consentimento_textos fala em "texto e versão", e RF-CORE-010 grava a finalidade no consentimento; por isso a finalidade de cada categoria vira uma segunda chave publicada junto com o texto, na mesma versão e na mesma transação, e a especificação da ficha passa a cobrir texto, finalidade e versão. Nota (Inspeção, gate {F4-05}, Drift 2, 2026-09-30): uma ficha nova, nutricao_meta_tolerancia_pct (grupo nutrição, porcentagem, valor inicial 10, faixa 1 a 50), a entregar em {F4-05} na migração 0054, junto da função mfit.meta_atingida, sem marcar entrega. É o parâmetro que decide o dia com meta atingida de RF-DIET-005: o dia conta quando o percentual de calorias de mfit.comparacao_com_meta fica entre cem menos a tolerância e cem mais a tolerância, inclusive. O banco não lê o catálogo em tempo de execução: a tolerância chega à função como argumento, lida pelo ponto único ({ART-CFG-02}). Aritmética do catálogo: 38 fichas mais 1 igual 39 (34 escalares mais as 5 tabulares, listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email; 34 mais 5 igual 39). Em mfit.parametro: 33 linhas mais 1 igual 34, e a trava de cardinalidade da carga passa a 34 no mesmo deploy da migração (o processo antigo recusa subir com 34 linhas, por isso migração e código novo entram no mesmo passo, sem janela). Soma do Estado recalculada: 27 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor + 1 a entregar em {F4-05} = 39; nada foi somado a "com consumidor", porque a ficha só tem consumidor quando {F4-05} fechar. Até lá o Estado vigente continua 27 + 0 + 11 = 38. A tabela acima ganha a linha do parâmetro, com a ressalva "a entregar". O cartão continua [ ]. Fechamento [2026-10-01] de {F4-05}: nutricao_meta_tolerancia_pct (grupo nutrição, porcentagem, 10, faixa 1 a 50) em produção, na migração 0054 (merge f609a9c), com o consumidor no ponto único: acompanhamentoDoPeriodo lê o valor pelo ponto único a cada chamada e o passa a mfit.meta_atingida como argumento, de modo que alterar em /admin/parametros vale na próxima leitura, sem reiniciar (provado em produção: 5 dá 11 dias de 30, 25 dá 28, 0 e 51 recusados com 400, 10 restaurado). Aritmética do catálogo: 39 fichas (34 escalares mais as 5 tabulares); em mfit.parametro, 33 mais 1 igual 34, com a trava de cardinalidade da carga em 34 no mesmo deploy. Estado: 28 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor = 39 (27 do estado anterior mais esta ficha). A migração 0055 só atualiza o texto dos comentários de mfit.parametro e da política de alteração de 33 para 34. Verificador: 51 de 98 pendentes, C 56, universo 154, 7 listas. A linha da tabela acima passa de "a entregar" para entregue. O cartão continua [ ], por causa dos 11 sem consumidor. Nota (Inspeção, gate {F5-01}, Drift 2, 2026-10-01): duas fichas novas, anamnese_texto_curto_max_caracteres (grupo saúde, caracteres, valor inicial 200, faixa 80 a 500) e anamnese_texto_longo_max_caracteres (mesmo grupo, 2000, faixa 500 a 10000), a entregar em {F5-01} na migração 0056, sem marcar entrega, no molde de refeicao_nome_max_caracteres e refeicao_observacoes_max_caracteres: lidas só pelo ponto único ({ART-CFG-02}), na chamada, nunca guardadas, valendo no próximo registro sem reiniciar. As faixas de plausibilidade dos campos numéricos da anamnese não são parâmetro (limite físico, um objeto classificado C no verificador) e a escala de dor de zero a dez é protocolo. Aritmética do catálogo: 39 fichas mais 2 igual 41 (36 escalares mais as 5 tabulares, listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email; 36 mais 5 igual 41). Em mfit.parametro: 34 linhas mais 2 igual 36, e a trava de cardinalidade da carga passa a 36 no mesmo deploy da migração (o processo antigo recusa subir com 36 linhas, por isso migração e código novo entram no mesmo passo, sem janela). Soma do Estado recalculada: 28 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor + 2 a entregar em {F5-01} = 41; nada foi somado a "com consumidor", porque as duas fichas só têm consumidor quando {F5-01} fechar. Até lá o Estado vigente continua 28 + 0 + 11 = 39. Verificador de parâmetros esperado no fechamento, a medir e não a projetar: cardinalidade 36, universo 155, C 57, pendentes 51 de 98, listas 7. A tabela acima ganha as linhas dos dois parâmetros, com a ressalva "a entregar". O título deste cartão, "(39 parâmetros)", descreve o estado vigente e muda no fechamento. O cartão continua [ ]. Fechamento [2026-10-01] de {F5-01}: anamnese_texto_curto_max_caracteres (grupo saúde, caracteres, 200, faixa 80 a 500) e anamnese_texto_longo_max_caracteres (mesmo grupo, 2000, faixa 500 a 10000) em produção, na migração 0056 (merge 9cb16f3), lidas só pelo ponto único ({ART-CFG-02}) dentro das funções, nunca guardadas em escopo de módulo (conferido pelo review), e visíveis em /admin/parametros com texto acentuado (o grupo aparecia como "SAUDE" e foi corrigido em 25b0cc6). O qa provou o efeito dos valores vigentes (200 aceito e 201 recusado, 2000 aceito e 2001 recusado); a alteração dos valores em produção não foi exercitada. Aritmética do catálogo: 41 fichas (36 escalares mais as 5 tabulares); em mfit.parametro, 34 mais 2 igual 36, com a trava de cardinalidade da carga em 36 no mesmo deploy. Estado: 30 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor = 41 (28 do estado anterior mais estas duas fichas). Verificador: 51 de 98 pendentes, C 57, universo 155, 7 listas. As duas linhas da tabela acima passam de "a entregar" para entregue. O cartão continua [ ], por causa dos 11 sem consumidor. Nota (Inspeção, gate {F5-02}, Drifts 2 e 6, 2026-10-01): duas fichas novas, avaliacao_texto_curto_max_caracteres (grupo saúde, caracteres, valor inicial 200, faixa 80 a 500) e avaliacao_texto_longo_max_caracteres (mesmo grupo, 2000, faixa 500 a 10000), a entregar em {F5-02} na migração 0057, sem marcar entrega, no molde dos tetos da anamnese: lidas só pelo ponto único ({ART-CFG-02}), na chamada, nunca guardadas, valendo no próximo registro sem reiniciar. As faixas de plausibilidade dos campos numéricos da avaliação não são parâmetro (limite físico, um objeto classificado C no verificador). A lista ponto_dobra_cutanea (Tríceps, Suprailíaca, Abdominal e Coxa, com o nome "Pontos de dobra cutânea" em /admin/listas) nasce em {F5-02} na mesma tabela mfit.lista_fechada_item: listas_fechadas passa de sete listas com consumidor para oito no fechamento, e a linha acima ganha a ressalva "a entregar". Aritmética do catálogo: 41 fichas mais 2 igual 43 (38 escalares mais as 5 tabulares, listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email; 38 mais 5 igual 43). Em mfit.parametro: 36 linhas mais 2 igual 38, e a trava de cardinalidade da carga passa a 38 no mesmo deploy da migração (o processo antigo recusa subir com 38 linhas, por isso migração e código novo entram no mesmo passo, sem janela). Soma do Estado recalculada: 30 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor + 2 a entregar em {F5-02} = 43; nada foi somado a "com consumidor", porque as duas fichas só têm consumidor quando {F5-02} fechar. Até lá o Estado vigente continua 30 + 0 + 11 = 41. Verificador de parâmetros esperado no fechamento, a medir e não a projetar: cardinalidade 38, listas 8. A tabela acima ganha as linhas dos dois parâmetros, com a ressalva "a entregar". O título deste cartão, "(41 parâmetros)", descreve o estado vigente e muda no fechamento. O cartão continua [ ]. Fechamento [2026-10-06] de {F5-02}: avaliacao_texto_curto_max_caracteres (grupo saúde, caracteres, 200, faixa 80 a 500) e avaliacao_texto_longo_max_caracteres (mesmo grupo, 2000, faixa 500 a 10000) em produção, na migração 0057 (merge 3ab8395), lidas só pelo ponto único ({ART-CFG-02}) dentro das funções, e visíveis em /admin/parametros com o grupo e os itens acentuados. A lista ponto_dobra_cutanea ("Pontos de dobra cutânea", com Tríceps, Suprailíaca, Abdominal e Coxa, todos acentuados) existe em /admin/listas, que passa a mostrar oito listas; listas_fechadas fecha com oito listas com consumidor. O qa provou o efeito dos valores vigentes (200 aceito e 201 recusado, 2000 aceito e 2001 recusado) e não alterou nenhuma lista nem parâmetro de produção; a desativação de item de lista pelo Super foi provada no efêmero (S-8 do db). Aritmética do catálogo: 43 fichas (38 escalares mais as 5 tabulares); em mfit.parametro, 36 mais 2 igual 38, com a trava de cardinalidade da carga em 38 no mesmo deploy. Estado: 32 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor = 43 (30 do estado anterior mais estas duas fichas). Verificador: 51 de 98 pendentes, C 58, universo 156, 8 listas. As duas linhas da tabela acima passam de "a entregar" para entregue. O cartão continua [ ], por causa dos 11 sem consumidor. Nota (Inspeção, gate {F5-04}, Drifts 2, 9 e 11, 2026-10-06): três fichas novas, exame_nome_max_caracteres (grupo saúde, caracteres, valor inicial 160), exame_resumo_max_caracteres (4000) e exame_observacoes_max_caracteres (2000), a entregar em {F5-04} na migração 0059, sem marcar entrega, no molde dos tetos da refeição: lidas só pelo ponto único ({ART-CFG-02}), na chamada, nunca guardadas, valendo no próximo registro sem reiniciar. As linhas da tabela acima trazem a ressalva "a entregar"; as faixas são as já publicadas dos tetos da avaliação, por decisão do Fiscal: 80 a 500 para o nome, igual à de avaliacao_texto_curto_max_caracteres, e 500 a 10000 para o resumo e as observações, igual à de avaliacao_texto_longo_max_caracteres; os valores iniciais 4000 e 2000 cabem nela sem ajuste. O mínimo de 3 caracteres do nome é regra fixa, um objeto classificado C no verificador. A lista tipo_exame (Laboratorial, Imagem, Cardiológico, Funcional e Outro, com o nome "Tipos de exame" em /admin/listas) nasce em {F5-04} na mesma tabela mfit.lista_fechada_item, a entregar em {F5-04}: listas_fechadas passa de oito listas com consumidor para nove no fechamento. Limite de envio: anexo_tamanho_max segue com a faixa de 1 a 50 megabytes, e essa faixa publicada não pode passar do limite de envio do bloco do servidor de fit.modulareasy.com (51 megabytes, só nesse bloco e nunca no arquivo global do servidor web; ficha em {ART-INT-02}); subir a faixa exige subir o limite antes. Aritmética do catálogo: 43 fichas mais 3 igual 46 (41 escalares mais as 5 tabulares, listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email; 41 mais 5 igual 46). Em mfit.parametro: 38 linhas mais 3 igual 41, e a trava de cardinalidade da carga passa a 41 no mesmo deploy da migração (o processo antigo recusa subir com 41 linhas, por isso migração e código novo entram no mesmo passo, sem janela). Soma do Estado recalculada: 32 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor + 3 a entregar em {F5-04} = 46; nada foi somado a "com consumidor", porque as três fichas só têm consumidor quando {F5-04} fechar. Até lá o Estado vigente continua 32 + 0 + 11 = 43. Verificador de parâmetros esperado no fechamento, a medir e não a projetar: cardinalidade 41, listas 9. O título deste cartão, "(43 parâmetros)", descreve o estado vigente e muda no fechamento. O cartão continua [ ]. Fechamento [2026-10-06] de {F5-04}: as três fichas exame_nome_max_caracteres (160, faixa de 80 a 500), exame_resumo_max_caracteres (4000, faixa de 500 a 10000) e exame_observacoes_max_caracteres (2000, faixa de 500 a 10000) estão em mfit.parametro em produção (migração 0059, merge b078e76), com o consumidor no ponto único, valendo no próximo registro sem reiniciar, e a lista tipo_exame está em mfit.lista_fechada_item (cinco itens, editável em /admin/listas). Catálogo de 43 para 46 fichas; mfit.parametro de 38 para 41 linhas (trava de cardinalidade da carga em 41, no mesmo passo da migração); listas fechadas com consumidor de 8 para 9. Estado: 35 de 46 com o consumidor no ponto único, 0 com valor vivo fora do ponto único e 11 sem consumidor: 35 + 0 + 11 = 46 (32 mais as 3 do exame). anexo_tamanho_max segue em 20, faixa de 1 a 50, e a faixa não passa do limite de 51 megabytes do bloco do servidor. Os trechos acima que falam em 43 fichas e em 3 a entregar descrevem o estado anterior a este fechamento. O cartão continua [ ] porque restam 11 parâmetros sem consumidor. Nota (Inspeção, gate {F5-05}, Drifts 4, 5 e 7, 2026-10-06): uma ficha nova, prescricao_texto_longo_max_caracteres (grupo saúde, caracteres, valor inicial 4000, faixa de 500 a 10000, a mesma dos tetos longos da avaliação e do exame), a entregar em {F5-05} na migração 0061, sem marcar entrega, no molde dos tetos do exame: lida só pelo ponto único ({ART-CFG-02}), na chamada, nunca guardada, valendo no próximo registro sem reiniciar; serve os quatro campos longos (diagnóstico, medicamentos, posologia e observações). O teto curto NÃO nasce: a duração deixou de ser texto (Drift 7) e não sobra campo curto. A unidade da duração (dias, semanas ou meses) é constante estrutural, objeto classificado C no verificador, com restrição no banco, e NÃO lista fechada editável (entra no cálculo da vigência; precedente dos dias da semana): listas_fechadas segue em nove listas com consumidor. O texto do aviso do receituário é texto versionado (aviso_receituario, ponto prescricao, em mfit.texto_versionado), não parâmetro. Aritmética do catálogo: 46 fichas mais 1 igual 47 (42 escalares mais as 5 tabulares, listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email; 42 mais 5 igual 47). Em mfit.parametro: 41 linhas mais 1 igual 42, e a trava de cardinalidade da carga passa a 42 no mesmo deploy da migração (migração e código novo no mesmo passo, sem janela); o gate previa 43 (dois tetos), e a decisão da Inspeção sobre a duração derruba o teto curto e fixa 42. Soma do Estado recalculada: 35 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor + 1 a entregar em {F5-05} = 47; nada foi somado a "com consumidor", porque a ficha só tem consumidor quando {F5-05} fechar. Até lá o Estado vigente continua 35 + 0 + 11 = 46. Verificador de parâmetros esperado no fechamento, a medir e não a projetar: cardinalidade 42, listas 9, universo de 160 para 162 (o teto longo e a constante da unidade, C). O título deste cartão, "(46 parâmetros)", descreve o estado vigente e muda no fechamento. O cartão continua [ ]. Fechamento [2026-10-06] de {F5-05}: a ficha prescricao_texto_longo_max_caracteres (4000, faixa de 500 a 10000, em caracteres) está em mfit.parametro em produção (migração 0061, merge de718a6), com o consumidor no ponto único, valendo nos quatro textos longos da prescrição (diagnóstico, medicamentos, posologia e observações) no próximo registro, sem reiniciar. Catálogo de 46 para 47 fichas; mfit.parametro de 41 para 42 linhas (trava de cardinalidade da carga em 42, no mesmo passo da migração); listas fechadas com consumidor inalteradas em 9 (a unidade da duração é constante estrutural, não lista). Estado: 36 de 47 com o consumidor no ponto único, 0 com valor vivo fora do ponto único e 11 sem consumidor: 36 + 0 + 11 = 47 (35 mais a ficha da prescrição). O verificador de parâmetros mede universo 165 e 67 objetos classificados C (a previsão do gate era 162; a decisão do Fiscal trouxe cinco C novas: a faixa da quantidade, as unidades e os três espelhos da migração), 98 editáveis. O texto do aviso do receituário não é parâmetro: é texto versionado. Os trechos acima que falam em 46 fichas e em 1 a entregar em {F5-05} descrevem o estado anterior a este fechamento. O cartão continua [ ] porque restam 11 parâmetros sem consumidor. Nota (Inspeção, gate {F5-06}, Drifts 2, 6 e 7, 2026-10-06): uma ficha nova e uma lista nova, a entregar em {F5-06} na migração 0062, sem marcar entrega. A ficha: reabilitacao_texto_longo_max_caracteres (grupo saúde, caracteres, valor inicial 4000, faixa de 500 a 10000, a mesma dos tetos longos da avaliação, do exame e da prescrição), lida só pelo ponto único ({ART-CFG-02}), na chamada, nunca guardada, valendo no próximo registro sem reiniciar; serve os seis campos longos da sessão (tratamento realizado, exercícios realizados, notas de amplitude, notas de progresso, plano da próxima sessão e observações). O teto curto NÃO nasce: a região é lista, e não sobra campo curto. A lista: regiao_corporal (dezoito itens, com o lado onde há lado, mais "Outra"), editável em /admin/listas na mesma tabela mfit.lista_fechada_item: listas_fechadas passa de nove listas com consumidor para dez no fechamento. É lista editável, e não constante, porque a região é o agrupamento da série de dor de {F7-10} e não regra de cálculo; a escala de dor de 0 a 10 (constante estrutural) e a duração de 1 a 300 minutos (constante técnica) não são parâmetro nem lista, ambas com restrição espelhada no banco. Aritmética do catálogo: 47 fichas mais 1 igual 48 (43 escalares mais as 5 tabulares, listas_fechadas, consentimento_textos, termos_e_aviso_nao_clinico, conquistas e modelos_email; 43 mais 5 igual 48). Em mfit.parametro: 42 linhas mais 1 igual 43, e a trava de cardinalidade da carga passa a 43 no mesmo deploy da migração (migração e código novo no mesmo passo, sem janela). Soma do Estado recalculada: 36 com o consumidor no ponto único + 0 com valor vivo fora do ponto único + 11 sem consumidor + 1 a entregar em {F5-06} = 48; nada foi somado a "com consumidor", porque a ficha só tem consumidor quando {F5-06} fechar. Até lá o Estado vigente continua 36 + 0 + 11 = 47. Verificador de parâmetros esperado no fechamento, a medir e não a projetar: cardinalidade 43, listas 10; o universo e os objetos classificados C se medem no fechamento, sem projeção. O título deste cartão, "(47 parâmetros)", descreve o estado vigente e muda no fechamento. O cartão continua [ ].

ModeloEventoVariáveis permitidasObrigatória no corpo
confirmacao_contacriação de contanome, endereco, validade_minutosendereco
recuperacao_senhapedido de redefinição de senhanome, endereco, validade_minutosendereco
acesso_criadocriação de usuário pela administraçãonome, endereco, validade_minutosendereco
convite_vinculoconvite de vínculo, ao alunonome_aluno, nome_profissional, especialidade, enderecoendereco
vinculo_aceitoconvite aceito, ao profissionalnome_profissional, nome_aluno, enderecoendereco
vinculo_recusadoconvite recusado, ao profissionalnome_profissional, nome_aluno, enderecoendereco
vinculo_encerradovínculo encerrado, às duas partesnome_destinatario, nome_outra_parte, enderecoendereco
convite_canceladoconvite cancelado, ao alunonome_aluno, nome_profissional, enderecoendereco
solicitacao_ficha_criadapedido de ficha, ao profissionalnome_profissional, nome_aluno, enderecoendereco
solicitacao_ficha_atendidapedido atendido, ao alunonome_aluno, nome_profissional, enderecoendereco
solicitacao_ficha_recusadapedido recusado, ao alunonome_aluno, nome_profissional, enderecoendereco

Estado: entregue em {AUD-10} (ver o Fechamento ao fim desta ficha). Onze modelos no universo, medido em 30/09/2026 por três meios (funções de modelo no código, mapa de modelos do envio e linhas email_assunto_ em mfit.parametro: 11 = 11 = 11). Placar: antes, 0 de 11; vigente, 11 de 11 modelos editáveis. Nota (Inspeção, gate {AUD-10}, drifts 2, 3, 4, 6 e 7, 2026-09-30): cinco correções a esta ficha, que valem onde ela divergir. (1) Assunto: {{endereco}} é recusada no assunto, com a variável nomeada na mensagem, porque nos três primeiros modelos (confirmacao_conta, recuperacao_senha e acesso_criado) ela carrega o endereço de uso único em claro, e no assunto ele iria para o cabeçalho, a notificação do celular, a pré-visualização do cliente de e-mail e o registro do servidor de correio; continua obrigatória no corpo dos onze, e as demais variáveis da lista valem no assunto e no corpo. Onde a Validação acima diz que o assunto aceita variáveis da lista do modelo, leia: as da lista menos endereco. (2) Forma da entidade modelo_email: a versão vigente não é atributo, é derivada, o maior número de versão do modelo, porque restaurar cria versão nova e a vigente é sempre a última (uma coluna própria seria segunda fonte capaz de divergir); a entidade ganha rotulo (o título exibido, a tela nunca mostra a chave técnica) e faixa (as faixas do assunto, 3 a 120 caracteres em linha única, e do corpo, 20 a 5000, como dado na mesma forma da faixa dos demais parâmetros, nunca como número no código). (3) Trilha: a entidade ganha parametro_legado_id, o id da linha email_assunto_<modelo> que a migração remove, e a trilha de /admin/auditoria resolve por ele a frase legível das alterações antigas de assunto ("Assunto do e-mail <rótulo>: antigo para novo"), que não viram versões mas continuam legíveis. (4) Permissão: a pré-visualização é leitura e atende os dois papéis; o Administrador ganha a prévia e o "Ver renderizado" das versões gravadas, continua sem editor, sem gravar e sem restaurar, e a rota de escrita lhe responde 403. (5) Ortografia: os corpos saem do código para a semente da migração e o verificador de ortografia passa a varrer o arquivo dessa migração; o texto que o operador grava depois não passa por verificador de ortografia, perda declarada. Fechamento [2026-09-30] de {AUD-10}: os onze modelos estão em produção (merge 17b62d6, migrações 0048 e 0049, https://fit.modulareasy.com, /api/estado na versão 17b62d6), editáveis pelo Super Administrador em /admin/emails, com a versão 1 de cada um igual ao texto que o código produzia (texto 11 de 11 idêntico; HTML 9 de 11 idêntico e 2 com a troca declarada de "Clique" para "Acesse", em recuperacao_senha e acesso_criado). Placar: 11 de 11. Produção: modelo_email 11 linhas, modelo_email_versao 13 (11 mais a versão 2, de teste, e a versão 3, restauração da 1, ambas de recuperacao_senha), email_saida registra modelo_versao. A migração 0049 tirou o código interno de card da descrição do evento acesso_criado (P2-1 do qa). Ressalva nominal: a tela só recusa o texto inválido depois da confirmação (P2-2). Texto de e-mail em código: 11 antes, 0 depois.


Painéis e relatórios


Integração e infraestrutura

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