ModularFit
Validacao em duas frentes, Alfa interna e Beta com usuarios reais.
ModularFit: Plano de Testes
| Campo | Valor |
|---|---|
| Produto | ModularFit |
| Documento base | DRS do ModularFit |
| Companheiros | Roadmap de Implementação · Inventário de Artefatos · Jornadas dos Atores |
| Estágio | Rascunho para validação |
| Data | 2026-09-04 |
Este documento é o que precisa ser validado antes de o ModularFit ser entregue. A etapa Alfa é interna: cada requisito do DRS é exercitado contra o próprio critério de aceite, mais as verificações que atravessam o sistema inteiro. A etapa Beta é com usuários reais: cada jornada de cada papel é percorrida por quem ocupa aquele papel.
Como usar
- Marque o teste quando ele passar na aplicação real, com o resultado observado, nunca por leitura de código.
- Um teste que não consegue reprovar não é teste: o critério de aprovação é sempre um fato verificável.
- Alfa cobre requisito; Beta cobre jornada. Um requisito sem teste Alfa e uma jornada sem teste Beta são lacunas de cobertura.
- Esta seção vale 20 por cento do progresso do projeto e começa em zero.
Atualização de 2026-09-15, escada de acesso. Três cards Alfa novos ({TA-90}, {TA-91} e {TA-92}) e um card Beta novo ({TB-54}) entram com a separação entre Super Administrador e Administrador e com a personificação. O documento passa de 153 para 157 cards, 23 marcados, e a seção Testes do progresso passa a 23 de 157.
Atualização de 2026-09-15, fechamento de {F3-09}.{TA-26}e{TA-32}fecham inteiros neste card, RF-TREI-003 e RF-TREI-009. A seção Testes do progresso passa de 23 para 25 de 157.
Atualização de 2026-09-29, fechamento de {AUD-05}. {TA-91} fecha em produção (rodada 2 do qa, PASS COM RESSALVAS). {TB-54} permanece [ ]: é Beta, com operador real, e só a Inspeção o marca. A seção Testes do progresso passa de 25 para 26 de 160.
Atualização de 2026-09-15, {AUD-06}. Três cards novos entram com a reconciliação do gate modularfit-AUD-06: {TA-93} e {TA-94} (Alfa) e {TB-55} (Beta). O documento passa de 157 para 160 cards, 25 marcados, e a seção Testes do progresso passa a 25 de 160.
Atualização de 2026-09-29, fechamento de {AUD-06}. {TA-93} e {TA-94} fecham em produção (merge29380ae,https://fit.modulareasy.com, qa PASS COM RESSALVAS). {TA-93}: as três formas com consumidor real, número composto (bloqueio_tentativasde 6, 15, 30 para 3, 15, 30, com o bloqueio no terceiro erro), número simples (duração e aviso da personificação, 30 para 45 e 5 para 8) e lista (midia_exercicio_formatossem gif, GIF passa de 200 para 400), trilha com valor antigo e novo e valor fora da faixa recusado com a faixa na mensagem. {TA-94}: verificador RESULTADO OK, 79 de 101 (22 fechados mais 79 restantes igual a 101, universo 148, 0 soltos), com dono nominal em cada restante. {TB-55} permanece[ ]: é Beta, e só a Inspeção o marca. A seção Testes do progresso passa de 26 para 28 de 160.
Atualização de 2026-09-29, reconciliação {AUD-07}. Dois cards novos entram com o gate modularfit-AUD-07: {TA-95} (Alfa) e {TB-56} (Beta), ambos abertos. O documento passa de 160 para 162 cards, 28 marcados, e a seção Testes do progresso passa a 28 de 162.
Atualização de 2026-09-29, reconciliação {AUD-08}. Um card novo entra com o gate modularfit-AUD-08: {TA-96} (Alfa), aberto. O documento passa de 162 para 163 cards, 28 marcados, e a seção Testes do progresso passa a 28 de 163.
Atualização de 2026-09-29, fechamento de {AUD-07}. {TA-95} fecha em produção (merge7b47fa6,https://fit.modulareasy.com, qa PASS COM RESSALVAS na rodada 1 e PASS depois da migração0040), com a evidência nominal no próprio cartão. {TB-56} permanece[ ]: é Beta, e só a Inspeção o marca. A seção Testes do progresso passa de 28 para 29 de 163.
Atualização de 2026-09-29, fechamento de {AUD-08}. {TA-96} fecha em produção (mergefa725bc,https://fit.modulareasy.com, qa PASS COM RESSALVAS), com a evidência nominal no próprio cartão. {TB-55} permanece[ ]: é Beta, e só a Inspeção o marca. A seção Testes do progresso passa de 29 para 30 de 163.
Atualização de 2026-09-29, fechamento pela Inspeção. {TB-54}, {TB-55} e {TB-56} passam em produção (fa725bc,https://fit.modulareasy.com) e são marcados pela Inspeção. A seção Testes do progresso passa de 30 para 33 de 163.
Atualização de 2026-09-30, fechamento de {F4-01}. {TA-33} fecha em produção (merge5e36145,https://fit.modulareasy.com, qa PASS COM RESSALVAS na rodada 1 e PASS na rodada 2), com a evidência nominal no próprio cartão. {TA-90} e {TA-08} movem placar e permanecem[ ]({TA-90} 2 de 28, {TA-08} 3 de 11); {TB-06} permanece[ ], porque é Beta e depende de aluno real. A seção Testes do progresso passa de 34 para 35 de 163.
Atualização de 2026-09-29, Inspeção: card {AUD-09}. Um card novo entra com o Drift 7 do gatemodularfit-F4-02: {TA-97} (Alfa), aberto, que cobre o card {AUD-09} do Roadmap. O documento passa de 163 para 164 cards, 35 marcados, e a seção Testes do progresso passa de 35 de 163 para 35 de 164. {TA-34} ganha uma Nota de placar e continua[ ].
Atualização de 2026-09-30, fechamento de {F4-02}. Nenhum cartão muda de marca e nenhum nasce: o documento segue em 164 cards, 35 marcados, e a seção Testes do progresso segue em 35 de 164. {TA-34} ganha a Nota do placar medido, 3 de 4 cláusulas provadas, e continua [ ] porque a quarta, a comparação visual do painel diário com a meta, é de {F4-04}.
Atualização de 2026-09-30, Inspeção: cards {AUD-11} e {AUD-10}. Dois cards Alfa novos entram com as duas decisões de escopo da Inspeção, ambos abertos: {TA-98}, que cobre {AUD-11} (nutrição como sétima categoria de consentimento, RF-CORE-010), e {TA-99}, que cobre {AUD-10} (modelos de e-mail editáveis, extensão de RF-PAIN-011). O documento passa de 164 para 166 cards, 35 marcados, e a seção Testes do progresso passa de 35 de 164 = 21,34 por cento para 35 de 166 = 21,08 por cento, conta: 164 mais {TA-98} mais {TA-99} igual 166. {TA-10} ganha uma Nota: o universo do placar passa de seis para sete categorias. Nenhuma marcação muda.
Atualização de 2026-09-30, Inspeção: drifts do gate de {AUD-10}. Notas nos casos {TA-99} (a prévia em HTML troca uma palavra em dois modelos; a prova em produção grava uma vez e deixa duas versões de teste identificáveis, com o texto original vigente no fim) e {TA-96} (a parte do assunto migrou para /admin/emails e passa a ser coberta por {TA-99}). Nenhum caso novo, nenhuma marcação alterada.
Atualização de 2026-09-30, fechamento de {F4-04}. {TA-36} e {TA-34} fecham em produção (mergea6624e9,https://fit.modulareasy.com, qa PASS COM RESSALVAS na rodada 1 e PASS na reconferência em3f98363), com a evidência nominal no próprio cartão; {TA-34} fecha 4 de 4 cláusulas, com a quarta provada por este card. {TB-39} e {TB-06} permanecem[ ], porque são Beta e dependem de aluno real. A seção Testes do progresso passa de 40 para 42 de 167 (40 mais {TA-36} e {TA-34}).
Atualização de 2026-09-30, Inspeção: drifts do gate de {AUD-11}. Notas nos cards {TA-07} (universo de dez entidades sensíveis) e {TA-98} (a restrição por especialidade governa também a escrita da meta). Nenhum card novo, nenhuma marcação alterada.
Atualização de 2026-09-30, fechamento de {TA-97}. O caso passa em produção (card {AUD-09}, merged760b2d, migração0045,https://fit.modulareasy.com; evidência no gate de qamodularfit-AUD-09, PASS COM RESSALVAS, zero P0 e zero P1). A seção Testes do progresso passa de 35 de 166 = 21,08 por cento para 36 de 166 = 21,69 por cento, conta: 35 marcados mais {TA-97} igual 36. Nenhum card novo.
Atualização de 2026-09-30, fechamento de {TA-98}. O caso passa em produção (card {AUD-11}, merge6490072, migrações0046e0047,https://fit.modulareasy.com; evidência no gate de qamodularfit-AUD-11, PASS, 61 de 61, zero P0 e zero P1). A seção Testes do progresso passa de 36 de 167 = 21,56 por cento para 37 de 167 = 22,16 por cento, conta: 36 marcados mais {TA-98} igual 37. {TA-10} e {TA-07} movem placar e permanecem[ ]({TA-10} 1 de 7, {TA-07} 2 de 10). Nenhum Beta é marcado e nenhum card novo nasce.
Atualização de 2026-09-30, Inspeção: card {AUD-12}. Um card Alfa novo entra com a decisão de escopo da Inspeção, aberto: {TA-100}, que cobre o card {AUD-12} do Roadmap (textos de consentimento editáveis e versionados). O documento passa de 166 para 167 cards, 36 marcados, e a seção Testes do progresso passa de 36 de 166 = 21,69 por cento para 36 de 167 = 21,56 por cento, conta: 166 mais {TA-100} igual 167. Nenhuma marcação muda.
Atualização de 2026-09-30, fechamento de {TA-99}. O caso passa em produção (card {AUD-10}, merge17b62d6, migrações0048e0049,https://fit.modulareasy.com,/api/estadona versão17b62d6; evidência no gate de qamodularfit-AUD-10, PASS COM RESSALVAS, 12 de 12 critérios, 38 de 38 rotas, zero P0 e zero P1). A seção Testes do progresso passa de 37 de 167 = 22,16 por cento para 38 de 167 = 22,75 por cento, conta: 37 marcados mais {TA-99} igual 38. {TA-96} já estava marcado e a regressão dele (14 de 14 e-mails idênticos) passou sem mudar a marcação. Nenhum Beta é marcado e nenhum card novo nasce.
Atualização de 2026-09-30, fechamento de {TA-100}. O caso passa em produção (card {AUD-12}, merge4e5ed26, migrações0050e0051; evidência no gate de qamodularfit-AUD-12). {TA-10} permanece[ ]: o caso percorre as sete categorias escrevendo sem consentimento, concedendo, escrevendo, revogando e bloqueando de novo, e {TA-100} prova o texto e a versão exibida, não a escrita bloqueada, então a regressão provada não cobre as cláusulas de {TA-10}; o placar dele não se move. O documento continua com 167 cards e passa de 38 para 39 marcados (38 mais {TA-100}); a seção Testes do progresso passa de 38 de 167 (22,75 por cento) para 39 de 167 (23,35 por cento). Nenhum {TB} muda: Beta é da Inspeção.
Atualização de 2026-09-30, fechamento de {TA-35}. O caso passa em produção (card {F4-03}, merge2f5c560, migração0052,https://fit.modulareasy.com,/api/estadona versão2f5c560; evidência no gate de qamodularfit-F4-03, PASS COM RESSALVAS na rodada 1 e PASS na reconferência da rodada 2). {TB-38} permanece[ ]: é Beta, com operador real, e só a Inspeção o marca. {TA-08}, {TA-90}, {TA-92} e {TA-16} não são marcados nem movidos por esta fatia. O documento continua com 167 cards e passa de 39 para 40 marcados (39 mais {TA-35}); a seção Testes do progresso passa de 39 de 167 (23,35 por cento) para 40 de 167 (23,95 por cento). Nenhum card novo nasce.
Atualização de 2026-10-01, fechamento de {TA-37}. O caso passa em produção (card {F4-05}, mergef609a9c, migrações0054e0055,https://fit.modulareasy.com; evidência no gate de qamodularfit-F4-05, PASS COM RESSALVAS na rodada 1 e PASS na reconferência em1b0002c). Os Betas seguem[ ]: são com operador real, e só a Inspeção os marca. O documento continua com 167 cards e passa de 42 para 43 marcados (42 mais {TA-37}); a seção Testes do progresso passa de 42 de 167 (25,15 por cento) para 43 de 167 (25,75 por cento). Nenhum card novo nasce.
Atualização de 2026-10-01, Inspeção: drifts do gate de {F5-01}. Nota no card {TA-85} (as quatro telas clínicas são a mesma tela,/saude: o ponto 3 é um só, e o placar passa a3 de 4com {F5-01}, a entregar, sem marcar). Nenhum card novo e nenhuma marcação alterada: continuam 167 cards e 43 marcados, medidos na contagem de cards do texto antes e depois.
Atualização de 2026-10-01, fechamento de {TA-38}. O caso passa em produção (card {F5-01}, merge9cb16f3, migração0056,https://fit.modulareasy.com; evidência no gate de qamodularfit-F5-01, PASS COM RESSALVAS na rodada 1). Placares parciais: {TA-10} passa de1 de 7para2 de 7, {TA-85} de2 de 4para3 de 4e {TA-07} sobe com a anamnese; os três permanecem[ ]. Os Betas seguem[ ]: são com operador real, e só a Inspeção os marca. O documento continua com 167 cards e passa de 43 para 44 marcados (43 mais {TA-38}); a seção Testes do progresso passa de 43 de 167 (25,75 por cento) para 44 de 167 (26,35 por cento). Nenhum card novo nasce.
Atualização de 2026-10-01, Inspeção: drifts do gate de {F5-02}. Nota de leitura no cartão {TA-39} (a comparação das métricas de teste só existe com o mesmo teste nas duas avaliações; a avaliação não se edita, a correção é nova avaliação). Nenhum cartão novo e nenhuma marcação alterada: continuam 167 cartões e 44 marcados, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-06, Inspeção: card {AUD-13}. Um card Alfa novo entra com a decisão de escopo da Inspeção, aberto: {TA-101}, que cobre o card {AUD-13} do Roadmap (corpo de requisição inválido responde 400 em todas as rotas). O documento passa de 167 para 168 cards, 45 marcados, e a seção Testes do progresso passa de 45 de 167 = 26,95 por cento para 45 de 168 = 26,79 por cento, conta: 167 mais {TA-101} igual 168. Nenhuma marcação muda.
Atualização de 2026-10-06, fechamento de {TA-39}. O caso passa em produção (card {F5-02}, merge3ab8395, repositóriowladimirdjr/modularfit, migrações0057e0058aplicadas em produção em 06/10,https://fit.modulareasy.com(/api/estadona versão87ae8e0, a mesma árvore do merge; o deploy damainem3ab8395segue em curso); evidência no gate de qamodularfit-F5-02, rodada 1 FAIL por um P1 de formato do tempo na comparação, corrigido, e reteste na versão87ae8e0PASS). Placares parciais: {TA-10} passa de2 de 7para3 de 7e {TA-07} de4 de 10para5 de 10; {TA-85} fica em3 de 4(a aba Avaliações nasce dentro da casca de/saude, que já contava); os três permanecem[ ]. Os Betas seguem[ ]: são com operador real, e só a Inspeção os marca. O documento continua com 167 cards e passa de 44 para 45 marcados (44 mais {TA-39}); a seção Testes do progresso passa de 44 de 167 (26,35 por cento) para 45 de 167 (26,95 por cento). Nenhum card novo nasce.
Atualização de 2026-10-06, fechamento de {TA-40}. O caso passa em produção (card {F5-03}, merge08b35ed, repositóriowladimirdjr/modularfit, sem migração,https://fit.modulareasy.com(a mesma árvore já provada em produção como208a883; o deploy damainem08b35edsegue em curso); evidência no gate de qamodularfit-F5-03, rodada 1 PASS). Placares parciais: {TA-10}, {TA-07} e {TA-85} não se movem (a avaliação já estava contada em {F5-02}); {TA-101} segue[ ]e cobre o restante do 400, que é o card {AUD-13}. Os Betas seguem[ ]: são com operador real, e só a Inspeção os marca. O documento continua com 168 cards e passa de 45 para 46 marcados (45 mais {TA-40}); a seção Testes do progresso passa de 45 de 168 (26,79 por cento) para 46 de 168 (27,38 por cento). Nenhum card novo nasce.
Atualização de 2026-10-06, fechamento de {TA-101}. O caso passa em produção (card {AUD-13}, merge1c32c5e, repositóriowladimirdjr/modularfit, sem migração,https://fit.modulareasy.com(a mesma árvore já provada em produção comoecef515; o deploy damainem1c32c5esegue em curso); evidência no gate de qamodularfit-AUD-13, rodada 1 PASS). Placares parciais: {TA-40}, {TA-10}, {TA-07} e {TA-85} não se movem. Os Betas seguem[ ]: são com operador real, e só a Inspeção os marca. O documento continua com 168 cards e passa de 46 para 47 marcados (46 mais {TA-101}); a seção Testes do progresso passa de 46 de 168 (27,38 por cento) para 47 de 168 (27,98 por cento). Nenhum card novo nasce.
Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-04}. Notas nos cartões {TA-41} (os casos de prova que o qa executa em produção), {TA-07}, {TA-10} e {TA-85} (placares parciais que sobem, ou não, com {F5-04}, a entregar, sem marcar). Nenhum cartão novo e nenhuma marcação alterada: continuam 168 cartões e 47 marcados, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-06, fechamento de {F5-04}. {TA-41} passou em produção (mergeb078e76, repositóriowladimirdjr/modularfit, migração0059aplicada em produção em 06/10,https://fit.modulareasy.com(a mesma árvore já provada em produção comobde96b3; o deploy damainemb078e76segue em curso); gates plan, db, review e qa verdes) e o cartão passa a[x]. Placares nos cartões {TA-07} (leitor único de registro sensível de5 de 10para6 de 10, capacidade por especialidade de 16 para 18, medida 18 de 18), {TA-10} (consentimento por categoria de3 de 7para4 de 7) e {TA-85} (não se move, segue3 de 4 pontos servidos). O documento continua com 168 cartões e passa de 47 para 48 marcados (47 mais {TA-41}), 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 {TA-42} (o caso prova a duração estruturada e a vigência calculada na leitura), {TA-07}, {TA-10} e {TA-85} (placares parciais que sobem, ou não, com {F5-05}, a entregar, sem marcar). Nenhum cartão novo e nenhuma marcação alterada: continuam 168 cartões e 48 marcados, medidos na contagem de cartões do texto antes e depois.
Atualização de 2026-10-06, fechamento de {TA-42}. O caso passa em produção (card {F5-05}, mergede718a6, repositóriowladimirdjr/modularfit, migrações0060e0061aplicadas 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 como9510270; o deploy damainemde718a6segue em curso); evidência no gate de qamodularfit-F5-05, rodada 1 PASS e dois retestes PASS). Placares parciais medidos no fechamento: {TA-10} sobe de4 de 7para5 de 7, {TA-07} de6 de 10para7 de 10, e {TA-85} não se move (3 de 4); os três cartões seguem[ ]. Os Betas seguem[ ]: são com operador real, e só a Inspeção os marca. O documento continua com 168 cards e passa de 48 para 49 marcados (48 mais {TA-42}); a seção Testes do progresso passa de 48 de 168 (28,57 por cento) para 49 de 168 (29,17 por cento). Nenhum card novo nasce.
Atualização de 2026-10-06, Inspeção: drifts do gate de {F5-06}. Notas nos cartões {TA-43} (o caso prova a variação de menos quatro, o plano só da última sessão ativa, o detalhe sem campo vazio e as recusas de papel, consentimento, faixa, data e byte nulo), {TA-07}, {TA-10} e {TA-85} (placares parciais que sobem, ou não, com {F5-06}, a entregar, sem marcar). Nenhum cartão novo e nenhuma marcação alterada: continuam 168 cartões e 49 marcados, medidos na contagem de cartões do texto antes e depois.
Alfa (testes internos)
Fundação e acesso
Cobre: RF-CORE-001.
Como testar: entrar com credencial correta, com senha errada e com e-mail inexistente; errar seis vezes seguidas.
Passa quando: a credencial correta abre a sessão e leva ao painel do papel, a errada retorna erro que não revela a existência do e-mail e a sexta falha bloqueia a conta por trinta minutos.
Executado em: 05/09/2026, gate .claude/gates/qa/modularfit-F1-03.gate (bateria por curl e jornada no browser).
Cobre: RF-CORE-002.
Como testar: cadastrar com nome, e-mail e senha de oito caracteres; repetir com o mesmo e-mail.
Passa quando: a conta nasce com papel de aluno, plano gratuito e status ativo, com todos os campos opcionais vazios, e o e-mail repetido retorna erro no campo de e-mail.
Executado em: 06/09/2026, gate .claude/gates/qa/modularfit-F1-04.gate (bateria por curl e jornada no browser).
Executado em: 06/09/2026, gate .claude/gates/qa/modularfit-F1-05.gate (matriz 4x4 por curl e jornada no browser).
Cobre: RF-CORE-003.
Como testar: cadastrar nas quatro especialidades com o formato correto e com o formato de outra especialidade.
Passa quando: cada especialidade aceita apenas o próprio formato e recusa os outros três com a mensagem indicando o formato esperado.
Cobre: RF-CORE-004.
Como testar: alterar um campo do perfil, recarregar e consultar a auditoria.
Passa quando: o valor novo persiste e existe entrada de auditoria com autor, campo, valor anterior e valor novo.
Executado em: 06/09/2026, gate .claude/gates/qa/modularfit-F1-06.gate (bateria por curl e jornada no browser).
Cobre: RF-CORE-005.
Como testar: pedir redefinição, usar o endereço recebido, usar o mesmo endereço de novo, pedir para e-mail inexistente.
Passa quando: a senha nova funciona, o segundo uso do endereço retorna link inválido e o e-mail inexistente devolve a mesma mensagem neutra.
Executado em: 06/09/2026, gate .claude/gates/qa/modularfit-F1-07.gate (bateria por curl e jornada no browser).
Cobre: RF-CORE-006.
Como testar: com P1 vinculado e P2 não vinculado ao aluno A1, solicitar por identificador direto um registro de A1 em cada uma das dezesseis entidades; repetir nas duas entidades da classe restrita (conta_integracao e aceite_termos) com os dois profissionais; consultar o perfil de A1 como P1 e conferir campo a campo a resposta.
Passa quando: as dezesseis respondem negado ou vazio para P2 e respondem o registro para P1, as duas restritas respondem negado para os dois, fechando trinta e seis casos, e a consulta de perfil devolve exatamente nome, foto e, sendo profissional, especialidade e registro, sem nenhum dos oito campos privados de D.2.
Nota: este card é executado a cada card que cria uma entidade de dado de aluno, com o placar N de 36 impresso pelo arnês de integração; só é marcado quando as dezoito entidades existirem, o que acontece na Fase 8. Arnês executado em 06/09/2026: 2 de 36, 34 pendentes por card dono (gate .claude/gates/qa/modularfit-F1-08.gate).
Nota (R-3, {F1-19}, 13/09/2026): a cláusula de perfil público deste H1 foi executada em 13/09/2026, com o gate de qa de {F1-19}. O placar N de 36 não se moveu: mfit.usuario, mfit.perfil_aluno e mfit.perfil_profissional não estão entre as dezesseis entidades de E.1, e o número exato de casos fechados continua o do arnês, nunca presumido a partir desta Nota. Este card continua [ ], porque o universo dele é o de E.1 e as três tabelas de {F1-19} não estão nele; a data de fechamento entra aqui quando a décima oitava entidade nascer, na Fase 8.
Nota (gate {F3-08}, 2026-09-15): este card move o placar N de 36 em {F3-08}, e isso se declara porque é o oposto do que {F3-07} escreveu: preferencia_treino é a sexta das dezesseis entidades de dado de aluno de E.1, e {F3-08} é o primeiro card desde {F3-05} a fazer nascer uma delas. O placar sobe pela analogia das irmãs, por dois casos, o que nega ao profissional não vinculado e o que responde ao vinculado, e o número exato é o impresso pelo arnês no dia, nunca presumido a partir desta Nota. O card continua [ ]: o universo dele só se completa na Fase 8.
Nota (placar do arnês, gate {F3-08}, 2026-09-15): nesta rodada, os gates plan, db, qa e review de {F3-08} não imprimem o placar exato N de 36; placar não capturado. O card sobe por analogia (duas linhas, negar ao não vinculado e responder ao vinculado), mas o número fica pendente de o arnês imprimir, nunca presumido a partir desta Nota.
Cobre: RF-CORE-007.
Como testar: com o administrador, abrir um registro de cada uma das seis categorias sensíveis e consultar a auditoria.
Nota (Inspeção, {AUD-11}, drift 4, 2026-09-30): o universo deste caso passa de seis para dez entidades sensíveis (as seis de saúde, medida_corporal, refeicao, meta_nutricional e plano_alimentar): "abrir um registro de cada uma" vale para as dez, e o arnês do leitor único imprime N de 10, hoje 0 de 10, e 2 de 10 quando {AUD-11} entregar (refeicao e meta_nutricional). As demais seguem com os cards que as criam. O card continua [ ].
Fechamento parcial (Inspeção, {AUD-11}, 2026-09-30): o placar do arnês do leitor único passa de 0 de 10 para 2 de 10 (aritmética fecha: 2 servidas mais 8 pendentes igual 10): refeicao e meta_nutricional, cada uma no ponto único do seu módulo, que chama registrarSeAdministrativo. O qa confirmou em produção que o Super lê as duas com 200 e grava a trilha na mesma leitura (+4 entradas), e que o Administrador segue com 403 nomeado. O card permanece [ ].
Passa quando: os seis conteúdos são exibidos e existem seis entradas de acesso administrativo com autor, aluno, entidade e horário.
Nota: este card é executado a cada card da Fase 5 que cria uma entidade sensível, com o placar N de 6 impresso pelo arnês do leitor único; só é marcado quando as seis entidades existirem E a tela de {F1-11} estiver no ar. Mecanismo provado em 06/09/2026 contra tabela de ensaio; 0 de 6 entidades reais servidas (gate modularfit-F1-09.gate).
Fechamento parcial (Inspeção, {F5-01}, 2026-10-01): a anamnese passa a ser servida pelo ponto único do próprio módulo (anamnese/anamnese.ts), que chama registrarSeAdministrativo em toda leitura, e o arnês do leitor único mede 4 de 10 na revisão. O qa confirmou em produção que o Super lendo a lista deixa uma linha acesso_administrativo por anamnese devolvida (6 de 6) e uma no detalhe, e que o Administrador segue com 403 nomeado. O card permanece [ ].
Fechamento parcial (Inspeção, {F5-02}, 2026-10-06): a avaliação física passa a ser servida pelo ponto único do próprio módulo (avaliacao/avaliacao.ts), que chama registrarSeAdministrativo em toda leitura, e o arnês do leitor único mede 5 de 10 na revisão (aritmética fecha: 5 servidas mais 5 pendentes igual 10). O qa confirmou em produção que o Super lendo a lista deixa uma linha acesso_administrativo por avaliação devolvida e a comparação deixa duas, e que o Administrador segue com 403 nomeado. O card permanece [ ].
Nota de placar parcial (Inspeção, gate {F5-04}, Drift 6, 2026-10-06): com {F5-04}, a entregar e sem marcar, o arnês do leitor único sobe de 5 de 10 para 6 de 10 (aritmética: 6 servidas mais 4 pendentes igual 10), porque o exame passa a ser servido pelo ponto único do próprio módulo (exames/exames.ts), que chama registrarSeAdministrativo em toda leitura; o detalhe com anexo grava uma só trilha administrativa, a da emissão do endereço, e a lista não traz endereço. Na mesma entrega, a capacidade por especialidade do verificador de acesso sobe de 16 para 18 entradas (as duas entradas novas do exame). O placar vigente continua 5 de 10 até o fechamento medido. O card permanece [ ].
Fechamento parcial (Inspeção, {F5-04}, 2026-10-06): o exame passa a ser servido pelo ponto único do próprio módulo (exame/exame.ts), que chama registrarSeAdministrativo em toda leitura, e o arnês do leitor único mede 6 de 10 na revisão (aritmética fecha: 6 servidas mais 4 pendentes igual 10); a capacidade por especialidade do verificador de acesso mede 18 de 18 (as duas entradas novas do exame, inserção e atualização). O qa confirmou em produção que a lista nunca traz endereço, que o detalhe com anexo grava uma só trilha administrativa, que só o Super lê a trilha e que o Administrador segue com 403 nomeado. O card permanece [ ].
Nota de placar parcial (Inspeção, gate {F5-05}, Drift 9, 2026-10-06): com {F5-05}, a entregar e sem marcar, o arnês do leitor único sobe de 6 de 10 para 7 de 10 (aritmética: 7 servidas mais 3 pendentes igual 10), porque a prescrição passa a ser servida pelo ponto único do próprio módulo (prescricao/prescricao.ts), que chama registrarSeAdministrativo em toda leitura. Na mesma entrega, a capacidade por especialidade do verificador de acesso sobe de 18 para 20 entradas (as duas da prescrição) e as rotas de corpo do verificador de corpo sobem de 54 (37 JSON, 2 multipart e 15 sem corpo) para 56 (38, 2 e 16). O teste D-6.3, que usa uma tabela inexistente como prova, passa a usar sessao_reabilitacao, porque prescricao passa a existir. O placar vigente continua 6 de 10 até o fechamento medido. O card permanece [ ].
Fechamento parcial (Inspeção, {F5-05}, 2026-10-06): a prescrição passa a ser servida pelo ponto único do próprio módulo (prescricao/prescricao.ts), que chama registrarSeAdministrativo em toda leitura, e o arnês do leitor único mede 7 de 10 na revisão (aritmética fecha: 7 servidas mais 3 pendentes igual 10); a capacidade por especialidade do verificador de acesso mede 20 de 20 (as duas entradas novas da prescrição, inserção e atualização) e as rotas de corpo do verificador de corpo medem 56 (38 JSON, 2 multipart e 16 sem corpo). O qa confirmou em produção que o Administrador recebe 403 em lista, detalhe, registro e desativação, e que o Super Administrador lê (200). O card permanece [ ].
Nota de placar parcial (Inspeção, gate {F5-06}, Drift 9, 2026-10-06): com {F5-06}, a entregar e sem marcar, o arnês do leitor único sobe de 7 de 10 para 8 de 10 (aritmética: 8 servidas mais 2 pendentes igual 10), porque a sessão de reabilitação passa a ser servida pelo ponto único do próprio módulo (reabilitacao/reabilitacao.ts), que chama registrarSeAdministrativo em toda leitura. Na mesma entrega, a capacidade por especialidade do verificador de acesso sobe de 20 para 22 entradas (as duas da sessão de reabilitação) e as rotas de corpo do verificador de corpo sobem de 56 (38 JSON, 2 multipart e 16 sem corpo) para 58 (39, 2 e 17). O teste D-6.3, que usa uma tabela inexistente como prova, passa a usar foto_progresso, porque sessao_reabilitacao passa a existir. O placar vigente continua 7 de 10 até o fechamento medido, e os números de capacidade e de rotas se medem no fechamento, e não se projetam. O card permanece [ ].
Cobre: RF-CORE-008.
Como testar: como aluno e como profissional, tentar remover em definitivo cada uma das onze entidades citadas no requisito.
Passa quando: a única ação oferecida é desativar, o registro desativado continua no histórico e toda exclusão definitiva por papel diferente de administrador é negada nas onze.
Nota: este card é executado a cada card que cria uma das onze entidades, com o placar N de 11 impresso pelo verificador de remoção; só é marcado quando as onze existirem E as listas de trabalho delas estiverem no ar, porque "a única ação oferecida é desativar" é afirmação de interface. Placar em 06/09/2026 após {F1-10}: 1 de 11 servida (vinculo, mecanismo no ar em produção), 10 pendentes pelos cards donos (gate .claude/gates/plan/modularfit-F1-10.gate). Nota (gate {F3-03}, 2026-09-14): placar sobe de 1 de 11 para 2 de 11, ficha_treino ganha rotas próprias de desativar e reativar, servindo o mecanismo já existente desde {F3-01}. Caso continua [ ], nove pendentes pelos cards donos. Nota (gate {F4-01}, 2026-09-30): placar sobe de 2 de 11 para 3 de 11: refeicao ganha desativar com rota e lista, provado pelo qa em produção (confirmação com Confirmar e Voltar, segunda desativação 409, refeição alheia 404, identificador inválido 400, a desativada vai a Desativadas neste dia). Caso continua [ ], oito pendentes pelos cards donos.
Cobre: RF-CORE-009.
Como testar: alterar a série de um exercício numa ficha de outro autor e depois tentar editar e remover a entrada de auditoria por cada papel, inclusive o administrador.
Passa quando: a alteração produz a entrada com valor anterior e valor novo e toda tentativa de editar ou remover a entrada é negada para todos os papéis.
Nota: o "Como testar" parte de uma ficha de treino (ficha_treino/ficha_item), que só existe em {F3-01}, e da tela de edição da ficha ({F3-03}, RF-TREI-003); por isso este card não fecha em {F1-11}. O que {F1-11} prova é a segunda metade do "Passa quando": toda tentativa de editar ou remover a entrada é negada para todos os papéis, provada hoje sobre as entradas geradas pelas três tabelas de perfil. A primeira metade (a alteração produz a entrada com valor anterior e valor novo) está provada para as três tabelas de perfil desde {F1-06} e será reexecutada sobre a ficha quando ela existir. TA-09 é marcado na Fase 3. Segunda metade provada em produção em 07/09/2026 (F1-11): edição e remoção da entrada negadas pelo banco para os três papéis, inclusive o Administrador; a primeira metade aguarda a ficha de treino ({F3-01}). Correção (gate {F3-01}, Drift 5, 2026-09-14): a referência ao card da tela de edição foi corrigida de {F3-02} para {F3-03}. {F3-02} é RF-TREI-002 (criação de ficha pelo próprio aluno); quem entrega a edição da série de uma ficha de OUTRO autor, que é o ponto de partida do "Como testar" deste caso, é {F3-03} (RF-TREI-003). Consequência prática: este caso NÃO fecha em {F3-01}, que só cria a ficha. Fechamento [2026-09-14] de {F3-03}: primeira metade provada em produção (76bc9cd, migração 0026): alterar série de item de ficha de outro autor grava a entrada de auditoria com valor anterior e valor novo, pelo gatilho novo instalado em 0026. Segunda metade já provada desde {F1-11}. As duas metades fecham; caso [x].
Cobre: RF-CORE-010.
Como testar: para cada uma das seis categorias, tentar escrever sem consentimento, conceder, escrever, revogar e tentar escrever de novo.
Passa quando: nas seis a escrita é bloqueada sem consentimento, conclui com consentimento e volta a ser bloqueada após a revogação, com o histórico ainda visível ao titular e ao Super Administrador.
Nota: o "Como testar" percorre as seis categorias escrevendo, e nenhuma das seis tabelas existe ainda; este card não fecha em {F1-12}. O que {F1-12} prova é o mecanismo, contra tabela de ensaio e contra a rota real de consentimento (GET/POST/DELETE /api/consentimentos), com o auxiliar mfit.tem_consentimento bloqueando a escrita, mfit.consentimento_visivel retirando a categoria revogada da leitura do profissional, e o histórico permanecendo legível ao titular e ao Administrador. TA-10 é marcado quando as seis existirem ({F5-01}, {F5-02}, {F5-04}, {F5-05}, {F5-06}, {F5-08}); até lá carrega o placar N de 6 que cada card dono sobe. Placar atual: 0 de 6. Mecanismo provado em produção em 07/09/2026 (F1-12) contra tabela de ensaio na transação de teste; placar 0 de 6; sobe a cada entidade sensível que nascer na Fase 5.
Nota (gate {F3-08}, 2026-09-15): o placar não se move em {F3-08}, e placar que não muda também se declara, senão o leitor supõe que ninguém olhou. A entidade de preferências de treino não é categoria de dado sensível: RN-001 fecha a lista em seis e nenhuma delas é preferência, o campo de limitações e lesões é declaração do próprio aluno e não registro clínico produzido por profissional, e a assimetria entre esse campo e a anamnese está declarada em RN-001 e nas Notas de RF-TREI-008, com a pergunta de produto registrada em {Q4} do Questionário. Continua 0 de 6.
Nota (Inspeção, {AUD-11}, 2026-09-30): RF-CORE-010 passa a ter sete categorias, com nutrição (refeição, meta nutricional e plano alimentar). O "Como testar" e o "Passa quando" deste caso valem para as sete, e o placar passa a N de 7: hoje 0 de 7. A categoria nutrição sobe o placar em um quando {TA-98} passar, e as seis de saúde seguem com os cards da Fase 5.
Fechamento parcial (Inspeção, {AUD-11}, 2026-09-30): {TA-98} passou em produção (merge 6490072), e com ele a categoria nutrição fecha o seu ciclo completo de escrever sem consentimento, conceder, escrever, revogar e ser bloqueada de novo, com o histórico legível ao titular e ao Super Administrador. O placar passa de 0 de 7 para 1 de 7, e o card permanece [ ]: as seis categorias de saúde seguem com os cards da Fase 5. Na mesma rodada o qa confirmou a regressão das seis antigas pela tela (/privacidade com sete cartões, exame concede e revoga com confirmação), o que não sobe o placar delas.
Fechamento parcial (Inspeção, {F5-01}, 2026-10-01): {TA-38} passou em produção (merge 9cb16f3, migração 0056), e com ele a categoria anamnese fecha o ciclo de escrever sem consentimento (bloqueado), conceder, escrever (201), revogar e ser bloqueada de novo, com o histórico legível ao titular e ao Super Administrador. O placar passa de 1 de 7 para 2 de 7 (aritmética fecha: 2 fechadas mais 5 pendentes igual 7: nutrição e anamnese). O card permanece [ ]: as cinco categorias restantes seguem com {F5-02}, {F5-04}, {F5-05}, {F5-06} e {F5-08}. Na mesma rodada o qa confirmou a regressão de nutrição (35 de 35 combinações iguais ao esperado).
Fechamento parcial (Inspeção, {F5-02}, 2026-10-06): {TA-39} passou em produção (merge 3ab8395, migração 0057), e com ele a categoria avaliação física fecha o ciclo de escrever sem consentimento (bloqueado, 403), conceder, escrever (201), revogar e ser bloqueada de novo, com o histórico legível ao titular e ao Super Administrador. O placar passa de 2 de 7 para 3 de 7 (aritmética fecha: 3 fechadas mais 4 pendentes igual 7: nutrição, anamnese e avaliação física). O card permanece [ ]: as quatro categorias restantes seguem com {F5-04}, {F5-05}, {F5-06} e {F5-08}. Na mesma rodada o qa confirmou a regressão da anamnese e da nutrição do aluno.
Nota de placar parcial (Inspeção, gate {F5-04}, Drift 6, 2026-10-06): com {TA-41}, a entregar e sem marcar, a categoria exame passa a fechar o ciclo de escrever sem consentimento (bloqueado), conceder, escrever, revogar e ser bloqueada de novo, e o placar sobe de 3 de 7 para 4 de 7 (aritmética: 4 fechadas mais 3 pendentes igual 7: nutrição, anamnese, avaliação física e exame). Restam {F5-05}, {F5-06} e {F5-08}. O placar vigente continua 3 de 7 até o fechamento medido. O card permanece [ ].
Fechamento parcial (Inspeção, {F5-04}, 2026-10-06): {TA-41} passou em produção (merge b078e76, migração 0059), e com ele a categoria exame fecha o ciclo de escrever sem consentimento (bloqueado, 403), conceder, escrever (201), revogar e ser bloqueada de novo (403), com o histórico ainda legível ao titular e ao Super Administrador (o Médico deixa de ler). Provado também com o consentimento restrito a outra especialidade e com o revogado. O placar passa de 3 de 7 para 4 de 7 (aritmética fecha: 4 fechadas mais 3 pendentes igual 7: nutrição, anamnese, avaliação física e exame). O card permanece [ ]: as três categorias restantes seguem com {F5-05}, {F5-06} e {F5-08}. Na mesma rodada o qa confirmou a regressão da anamnese, da avaliação e da nutrição do aluno.
Nota de placar parcial (Inspeção, gate {F5-05}, Drift 9, 2026-10-06): com {TA-42}, a entregar e sem marcar, a categoria prescrição passa a fechar o ciclo de escrever sem consentimento (bloqueado), conceder, escrever, revogar e ser bloqueada de novo, e o placar sobe de 4 de 7 para 5 de 7 (aritmética: 5 fechadas mais 2 pendentes igual 7: nutrição, anamnese, avaliação física, exame e prescrição). Restam {F5-06} e {F5-08}. O placar vigente continua 4 de 7 até o fechamento medido. O card permanece [ ].
Fechamento parcial (Inspeção, {F5-05}, 2026-10-06): {TA-42} passou em produção (merge de718a6, migrações 0060 e 0061), e com ele a categoria prescrição fecha o ciclo de escrever sem consentimento (bloqueado, 403), conceder (201), restringir a outra especialidade (403) e a Médico (201), revogar e ser bloqueada de novo (403). O placar passa de 4 de 7 para 5 de 7 (aritmética fecha: 5 fechadas mais 2 pendentes igual 7: nutrição, anamnese, avaliação física, exame e prescrição); a leitura do arnês de consentimento mede 7 de 10. O card permanece [ ]: as duas categorias restantes seguem com {F5-06} e {F5-08}. Na mesma rodada o qa confirmou a regressão da anamnese, da avaliação e do exame.
Nota de placar parcial (Inspeção, gate {F5-06}, Drift 9, 2026-10-06): com {TA-43}, a entregar e sem marcar, a categoria sessão de reabilitação passa a fechar o ciclo de escrever sem consentimento (bloqueado), conceder, escrever, revogar e ser bloqueada de novo, e o placar sobe de 5 de 7 para 6 de 7 (aritmética: 6 fechadas mais 1 pendente igual 7: nutrição, anamnese, avaliação física, exame, prescrição e sessão de reabilitação). Resta {F5-08}. O placar vigente continua 5 de 7 até o fechamento medido. O card permanece [ ].
Cobre: RF-CORE-011.
Como testar: abrir o endereço raiz sem sessão, clicar nas duas chamadas de ação, e abrir o mesmo endereço com sessão ativa de cada papel.
Passa quando: a página responde sem redirecionar para a tela de entrada, o primeiro bloco trata do treino de musculação antes de qualquer menção a dieta, saúde ou comunicação, exibe os cinco papéis de público nominalmente e as chamadas entrar e criar conta, cada chamada leva à tela correspondente, e quem tem sessão ativa é levado ao painel do papel dele.
Nota: os três cenários estão provados em produção com navegador real, nunca por requisição crua, porque o servidor devolve o mesmo index.html para todo caminho e requisição sem navegador prova o código de resposta e nada mais; o terceiro cenário roda com as três contas de teste (aluno, profissional, administrador), cada uma chegando ao painel do próprio papel; e a ordem "musculação antes de dieta, saúde ou comunicação" é conferida na ordem do documento, não na aparência. Placar: 3 de 3 cenários, fechado em {F1-17}.
Cobre: RF-CORE-012, D.6.
Como testar: percorrer os quatro pontos (termos no cadastro, cadastro do profissional de saúde, topo das telas de exame, prescrição, anamnese e sessão de reabilitação, e o pacote da exportação); publicar uma versão nova do texto e repetir; conferir o registro do aceite.
Passa quando: o aviso aparece nos quatro pontos, o aceite fica registrado com versão e data, a versão nova aparece nos quatro sem alterar o aceite anterior, e não existe conta ativa sem aceite registrado.
Nota (R-7, 2026-09-13): placar 2 de 4 pontos servidos. Servidos: termos do cadastro, cadastro do profissional (as quatro especialidades). Pendentes: topo das quatro telas clínicas (exame, prescrição, anamnese, sessão de reabilitação; cards {F5-01}, {F5-04}, {F5-05}, {F5-06}) e o pacote de exportação (card {F8-09}), porque as telas donas ainda não existem. O mecanismo que os servirá está entregue desde {F1-18} e é verificado por critério (ops/verifica-aviso-nao-clinico.mjs). Este card fecha quando o quarto ponto nascer.
Nota (Inspeção, gate {F5-01}, Drift 7, 2026-10-01): as quatro telas clínicas (anamnese, exame, prescrição e sessão de reabilitação) vivem na mesma tela de saúde, /saude, uma linha do Apêndice de telas, com uma aba por tipo de registro. O aviso fica no topo da casca e serve as quatro abas por construção, de modo que o ponto 3, o topo das telas clínicas, é UM ponto. Com {F5-01}, a casca nasce com o aviso e o placar passa de 2 de 4 pontos servidos para 3 de 4, medido no fechamento do card; o quarto ponto continua sendo o pacote de exportação ({F8-09}). As abas de exame, prescrição e reabilitação nascem DENTRO da casca, nos cards {F5-04}, {F5-05} e {F5-06}, e o verificador reprova aba clínica fora dela. Nada é marcado: este card continua [ ] e o placar vigente continua 2 de 4.
Fechamento parcial (Inspeção, {F5-01}, 2026-10-01): a casca de /saude nasceu em produção (merge 9cb16f3) com o aviso de natureza não clínica no topo e o texto vigente da tabela de textos, e o verificador verificar:aviso-nao-clinico classifica o ponto telas_clinicas como servido. O placar passa de 2 de 4 pontos servidos para 3 de 4: termos do cadastro, cadastro do profissional e topo das telas clínicas; falta o pacote de exportação ({F8-09}). O card permanece [ ].
Nota (Inspeção, {F5-02}, 2026-10-06): o placar não se move em {F5-02}, e placar que não muda também se declara. A aba Avaliações nasce dentro da casca de /saude, que já traz o aviso no topo desde {F5-01}; o ponto telas_clinicas continua um só. Segue 3 de 4 pontos servidos. O card permanece [ ].
Nota (Inspeção, gate {F5-04}, Drift 6, 2026-10-06): o placar não se move em {F5-04}, e placar que não muda também se declara. A aba Exames nasce dentro da casca de /saude, que já traz o aviso no topo desde {F5-01} (Drift 7 de {F5-01}: a aba dentro da casca não é um ponto novo); o ponto telas_clinicas continua um só. Segue 3 de 4 pontos servidos. O card permanece [ ].
Nota (Inspeção, {F5-04}, 2026-10-06): fechamento medido: o placar não se moveu em {F5-04}, e placar que não muda também se declara. A aba Exames nasceu dentro da casca de /saude, com o aviso no topo em todas as telas conferidas pelo qa, sem ponto novo. Segue 3 de 4 pontos servidos; falta o pacote de exportação ({F8-09}). O card permanece [ ].
Vínculo
Nota (Inspeção, gate {F5-05}, Drift 4, 2026-10-06): o placar não se move em {F5-05}, e placar que não muda também se declara. A aba Prescrições nasce dentro da casca de /saude, que já traz o aviso no topo, e o aviso do receituário é texto versionado próprio (chave aviso_receituario, ponto prescricao), e não um ponto de RF-CORE-012. Segue 3 de 4 pontos servidos; o quarto é o pacote de exportação ({F8-09}), do qual este card não é dono. O card permanece [ ]. Nota (Inspeção, {F5-05}, 2026-10-06): fechamento medido: o placar não se moveu em {F5-05}, e placar que não muda também se declara. A aba Prescrições nasceu dentro da casca de /saude, com o aviso não clínico no topo e o aviso do receituário como texto versionado próprio, sem ponto novo de RF-CORE-012; o verificador do aviso não clínico mede 3 + 1 + 0 e a regressão dos termos, do aviso não clínico e dos consentimentos em /admin/textos passou. Segue 3 de 4 pontos servidos; falta o pacote de exportação ({F8-09}). O card permanece [ ]. Nota (Inspeção, gate {F5-06}, Drift 8, 2026-10-06): o placar não se move em {F5-06}, e placar que não muda também se declara. A aba Reabilitação nasce dentro da casca de /saude, que já traz o aviso no topo. Segue 3 de 4 pontos servidos; o quarto é o pacote de exportação ({F8-09}), do qual este card não é dono. O card permanece [ ].
Cobre: RF-VINC-001.
Como testar: enviar convite pelo identificador do aluno e tentar consultar dados do aluno com o vínculo ainda pendente.
Passa quando: o vínculo nasce pendente, o aluno recebe a notificação e toda consulta do profissional ao aluno retorna vazia.
Nota (gate {F2-05}): o Como testar já usava só o identificador; a Descrição de RF-VINC-001 permitia também busca por nome no DRS e foi reconciliada (removida), pois D.2 e {ART-ACS-11} nunca aceitam nome nem LIKE. Este card fecha em {F2-05}, ainda [ ] até a construção da fatia terminar. Nota (gate {F2-06}): pendente para cancelado (E.3) tem dono nomeado, {F2-07}; não é coberto por este TA.
Cobre: RF-VINC-002.
Como testar: aceitar um convite e recusar outro, consultando os dados do aluno em cada caso.
Passa quando: o aceito abre o acesso às categorias consentidas e o recusado não retorna nenhum registro ao profissional.
Cobre: RF-VINC-003.
Como testar: encerrar um vínculo em que o profissional criou três fichas, pelo lado do aluno e, em outro caso, pelo lado do profissional.
Passa quando: o vínculo fica inativo, as três fichas continuam existindo com a autoria preservada e visíveis ao aluno e ao administrador, e toda criação ou edição pelo profissional é negada.
Nota (gate {F2-07}): provado na URL real (https://fit.modulareasy.com) pelos dois lados, aluno e profissional, com arnês de banco real encerramento.test.ts (22 casos) e tabela de ensaio mfit.ficha_ensaio; controle negativo da autoria (ficha de terceiro invisível ao profissional após o encerramento) e da escrita negada (INSERT/UPDATE com 403) incluídos.
Cobre: RF-VINC-004, RF-PLAN-003.
Como testar: num plano com vínculos ilimitados, aceitar dois Personal Trainers, um Médico, um Fisioterapeuta e um Nutricionista; tentar um convite do mesmo profissional que já tem vínculo ativo; repetir num plano com limite numérico até estourá-lo; conferir no banco a ausência de índice ou verificação por aluno e especialidade.
Passa quando: os cinco vínculos ficam ativos, os dois personais enxergam os dados consentidos, nenhuma recusa cita especialidade, o convite do profissional já vinculado é recusado por par repetido, e a única recusa por quantidade é a do limite do plano, nomeando o limite.
Fechamento [2026-09-14]: provado na URL real (https://fit.modulareasy.com) pelo arnês simultaneos.test.ts (16 casos), rotas reais, e-mails com MX, transação desfeita. Quatro metades nominadas: (1) cinco vínculos ativos pelas rotas reais de convite e aceite, dois Personal Trainers mais Médico, Fisioterapeuta e Nutricionista, zero recusa por especialidade; (2) convite do mesmo profissional já vinculado recusado com 409 vinculo_ja_existe, nunca especialidade no corpo da resposta; (3) plano numérico até estourar, recusa limite_do_plano nomeando o limite e o plano que amplia, e o mesmo aceite conclui depois de ampliar; (4) conferência no banco aplicado, pg_index, pg_constraint, pg_policy e pg_trigger de mfit.vinculo, zero com predicado sobre especialidade.
Cobre: RF-VINC-005.
Como testar: filtrar por estado pendente na administração e desativar um vínculo ativo.
Passa quando: a lista traz somente pendentes com profissional, aluno, especialidade e data, e o profissional do vínculo desativado deixa de acessar aquele aluno na consulta seguinte.
Fechamento [2026-09-14]: provado na URL real (https://fit.modulareasy.com) pelo arnês server/src/rotas/admin/vinculos.test.ts (unitário, client falso) e server/src/vinculos/gestaoGlobal.test.ts (banco real, transação desfeita). Duas metades nominadas: (1) filtro por estado=pendente trazendo somente pendentes, cada um com profissional, aluno, especialidade e data não nulos, com a aritmética das linhas filtradas mais as dos demais estados fechando contra o total sem filtro; (2) a sessão do profissional aberta antes da desativação, sem novo login, lendo uma linha antes e zero depois (mfit.pode_ler_aluno falso), com o controle negativo de um segundo profissional com vínculo ativo continuando a ler o aluno depois da desativação do primeiro.
Planos
Cobre: RF-PLAN-001.
Como testar: criar um plano, atribuí-lo a um aluno e alterar um limite dele.
Passa quando: o plano aparece para atribuição e a verificação seguinte do aluno já usa o limite novo, sem publicação nova do sistema.
Nota: o Como testar tem três passos, criar um plano ({F1-13}), atribuí-lo a um aluno ({F1-14}) e alterar um limite dele com a verificação seguinte do aluno ({F1-15}); os três estão provados com dado real em produção, o terceiro pela política de {F1-15} sobre a única dimensão com dado real hoje (vinculos_ativos). Placar: 3 de 3 passos, fechado em {F1-15}.
Cobre: RF-PLAN-002.
Como testar: trocar o plano de um aluno e depois marcar o status como inativo.
Passa quando: o aluno opera com os limites novos na sessão seguinte e, inativo, só alcança perfil, plano e leitura do histórico, com toda escrita negada.
Nota: o Como testar tem duas metades, trocar o plano de um aluno (deste card) e marcar o status como inativo (deste card); o Passa quando exige que o aluno opere com os limites novos na sessão seguinte, e operar com limite é {F1-15}, entregue e provado em produção. {F1-14} prova a metade do status inativo, inteira e com dado real; {F1-15} prova a metade dos limites novos na sessão seguinte, inteira e com dado real. Placar: 2 de 2 metades, fechado em {F1-15}.
Cobre: RF-PLAN-003.
Como testar: com limite de um vínculo, aceitar o segundo convite; ampliar o plano e repetir; atribuir o plano com a dimensão ilimitada e aceitar mais vínculos do que qualquer plano numérico permite.
Passa quando: a primeira tentativa é recusada nomeando o limite e o plano que o amplia, a segunda conclui, e no plano ilimitado nenhuma tentativa é recusada.
Nota: o Como testar diz literalmente "aceitar o segundo convite", e a rota de aceite é {F2-06}, que ainda não existe; por isso este card não fecha em {F1-15}. O mecanismo de recusa e liberação por limite ({F1-15}, ART-ACS-10) é provado por inteiro contra o caminho de escrita real que já existe hoje (desativarVinculo) e, quando {F2-06} nascer, contra o UPDATE do aceite, que herda a mesma guarda por construção. Placar: mecanismo provado por inteiro, jornada completa de convite e aceite pendente de {F2-06}.
Nota (gate {F2-06}, 2026-09-14): {F2-06} entrega a jornada completa (recusa por limite, ampliação do plano, plano ilimitado com a contagem que não roda) no item 6 do seu próprio arnês de H1. Este card fecha quando {F2-06} construir e provar, não antes; segue [ ] até lá.
Fechamento [2026-09-14]: {F2-06} entregue (merge 9b994b0); a jornada completa do limite provada no item 6 do arnês: recusa nomeando limite e plano, ampliação concluindo o aceite, plano ilimitado sem recusa e com a contagem que não rodou. Fecha aqui.
Cobre: RF-PLAN-004.
Como testar: abrir a tela do plano e comparar o consumo exibido com a contagem real dos registros do aluno, num plano numérico e no plano ilimitado.
Passa quando: nome, status e cada limite aparecem com consumido e máximo, o consumido é igual à contagem real, e na dimensão ilimitada aparece a palavra ilimitado no lugar do máximo, sem barra de proporção nem alerta.
Nota: o Como testar tem dois cenários, plano numérico e plano ilimitado, os dois estão provados com dado real em produção; a comparação entre consumo exibido e contagem real roda sobre a única dimensão com tabela hoje (vinculos_ativos), como o passo 3 de TA-16 já faz, e as outras cinco aparecem na tela declaradas como não medidas, nunca como zero, o dia em que o card dono criar a tabela e acrescentar o ramo, a tela passa a compará-las sem uma linha de front. Placar: 2 de 2 cenários, fechado em {F1-16}.
Catálogo de exercícios
Cobre: RF-EXER-001.
Como testar: criar um exercício como administrador preenchendo os onze campos, incluindo erros comuns e dicas de execução; abrir a tela dele e a execução da sessão; criar outro sem esses dois campos; tentar criar, editar e excluir como aluno e como cada especialidade.
Passa quando: o exercício aparece para todos, erros comuns e dicas aparecem como blocos próprios abaixo das instruções na tela e na execução, o exercício sem esses campos não exibe bloco vazio nem muda a altura da tela, e as operações de escrita são negadas para todos os papéis que não são administrador.
Nota (R-8, {F2-01}): o Como testar exige os dois campos novos visíveis na tela e na execução da sessão; a execução da sessão é {F3-05}. Placar: 1 de 2 pontos de exibição (tela do exercício servida em {F2-01}; execução da sessão pendente em {F3-05}). Este teste segue aberto.
Nota (gate {F3-05}, Drift 4, 2026-09-14): o placar 1 de 2 deste caso deixa de ser constante escrita à mão e passa a ser medido. Ele nasceu fixo em {F2-01} porque o segundo ponto de exibição não existia; com {F3-05} ele existe, e trocar 1 por 2 na caneta no fechamento seria exatamente o defeito que a casa reprova. A partir daqui o número vem do verificador do catálogo de exercícios, por critério estático e ponto único: os blocos de erros comuns e de dicas de execução vêm de um componente compartilhado, consumido pela tela do exercício e pela execução da sessão, e o critério varre a aplicação provando que nenhum arquivo fora da lista nominal autorizada os renderiza, com isca de controle negativo; servido é a contagem de telas que consomem esse componente, medida na árvore. A Descrição de RF-TREI-005 foi reconciliada nesta data para nomear instruções de execução, erros comuns e dicas entre o que a tela de execução mostra, alinhando o requisito ao que este caso e a jornada do Aluno já cobravam, sem tocar o H1 dele nem o de RF-EXER-001. Este caso só passa a [x] se a medição der 2 de 2; se der 1 de 2, continua [ ] com o motivo, e o card {F3-05} fecha assim mesmo. O número manda no caso de teste, nunca o contrário.
Fechamento [2026-09-15]: a medição do verificador 14 deu 2 de 2. Os blocos de erros comuns e dicas de execução vêm do componente único, consumido pela tela do exercício e pela tela de execução da sessão real (/treinos/sessao), medido na árvore, sem arquivo fora da lista nominal autorizada renderizando os dois campos. RF-EXER-001 fechado, os dois pontos de exibição servidos.
Cobre: RF-EXER-002.
Como testar: abrir na execução um exercício com imagem e vídeo e outro sem mídia, medindo a proporção renderizada da imagem. Técnica: comparar a proporção do retângulo renderizado, obtida por getBoundingClientRect() (fracionário, nunca clientWidth, que arredonda para inteiro e fabrica reprovação falsa em imagem pequena), com naturalWidth/naturalHeight do próprio elemento, tolerância 0,5 por cento; e, na lista, conferir que o encaixe é contain em vez de medir o retângulo da miniatura, que é 4 por 3 por desenho.
Passa quando: a proporção renderizada é igual à proporção natural do arquivo, o vídeo aparece embutido e reproduzível e o exercício sem mídia não altera a altura dos demais elementos.
Nota (R-10, {F2-02}): o Como testar exige a imagem e o vídeo na execução, e a execução da sessão é {F3-05}. Placar honesto: 1 de 2 pontos de exibição (tela do exercício servida em {F2-02}; execução da sessão pendente em {F3-05}). Este teste segue aberto.
Nota (gate {F3-05}, Drift 4, 2026-09-14): o placar 1 de 2 deste caso deixa de ser constante escrita à mão e passa a ser medido, pelo mesmo motivo do de {TA-20}: ele nasceu fixo em {F2-02} porque o segundo ponto de exibição não existia, e agora existe. A medição é a que este caso já descreve e que o verificador de mídia já executa em navegador real, proporção do retângulo renderizado por getBoundingClientRect() contra naturalWidth e naturalHeight do próprio elemento, tolerância de 0,5 por cento, agora também na tela de execução real, com sessão de aluno, e não apenas na tela do exercício. servido passa a ser contado, nunca declarado. Este caso só passa a [x] se a medição der 2 de 2; se der 1 de 2, continua [ ] com o motivo, e o card {F3-05} fecha assim mesmo.
Nota (Fechamento {F3-05}, 2026-09-15): medido no navegador real, na tela de execução (/treinos/sessao), com o catálogo de produção: o placar deu 1 de 2, não 2 de 2. A tela do exercício continua servida desde {F2-02}; a execução consome o mesmo componente único de mídia e mede a proporção pela mesma técnica, mas nenhum exercício do catálogo em produção tem imagem nem vídeo cadastrados (docs/seed/midia/ ainda não chegou, pendência do dono, ver {ART-WF-17} e a medição 12 do gate {F3-05}). O mecanismo está pronto e foi medido no navegador; o que falta é dado, não código. Este caso continua [ ] até a mídia existir em produção e a medição repetir 2 de 2.
Cobre: RF-EXER-003.
Como testar: filtrar por grupo e por dificuldade ao mesmo tempo e conferir o contador.
Passa quando: todos os itens listados atendem às duas condições e o contador é igual ao número de itens.
Executado em: 14/09/2026, gate .claude/gates/qa/modularfit-F2-03.gate (API grupo=costas&dificuldade=iniciante com total=1 e o par negativo confirmado, UI aluno e UI admin com o mesmo filtro, combinação dos quatro filtros mais busca acertando um único item e a vizinhança sem equipamento certo devolvendo zero; verificador 15 de 15).
Cobre: RF-EXER-004.
Como testar: abrir o catálogo com um aluno no plano gratuito e sem vínculo.
Passa quando: ele consulta qualquer exercício com mídia e instruções e nenhuma ação de escrita é oferecida nem aceita.
Nota (R-11, {F2-02}): a cláusula de mídia está servida desde {F2-02}; o teste fecha no card dono dela, {F2-04}, quando o aluno gratuito e sem vínculo percorrer o catálogo.
Executado em: 14/09/2026, gate .claude/gates/plan/modularfit-F2-04.gate (arnês leituraPorPapel.test.ts, verificador 15 com sessão real de aluno em /exercicios e no detalhe, sem controle de escrita encontrado; verificador 14 critérios (j) e (k)).
Cobre: RF-EXER-005.
Como testar: com sete exercícios sem mídia, acionar a geração em lote, conferir o catálogo antes de qualquer aprovação, aprovar duas prévias e rejeitar cinco; depois acionar a geração individual num exercício que já tem mídia.
Passa quando: são produzidas sete prévias, nenhum exercício teve a mídia alterada antes da aprovação, exatamente dois passam a ter mídia, os cinco rejeitados voltam a constar na lista de exercícios sem mídia, e o exercício que já tinha mídia não entra no lote sem escolha individual.
Treino
Cobre: RF-TREI-001.
Como testar: criar ficha com quatro exercícios, preenchendo a observação de um item, e conferir a lista do aluno e a execução.
Passa quando: os quatro itens aparecem na ordem definida, o autor registrado é o profissional, o item com observação a exibe junto do exercício durante a execução e os três sem observação não reservam espaço para ela.
Nota (gate {F3-01}, Drift 4, 2026-09-14): este caso NÃO fecha inteiro em {F3-01}, e o motivo é a fronteira do card, não uma falha dele. O "Passa quando" tem quatro cláusulas. As duas primeiras (os quatro itens aparecem na ordem definida, e o autor registrado é o profissional) são provadas por {F3-01}, no arnês e na tela real, com o profissional criando a ficha e o aluno vendo a lista. As duas últimas (o item com observação a exibe junto do exercício durante a execução, e os três sem observação não reservam espaço para ela) acontecem na tela de execução da sessão, /treinos/sessao, que é RF-TREI-005 e card {F3-05}; {F3-01} não entrega execução. O componente que desenha o item da ficha é ÚNICO, consumido pelo detalhe da ficha em {F3-01} e pela execução em {F3-05}, e por isso a regra do espaço reservado já nasce provada no detalhe, restando exercitá-la na execução: há um lugar só a divergir, não dois. Por isso este caso fica [ ] com motivo escrito até {F3-05}, nunca [x] por metade e nunca [ ] mudo.
Fechamento [2026-09-15]: fecha inteiro no card {F3-05} (merge 80c103e, https://fit.modulareasy.com). As duas cláusulas restantes provadas na tela de execução real: o item com observação a exibe junto do exercício durante a execução, e os três sem observação não reservam espaço para ela, pelo mesmo componente único já provado no detalhe da ficha em {F3-01}. RF-TREI-001 fechado.
Cobre: RF-TREI-002.
Como testar: criar ficha com um aluno sem nenhum vínculo e depois vincular um profissional.
Passa quando: a ficha é salva com autoria do aluno e aparece ao profissional identificada como criada pelo aluno.
Fechamento [2026-09-14]: fecha inteiro no card {F3-02} (merge 3d25e27, https://fit.modulareasy.com). Provado pela interface real, nas duas metades e na ordem do "Como testar" (criar primeiro, vincular depois): um aluno sem nenhum vínculo criou uma ficha com três exercícios em /fichas/nova e ela apareceu em /treinos e /treinos/:id com "Criada por você"; vinculado um profissional depois, ele leu a mesma ficha por /treinos?aluno=<id> identificada como "Criada pelo aluno", e um segundo profissional sem vínculo não viu nada. RF-TREI-002 fechado.
Cobre: RF-TREI-003.
Como testar: com o aluno dono, tentar alterar séries, repetições, ordem e lista de uma ficha do profissional; depois alterar como o próprio autor.
Passa quando: as quatro alterações pelo aluno são negadas com as ações consultar, pedir ajuste e duplicar disponíveis, e a alteração do autor grava e gera auditoria.
Nota (gate {F3-03}, Drift 7, 2026-09-14): este caso NÃO fecha inteiro em {F3-03}, e o motivo é a fronteira do card, não uma falha dele. O "Passa quando" tem duas metades. A primeira (as quatro alterações pelo aluno são negadas, e a alteração do autor grava e gera auditoria com valor anterior e valor novo) é provada por {F3-03}, no arnês e na tela real, nas duas camadas. A segunda cobra que, junto da negação, estejam disponíveis as ações consultar, pedir ajuste e duplicar: consultar já existe desde {F3-01}, mas pedir ajuste é a solicitação de RF-TREI-004, cujo card dono é {F3-04}, e duplicar é RF-TREI-009, cujo card dono é {F3-09}. Enquanto os dois não nascerem, a tela oferece ao não autor apenas consultar, sem botão desabilitado e sem rótulo "em breve": ausência é ausência, e enfeitar a tela para fechar este caso seria fechá-lo por mentira. Por isso este caso fica [ ] com motivo escrito até {F3-09}, nunca [x] por metade e nunca [ ] mudo, no molde exato da Nota de {TA-24}.
Nota (gate {F3-04}, 2026-09-14): a segunda metade do "Passa quando" deste caso anda, e não fecha. Pedir ajuste passa a existir de verdade com {F3-04}: na tela de detalhe da ficha, ao aluno titular que não é o autor, ao lado de consultar, produzindo a solicitação de RF-TREI-004 com estado próprio e aviso ao profissional. Duplicar continua ausente, porque é RF-TREI-009 e tem card dono {F3-09}, e continua sem botão desabilitado, sem rótulo "em breve" e sem banner: ausência é ausência. Das três ações que este caso cobra junto da negação, duas passam a existir (consultar desde {F3-01}, pedir ajuste desde {F3-04}) e uma falta, então o caso continua [ ] com motivo escrito até {F3-09}, nunca [x] por dois terços. A primeira metade continua provada por {F3-03}, e nada aqui a reabre.
Nota (gate {F3-09}, 2026-09-15): este caso fecha inteiro em {F3-09}, e fecha por ter as três ações, nunca por dois terços. A primeira metade do "Passa quando" continua provada por {F3-03}, nas duas camadas, e nada aqui a reabre. A segunda metade completa-se agora: consultar existe desde {F3-01}, pedir ajuste desde {F3-04}, e duplicar é a terceira e última, entregue por este card na mesma tela de detalhe e ao mesmo não autor. A validação exige as três ações presentes ao mesmo leitor não autor, junto da negação das quatro alterações, e o caso passa a [x] no fechamento de {F3-09}, com o placar medido no dia.
Cobre: RF-TREI-004.
Como testar: enviar solicitação com motivo e depois criar a ficha vinculando a solicitação.
Passa quando: o profissional é notificado e vê a solicitação aberta, e ao atender o estado passa a atendida com notificação ao aluno contendo a ficha.
Fechamento [2026-09-14]: fecha inteiro no card {F3-04} (merge 8f0f9fd, https://fit.modulareasy.com). Provado pela interface real, nas quatro cláusulas e nos dois tipos de pedido (ficha nova e ajuste) e nos dois desfechos (atender e recusar): um aluno com vínculo ativo enviou pedido de ficha nova com motivo preenchido, o profissional destinatário foi notificado por e-mail e viu a solicitação com estado aberto em /pro/painel; ao criar a ficha em /fichas/nova?solicitacao= vinculando o pedido, o estado passou a atendida e o aluno recebeu o e-mail com a ficha nova; o mesmo provado para o pedido de ajuste, atendido por alteração da ficha existente; a recusa com motivo obrigatório levou o estado a recusada com aviso ao aluno. Um segundo profissional vinculado ao mesmo aluno e um Administrador leram o pedido e não tiveram ação de resolver. RF-TREI-004 fechado.
Cobre: RF-TREI-005.
Como testar: executar uma ficha de cinco exercícios registrando três séries de carga no primeiro, pulando o segundo, registrando no terceiro uma série por tempo de sessenta segundos sem repetições, anotando observação numa série e na sessão, e deixando a tela do celular ociosa durante a execução.
Passa quando: a sessão registra duração maior que zero, exatamente um pulado, as séries de carga completas, a série por tempo com sessenta segundos e repetições vazias sem erro de validação, o volume igual à soma de carga vezes repetições apenas das séries com os dois valores, as duas observações visíveis no histórico, e a tela não escurece por inatividade durante a sessão em navegador que conceda o bloqueio, voltando ao comportamento normal ao encerrar.
Fechamento [2026-09-15]: fecha inteiro no card {F3-05} (merge 80c103e, https://fit.modulareasy.com). Provado pela interface real, no celular, com contas novas (um aluno, um profissional vinculado, um segundo profissional sem vínculo, um Administrador): sessão de cinco exercícios, três séries de carga no primeiro, o segundo pulado, uma série por tempo de sessenta segundos sem repetições no terceiro, duas observações registradas; a sessão fechou com duração maior que zero, exatamente um pulado, as séries de carga completas, a série por tempo com sessenta segundos e repetições vazias sem erro de validação, o volume somando apenas as séries de carga, as duas observações visíveis, e a tela sem escurecer por inatividade durante a sessão, voltando ao normal ao encerrar. RF-TREI-005 fechado.
Cobre: RF-TREI-006.
Como testar: concluir uma série num exercício com sessenta segundos de descanso, ajustar o tempo durante a contagem e conferir que o alvo e a barra acompanham, deixar chegar a zero e, em outra série, pular.
Passa quando: a contagem começa em sessenta e decresce; ao zerar emite o aviso e libera a série seguinte, e o aviso existe também sem som, com mudança visível na tela e texto anunciável, não apenas o beep; o ajuste aumenta o tempo restante sem estourar a barra e sem reiniciar a contagem; e o botão de pular encerra imediatamente.
Nota (gate {F3-06}, 2026-09-15): quatro cláusulas reconciliadas com a Descrição de RF-TREI-006, que cobra também o ajuste do tempo na hora e não apenas o H1. Fecha [x] só quando as quatro passarem no smoke. Atualização do gate de qa (2026-09-15): três cláusulas fecharam com dado real em https://fit.modulareasy.com (começa em sessenta e decresce; o ajuste +15 s soma sem estourar a barra nem reiniciar a contagem; o botão de pular encerra imediatamente). A quarta cláusula (zerar, emitir o aviso e liberar a série seguinte, com a metade de acessibilidade sem som) fechou só a metade sonora, medida pela mudança de role="status" e pelo retorno do bloco de registro; a metade de acessibilidade (mudança visível e texto anunciável confirmados sem áudio, com volume zero e leitor de tela) não foi testada isoladamente nesta rodada. Por isso o card continua [ ].
Cobre: RF-TREI-007.
Como testar: executar o mesmo exercício em duas sessões com cargas diferentes, registrar na mesma sessão um exercício só por tempo, depois executar um exercício inédito, e abrir o histórico pelos dois papéis, o aluno titular e um profissional vinculado, este com o aluno na consulta, tentando também com um profissional sem vínculo.
Passa quando: o histórico exibe a variação exata entre as duas cargas; o exercício inédito aparece marcado como primeira medição, sem variação; a linha da sessão exibe data, ficha, duração e volume conferindo com a sessão executada; o profissional vinculado vê o mesmo histórico do aluno e quem não tem vínculo não vê nada; e o exercício registrado só por tempo aparece sem chip de variação e sem zero, cálculo não exibido e nunca em zero, conforme RN-004.
Nota (gate {F3-07}, 2026-09-15): seis cláusulas acrescentadas. O texto anterior cobria duas das oito obrigações do requisito, a variação entre duas cargas e a marcação de primeira medição, e deixava de fora a linha da sessão com data, ficha, duração e volume, que é a primeira frase da Descrição e são quatro dos cinco elementos que o Apêndice de telas declara para /treinos/historico; a leitura pelo Profissional, que é o segundo ator declarado do requisito, do Apêndice de telas e da jornada dele; e o exercício só por tempo, que é a linha legítima em que a comparação não existe e não pode virar zero. Fecha [x] só quando as oito passarem no smoke com dado real. {TA-06} não cresce, e isso se declara para que ninguém suponha que ninguém olhou: nenhuma das entidades do modelo de dados nasce neste card.
Nota de fechamento (gate {F3-07}, 2026-09-15): gate de qa rodada 2 (.claude/gates/qa/modularfit-F3-07.gate) aprovado, com prova real em produção 07cfe0b: BUG-01 corrigido, espaço no chip da família .mf-etiqueta, confirmado desktop claro e mobile escuro; a variação exata entre cargas, chip verde mais cinco quilogramas, a marcação de primeira medição, chip laranja, e o exercício só por tempo sem chip, quinto estado que não nasce, confirmados com conta real em mobile 375 escuro e desktop claro; a sessão abandonada fora da lista confirmada; a barra de resumo, contagem de sessões e soma de volume, conferida contra a soma das linhas. Duas das cinco cláusulas do card não têm evidência no gate de qa: nenhuma citação à leitura pelo profissional vinculado nem à negativa a quem não tem vínculo, e nenhuma conferência linha a linha de data e ficha por sessão, só a soma de volume da barra de resumo foi conferida. Card continua [ ] até as duas lacunas fecharem numa próxima rodada de qa.
Cobre: RF-TREI-008.
Como testar: salvar dois objetivos, o nível intermediário, cinco equipamentos, três dias e sessenta minutos, com texto real nos dois campos longos, limitações e lesões e observações, e reabrir; tentar salvar sem objetivo e sem nível; tentar duração fora da faixa de 20 a 120 e duração que não seja múltipla de 5; tentar um valor fora das listas fechadas; desmarcar todos os equipamentos e todos os dias e salvar; e abrir a tela pelos dois papéis, o aluno titular e um profissional vinculado com o aluno na consulta, mais um profissional sem vínculo.
Passa quando: os cinco valores do H1 persistem e voltam exatamente como foram escolhidos; os dois textos voltam idênticos, caractere por caractere, com acento e quebra de linha, e o teto de 2000 caracteres é recusado tanto pela tela quanto pelo servidor; salvar sem objetivo ou sem nível é recusado por campo, com a mensagem no campo certo; valor fora da lista fechada e duração fora da faixa ou fora do passo são recusados; desmarcar tudo é aceito e ao reabrir os dois campos aparecem vazios, sem zero e sem traço; o profissional vinculado enxerga exatamente os mesmos valores e não consegue alterá-los, nem pela tela nem pela rota; e o profissional sem vínculo não enxerga nada.
Nota (gate {F3-08}, Drift 6, 2026-09-15): cinco cláusulas acrescentadas. O texto anterior cobria duas obrigações do requisito, a persistência dos cinco valores do H1 e a leitura pelo profissional vinculado, e deixava de fora justamente limitacoes e observacoes, os dois campos de 2000 caracteres do formulário, que nem apareciam no "Como testar"; a obrigatoriedade de objetivos e de nível, que o Apêndice declara por campo; a faixa e o passo da duração; a recusa de valor fora da lista fechada; e o lado negativo do profissional, que o requisito implica ao dizer "o profissional vinculado" e que a política do banco é quem garante. Fecha [x] só quando as sete passarem no smoke com dado real, e o teste dos textos longos usa 2000 caracteres de verdade, nunca a palavra "teste".
Nota (gate de qa {F3-08}, rodada 2 PASS, 2026-09-15): duas das cinco cláusulas acrescentadas estão provadas ao vivo nesta rodada, a recusa por campo de objetivo e de nível ausentes (422, mensagem no campo certo) e a ausência de leitura ao profissional sem vínculo (404). As outras três seguem sem prova ao vivo nesta rodada: os dois textos de até 2000 caracteres idênticos com o teto recusado tanto pela tela quanto pelo servidor; o valor fora da lista fechada e a duração fora da faixa ou fora do passo recusados; e desmarcar todos os equipamentos e todos os dias, salvar e reabrir vazio. O card continua [ ] até as sete passarem.
Cobre: RF-TREI-009.
Como testar: duplicar uma ficha criada pelo profissional e editar a cópia.
Passa quando: a cópia nasce com os mesmos exercícios, autoria do aluno e referência à origem, a original permanece inalterada e a cópia é editável.
Nota (gate {F3-09}, 2026-09-15): as cinco cláusulas do "Passa quando" deste caso são deste card, e ele fecha inteiro em {F3-09}. Quatro delas se cumprem por construção, e é assim que se provam: os mesmos exercícios, por a cópia dos itens ser derivada da origem na mesma transação e com a ordem preservada; a autoria de quem duplicou, por a política de inserção já exigir que o autor seja o próprio ator; a referência à origem, gravada no mesmo comando; e a cópia editável, por a política de edição já reconhecer o autor da cópia. A cláusula de a original permanecer inalterada prova-se por ausência: nenhum comando do caminho escreve na origem, e a validação confere que a data de alteração dela continua nula e que a contagem de entradas de auditoria da origem é a mesma antes e depois, nunca por inspeção visual da tela. A validação cobre também os papéis: o Administrador não vê a ação, e o profissional vinculado que lê a ficha de um colega e não é o autor vê.
Cobre: RF-TREI-010.
Como testar: iniciar uma sessão, registrar duas séries, fechar o navegador e entrar em outro dispositivo; retomar e concluir; depois deixar outra sessão sem registro além do prazo configurado.
Passa quando: o atalho de retomar aparece no painel e na lista de treinos, a retomada traz as duas séries com o cronômetro seguindo do início original, o volume final considera as séries anteriores mais as novas, e a sessão fora do prazo passa a abandonada, some do atalho nas duas telas e não conta para a progressão.
Nota (gate {F3-10}, Drift 3, 2026-09-29): as três cláusulas deste "Passa quando" que dependem de funcionalidade que ainda não existe ("não conta para sequência, calendário, conquistas") passaram aos casos donos: {TA-55}, {TA-56} e {TA-57} agora cobram que a sessão abandonada no período não conta. Aqui continua medida a cláusula da progressão ({F3-07}). Esta Nota não altera checkbox nenhum.
Fechamento [2026-09-29] de {F3-10}: passou em produção (merge 047f3bc, migração 0042, https://fit.modulareasy.com), com dois contextos de navegador e todos os papéis, pelo qa (34 critérios, 0 reprovações, gate .claude/gates/qa/modularfit-F3-10.gate, reconferência em 3dba4d0). Observado: com duas séries registradas e o navegador fechado, painel e /treinos mostram o atalho, o cronômetro segue do início original (01:04 aos 64 segundos) e as séries voltam na posição em que pararam; ao registrar a terceira e encerrar, a sessão fecha concluída com volume igual à soma das três (580 kg); a sessão fora do prazo responde 204 em GET /api/sessoes/atual com o banco ainda em andamento (o GET não escreve), o atalho some nas duas telas nos dois temas e nas duas larguras, o registro seguinte recebe 409 e a sessão vira abandonada com volume preservado, e ela não aparece no histórico nem no chip de progressão (o histórico mediu 3 concluídas e 980 kg, com 7 abandonadas de fora). A rotina de operação, rodada com o mesmo comando do agendador, abandonou 1 e na segunda rodada 0. Profissional e administrador não veem a faixa; o super administrador personificando a vê. As cláusulas de sequência, calendário e conquistas seguem com {TA-55}, {TA-56} e {TA-57}; o aluno de acesso inativo não foi exercitado.
Dieta
Cobre: RF-DIET-001.
Como testar: registrar refeição com dois alimentos de cem e duzentas calorias e conferir os quatro totais.
Passa quando: cada total exibido é igual à soma dos itens correspondentes.
Fechamento [2026-09-30] de {F4-01}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F4-01, rodadas 1 e 2). Dois alimentos de 100 e 200 kcal devolvem 300 kcal e as somas de proteína, carboidrato e gordura, no POST e no GET do dia; três itens com decimais (33,3, 34, 50,5 e 17,7) somam exato, e três vezes 33,3 dá 99,9, com a soma feita no SQL e lida de volta. A prévia da tela, a lista salva e a API mostram os mesmos totais nos quatro combos de tema e largura (claro e escuro, 400 e 1280 de largura). Sem alimento, o servidor recusa com 422.
Cobre: RF-DIET-002.
Como testar: com dois nutricionistas vinculados ao mesmo aluno, alterar a meta pelo primeiro e depois pelo segundo, conferindo a tela do aluno após cada alteração, o histórico de metas e a auditoria.
Passa quando: o painel diário passa a comparar com a meta mais recente a cada alteração, existem duas entradas de auditoria com os autores corretos, e o histórico preserva as três vigências sem apagar nenhuma.
Nota (gate {F4-02}, Drift 4, 2026-09-29): o aceite deste teste é o H1 de RF-DIET-002 no DRS (dois Nutricionistas, três vigências, duas entradas de auditoria), a mesma decisão do card {F4-02}. {F4-02} entrega três das quatro cláusulas (autoria, histórico e meta vigente do dia); a quarta, a comparação visual do painel diário com a meta, fecha em {F4-04}. Placar parcial esperado no fechamento de {F4-02}: 3 de 4 cláusulas. Hoje nenhuma foi provada, o cartão continua [ ] e o placar se declara medido no dia do fechamento.
Nota (fechamento de {F4-02}, 2026-09-30): placar medido 3 de 4 cláusulas provadas; a quarta é de {F4-04}. Provado em produção pelo gate de qa modularfit-F4-02 (rodadas 1 e 2): (1) a meta do dia a cada alteração, com dois Nutricionistas de vínculo ativo, 2000, depois 2400, depois 2200, e mfit.meta_vigente devolvendo o valor novo no dia e 2000 nos dias anteriores; (2) exatamente duas entradas de auditoria, cada uma com o autor correspondente, e a vigência padrão sem entrada; (3) o histórico preservando as três vigências, sem UPDATE nem DELETE alcançável. Não provada, por não existir ainda: a comparação visual do painel diário com a meta (consumido, restante e percentual), que nasce em {F4-04}. O cartão continua [ ] até lá. {TA-90} e {TA-92} não foram fechados pelo gate de qa deste card e seguem [ ]; {TB-06} é Beta e segue [ ].
Fechamento [2026-09-30] de {F4-04}: placar 4 de 4 cláusulas provadas; as três de {F4-02} (meta vigente do dia, auditoria com os autores, histórico preservado) já estavam provadas e a quarta, o painel comparando com a meta mais recente a cada alteração, fecha aqui. Provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F4-04, rodada 1 em 86449c2 e reconferência em 3f98363): um Nutricionista troca a meta para 2400 e o POST, o GET seguinte e a tela do aluno comparam com 2400 (2300 consumidas dão 100 restantes e 96%); outro Nutricionista troca para 2200 e a mais recente vence (consumo de 2300 dá 100 acima da meta e 105%). Contas de teste apagadas ao fim, com zero resíduo. {TB-06} segue [ ], porque é Beta.
Cobre: RF-DIET-003.
Como testar: criar plano com quatro refeições e tentar editá-lo com quem não é o autor.
Passa quando: as quatro aparecem na ordem de horário na tela do aluno e a edição por quem não é autor é negada.
Fechamento [2026-09-30] de {F4-03}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F4-03, rodadas 1 e 2), placar 1 de 1 cláusula. O Nutricionista de vínculo ativo cria um plano com quatro refeições fora de ordem (20:00, 12:30, 06:30, 16:00) e o aluno as vê na ordem 06:30, 12:30, 16:00, 20:00, com as calorias somadas pelo banco iguais à soma independente (1148; 1030,5 pela interface, com vírgula). A edição por quem não é o autor é negada com 403 nomeado e título intacto, para o aluno, o Personal e outro Nutricionista; o autor edita (200) com atualizado_por. A condição do Fiscal, a trilha da refeição removida com o conteúdo anterior, foi provada na reconferência (5fbaf4b). Contas de teste apagadas ao fim, com zero resíduo.
Cobre: RF-DIET-004.
Como testar: com meta de duas mil e mil e duzentas registradas, abrir o painel e navegar para um dia sem registro.
Passa quando: exibe mil e duzentas, oitocentas e sessenta por cento, e o dia sem registro mostra os quatro totais em zero sem erro.
Fechamento [2026-09-30] de {F4-04}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F4-04, rodada 1 em 86449c2 e reconferência em 3f98363 PASS), placar 1 de 1 cláusula. Com meta de 2000 e duas refeições somando 1200 kcal, a tela e a rota mostram 1.200 consumidas, 800 restantes e 60%, com a soma independente no banco igual à do painel nos quatro macronutrientes. O dia sem registro mostra os quatro totais em zero, "Nenhuma refeição registrada" e "Dia sem registro", sem erro e com o console limpo. Casos de borda: abaixo da meta (1463,7 de 2200 dá 736,3 e 67%), acima (2300 de 2000 mostra "300 kcal acima da meta · 115%" com a barra cheia), igual (230 de 230 dá 0 e 100%), meta de macronutriente zero e aluno sem meta ("Sem meta definida", sem barra, nunca zero), arredondamento meio para cima, desativar uma refeição sem recarregar (1200 para 700, 60% para 35%) e navegação por data com a meta daquele dia. Acesso: o Profissional vinculado com a categoria de nutrição visível vê os cartões sem Registrar nem Desativar; sem vínculo recebe 404, com consentimento revogado ou fora da restrição recebe 403, o Administrador recebe 403 nomeado e o Super Administrador lê com uma linha de acesso administrativo por refeição somada. Smoke visual nos quatro combos de tema e largura mais a reconferência em doze (375, 400 e 1280, claro e escuro): sem rolagem horizontal, console limpo, contraste de texto de pelo menos 6,71 para 1 e da barra de pelo menos 3,42 para 1. Contas de teste apagadas ao fim, com zero resíduo. {TB-39} segue [ ], porque é Beta.
Cobre: RF-DIET-005.
Como testar: abrir o acompanhamento de trinta dias de um aluno vinculado e de um sem vínculo.
Passa quando: o vinculado mostra a média diária por macronutriente e os dias com meta atingida, e o não vinculado é negado.
Fechamento [2026-10-01] de {F4-05}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F4-05, rodada 1 em de85d1c e reconferência em 1b0002c PASS), placar 1 de 1 cláusula. O aluno com trinta dias de registros mostra, para o vinculado com a categoria de nutrição visível, 28 dias com registro e 19 na meta, com médias de 2197,8 de calorias, 137,4, 274,7 e 73,3 de macronutrientes, iguais à soma independente feita fora do código do produto, e a contagem manual das 30 linhas dá os mesmos 19; o período de 7 dias dá 6 de 7, também igual ao independente. O não vinculado recebe 404, o vinculado sem consentimento recebe 403 categoria_nao_compartilhada e o Administrador recebe 403 nomeado. Casos de borda: tolerância com meta 2000 (1789 fora, 1790 dentro, 2209 dentro, 2210 fora), meta do dia e não a de hoje, dia sem registro nunca na meta, refeição desativada fora da soma, validações de período (400). Smoke visual em 375, 400 e 1280 de largura, claro e escuro, sem rolagem horizontal. Contas de teste apagadas ao fim, com zero resíduo. Lacuna declarada: o cenário de dias sem meta vigente não foi exercitado pelo qa (coberto pelo arnês do executor). {TB-39} segue [ ], porque é Beta.
Saúde e evolução
Cobre: RF-SAUD-001.
Como testar: preencher uma anamnese como personal; depois, como médico vinculado ao mesmo aluno, abrir uma anamnese nova, alterar dois campos do tronco pré-preenchido e salvar; abrir em seguida a anamnese original.
Passa quando: cada um vê o tronco comum mais apenas as seções da própria especialidade, o tronco da segunda nasce pré-preenchido pela primeira e editável, existem exatamente duas anamneses do aluno com data, autor e especialidade próprios, a primeira mantém os valores originais nos dois campos alterados, e a lista as exibe em ordem decrescente de data.
Leitura (Inspeção, 2026-10-01): "apenas as seções da própria especialidade" vale para o FORMULÁRIO de preenchimento (RF-SAUD-001: "seções que aparecem conforme a especialidade de quem preenche"); na leitura de uma anamnese gravada aparecem todas as seções que ela contém, sujeitas ao consentimento da categoria (Drift 3 do gate de {F5-01}).
Fechamento [2026-10-01] de {F5-01}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F5-01, rodada 1 na versão 5b42dd0, PASS COM RESSALVAS, sem P0 e sem P1; correções P2 em 25b0cc6), todas as cláusulas do H1 de RF-SAUD-001. Cada especialidade grava só a própria seção: matriz de quatro por quatro com 12 negativos (403 secao_fora_da_permissao, contagem de linhas inalterada) e 4 positivos (201); o aluno grava o tronco e as seções das especialidades sem vínculo ativo (com Personal, Médico e Nutricionista ativos só a funcional; sem vínculo as quatro; só com Fisioterapeuta as outras três). O tronco da anamnese nova nasce da ativa mais recente e muda para a próxima ativa quando a mais recente é desativada; a anamnese anterior fica byte a byte igual depois de três novas coletas; cada registro tem data, autor e especialidade próprios (especialidade_autor, autor e data vêm da sessão, e o corpo com qualquer um deles dá 400); a lista vem da mais recente para a mais antiga. O formulário mostra só as seções da própria especialidade, e a leitura de uma anamnese gravada mostra todas as seções que ela contém, sob consentimento da categoria. Consentimento: sem ele o aluno recebe 403 consentimento_necessario e o profissional 403 categoria_nao_compartilhada, com o par positivo concedendo e gravando 201; restrita ao Médico, Personal e Nutricionista levam 403; revogada, titular e Super leem e ninguém grava. Administrador com 403 nomeado nas cinco rotas, não vinculado com 404, desativar só pelo autor ou pelo Super (segunda vez 409, não autor 403, PATCH, PUT, reativar e ativar 404). Validações: vazia e só brancos 422, NUL 400, dor 11 e -1 400, tetos 200 e 2000 aceitos e 201 e 2001 recusados. Trilha: criar 1 por anamnese, desativar 3, alterar e excluir 0, e uma linha acesso_administrativo por anamnese devolvida ao Super (6 de 6). Caminho antigo conferido (o que a mudança poderia perder): as quatro rotas de nutrição por seis papéis em três estados de consentimento, 35 de 35 iguais ao esperado, com o texto literal de f609a9c, as quatro telas de nutrição e /privacidade com sete cartões. Smoke visual em 360 e 1440, claro e escuro, 24 telas e fluxos, sem rolagem horizontal, sem travessão, sem "em breve" e sem erro de console. Contas de teste apagadas ao fim, com 0 resíduo em 40 verificações. Lacunas declaradas: contraste só a olho, sem comparação pixel a pixel com a tela 14, Super personificando só pela API, 429 e carga não testados. Os casos Beta correspondentes seguem [ ], porque são com operador real.
Cobre: RF-SAUD-002.
Como testar: registrar duas avaliações com métricas parcialmente diferentes, preenchendo as quatro dobras cutâneas do protocolo padrão, o teste de flexibilidade, o teste de resistência e o histórico de lesões, medicamentos e estilo de vida; registrar uma avaliação com antropometria completa por um nutricionista vinculado.
Passa quando: as métricas presentes nas duas mostram anterior, atual e variação, as presentes em apenas uma aparecem sem variação calculada, os campos novos são gravados e exibidos nas seções correspondentes, e as quatro especialidades vinculadas registram avaliação sem recusa, incluindo o nutricionista na antropometria.
Nota de leitura (Inspeção, gate {F5-02}, Drifts 3 e 4, 2026-10-01): duas leituras do "Passa quando", sem mudar o caso. (1) "As métricas presentes nas duas mostram anterior, atual e variação" vale para o campo numérico, para cada ponto de dobra e para a carga e as repetições de cada teste de força; as métricas de teste (resultados cardiovascular, de flexibilidade e de resistência e as do teste aeróbico) só têm variação quando o teste aplicado é o mesmo nas duas avaliações, senão aparecem como "testes diferentes", sem variação (Nota em RF-SAUD-002), e o caso deve exercitar as duas situações. (2) "Registrar duas avaliações" é sempre registrar duas: a avaliação não se edita, e o autor e o Super Administrador só a desativam (Nota em RN-009), de modo que o caso nunca corrige uma avaliação, e a avaliação desativada não entra na comparação.
Fechamento [2026-10-06] de {F5-02}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F5-02, rodada 1 na versão 57d6e0e com um P1 e reteste na versão 87ae8e0 PASS), todas as cláusulas do H1 de RF-SAUD-002. As quatro especialidades registram sem recusa (Personal com tronco parcial, Nutricionista com a antropometria completa, as quatro dobras, sem cintura e com quadril, Médico e Fisioterapeuta, todos 201 com a especialidade_autor correta) e o aluno registra com especialidade nula, com quatro vínculos e sem vínculo. A comparação mostra anterior, atual e variação com sinal e unidade (peso -1,5 kg, dobra -1,0 mm), métrica presente em só uma avaliação sem variação ("não informado" e "sem variação", nunca zero, em cintura e quadril), o mesmo teste normalizado varia (flexibilidade +3, supino +5), testes diferentes (Sentar e alcançar contra Wells) aparecem como "testes diferentes", avaliação desativada fica fora e ?com= inválido dá 400, igual 404, de outro aluno 404. O P1 da rodada 1 era o tempo em segundos na tabela da comparação (754 s, 710 s, -44 s): corrigido, o reteste mostra 12:34, 11:50 e -0:44 em claro e escuro, com os dados gravados em segundos (754 e 710). Consentimento: ausente dá 403 e só concedendo grava 201, restrito ao Médico nega o Personal (403 categoria_nao_compartilhada), revogada deixa o titular e o Super lerem e ninguém gravar. Administrador com 403 nomeado nas rotas, não vinculado 404, desativar só pelo autor ou pelo Super (segunda vez 409, não autor que lê 403, PATCH, PUT, DELETE e reativar 404). Validações: campo desconhecido, NUL, dobra inexistente, 11 testes, idade 121, peso 501, tetos de 200 e 2000 aceitos e 201 e 2001 recusados, 18 recusas sem alterar a contagem. Trilha: criar grava em avaliacoes, alterar 0. Caminho antigo conferido (o que a mudança poderia perder): a anamnese nas três telas e nas cinco rotas iguais ao esperado, a nutrição do aluno com os cartões de consentimento, e a migração 0058 com POST válido 201, lista, base e detalhe 200, desativar 200 e 409, secoes com {"medico":[]} 400 e Administrador 403. Smoke visual em 360 e 1440, claro e escuro, sem rolagem horizontal, sem travessão, sem "em breve", sem erro de console, foco visível e alvos de toque de pelo menos 2,75rem. Contas de teste apagadas ao fim (11 na rodada 1 e 5 no reteste, 0 resíduo em 43 verificações cada). Lacunas declaradas: item de lista desativado pelo Super e Super personificando não exercitados em produção, contraste de fundo em gradiente não medido pelo instrumento, 429 e carga não testados. O caso passa a [x].
Cobre: RF-SAUD-003.
Como testar: salvar avaliação com oitenta quilogramas, um metro e oitenta, cintura noventa, quadril cem e trinta anos; repetir omitindo a altura.
Passa quando: exibe 24,7, 0,90 e 190 com as faixas calculadas sobre 190, e sem a altura o índice de massa corporal não é exibido, em vez de aparecer zero.
Fechamento [2026-10-06] de {F5-03}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F5-03, rodada 1 PASS, versão 208a883, a mesma árvore do merge 08b35ed), todas as cláusulas do H1 de RF-SAUD-003. Com 80 kg, 180 cm, cintura 90, quadril 100 e 30 anos, o detalhe da avaliação, na API e na tela, mostra índice de massa corporal 24,7 kg/m², relação cintura quadril 0,90 e frequência cardíaca máxima 190 bpm, e as cinco zonas 95 a 114, 114 a 133, 133 a 152, 152 a 171 e 171 a 190, cada uma com a fórmula visível. Sem a altura o índice de massa corporal vem nulo e a linha diz "Não calculado: informe peso e altura" (e as formas equivalentes para cintura e quadril e para a idade), nunca zero, e as zonas dizem o mesmo motivo. O meio para cima foi provado com 48 kg e 160 cm (18,8) e 28,8 kg e 160 cm (11,3), e a idade 33 dá 187 e as zonas 94 a 112 até 168 a 187. A comparação ganha três linhas ao fim (calculo.imc, calculo.rcq, calculo.fc_max), as antigas na mesma ordem e chave, e as zonas ficam fora. A lista de avaliações não traz cálculo (chaves id, data, autor, especialidade_autor, ativa, desativado_em, resumo). Extensão do card: 400 corpo_invalido em POST /api/avaliacoes e POST /api/anamneses para os seis corpos inválidos, {} em 422 e Administrador em 403 antes do 400, nutrição em 422; e degrau 0 nas listas de anamneses e de avaliações em 6 larguras e 2 temas (24 combinações). Smoke visual em 360, 768 e 1440, claro e escuro, sem rolagem horizontal e sem erro de console. Lacuna declarada: o Super personificando e o Chrome com cabeça não foram exercitados.
Cobre: RF-SAUD-004.
Como testar: enviar exame com anexo dentro do limite, outro acima do limite e outro de extensão não permitida.
Passa quando: o primeiro aparece na lista e abre por endereço assinado e os outros dois são recusados com a mensagem do campo.
Nota (Inspeção, gate {F5-04}, Drifts 2, 3, 7 e 11, 2026-10-06): os casos que o qa executa em produção para provar este H1, publicados antes do código. Um PDF de exatamente 20 MiB é aceito e abre por endereço assinado; 20 MiB mais um byte é recusado com a mensagem do campo (e não com um 413 do servidor web); um .exe e um PNG renomeado para .pdf são recusados (o tipo vem dos bytes e da extensão declarada); um arquivo de texto com byte nulo é recusado. Sem consentimento da categoria exame, e também o Personal Trainer e o Administrador, não gravam (recusa nomeada, sem linha e sem objeto no disco); o aluno com o consentimento e o Médico vinculado gravam. A cota do plano recusa o envio que a estouraria, antes de gravar o objeto, com a mensagem de limite existente. O exame não se edita (nenhuma rota de edição de conteúdo existe e nenhum campo muda); o autor e o Super Administrador desativam, o exame desativado sai da lista de trabalho e o arquivo segue legível ao titular e ao Super Administrador. Nenhum arquivo de teste fica no disco, e o diretório vazio some quando se remove o exercício temporário criado para a prova. O cartão continua [ ].
Fechamento [2026-10-06] de {F5-04}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F5-04, rodada 1 PASS, versão bde96b3, a mesma árvore do merge b078e76; o deploy da main em b078e76 segue em curso), todas as cláusulas do H1 de RF-SAUD-004. Os cinco tipos da lista gravam sem anexo (201); PDF, PNG, JPG, .jpeg, texto e .PDF gravam com anexo e devolvem o formato e os bytes certos; PDF de exatamente 20 MiB entra em 1,8 s e abre pelo endereço assinado com 20971520 bytes; 20 MiB mais um byte é recusado com JSON anexo_grande_demais, a faixa de 1 a 50 e o limite vigente (e não o 413 do servidor web); .exe, .svg, .html, PNG como .pdf, JPG como .png, vazio, sem extensão, texto como .pdf e texto com byte nulo recusados (400), com zero objeto no disco. O endereço abre sem cookie (200; texto servido como texto puro); sem assinatura, sem expiração, assinatura adulterada, expiração estendida, expirada e assinatura de outro objeto dão 403, e o vencido de verdade, medido, também. Quem não lê não recebe endereço: Médico sem vínculo 404, aluno sem relação 404, anônimo 401, Administrador 403; a lista nunca traz endereço. Consentimento: ausente, revogado e restrito a outra especialidade dão 403, com os pares positivos em 201 e o Super lendo. Capacidade: Personal vinculado 403 ("só o médico"), aluno registra o próprio, aluno em nome de outro 404, Administrador 403 nas quatro rotas. O exame não se edita (PATCH, PUT e DELETE dão 404) e desativar: autor 200, segunda vez 409, titular que não é o autor e Personal 403, Super 200; o arquivo segue no disco e abre, e a cota não cai. Cota do plano Gratuito de 100 megabytes: cinco de 20 MiB fecham 100 de 100 e o sexto recebe 409 com a mensagem de limite, antes de gravar o objeto. Data: hoje e amanhã 201, mais dois dias, mais trinta e o ano 9999 dão 400. Tetos 160, 4000 e 2000 aceitos e mais um caractere recusado. Trilha: a criação e a leitura administrativa gravam, só o Super lê, sem o conteúdo. Regressão do caminho antigo: a imagem do exercício sobe e a troca deixa um arquivo, remover a imagem e apagar o exercício fazem a pasta sumir (D4), e anamnese, avaliação, nutrição, saúde, privacidade, exercícios e fichas do aluno seguem em 200. Visual: 6 larguras (360, 768, 1024, 1280, 1440 e 1920) em tema claro e escuro, em 6 telas, 72 combinações sem rolagem horizontal, instrumento com controle negativo. Limpeza das contas e dos objetos de teste provada: zero resíduo, disco de volta ao de base, verificador de órfãos 0, 0 e 0. Lacunas declaradas: Fisioterapeuta e Nutricionista não exercitados (cadastro bloqueado em 429; coberto o Personal), a tela do 413 de servidor não exercitada (413 provado por API) e contraste por script não rodado. P3: o texto de 20 MiB mais um byte ("20 MB e o limite é 20 MB"), o alerta geral que fica depois de corrigir e o 403 em vez de 400 sem o aluno. O cartão passa a [x].
Cobre: RF-SAUD-005.
Como testar: registrar prescrição como médico vinculado e abrir a tela do aluno.
Passa quando: aparece com data e autor e exibe o aviso de que não substitui o receituário oficial.
Nota (Inspeção, gate {F5-05}, Drift 7, 2026-10-06): o caso prova a duração estruturada e a vigência calculada na leitura, além do H1. Com quantidade e unidade (por exemplo 10 dias, 2 semanas e 1 mês), a prescrição grava e a vigente_ate devolvida na leitura é a data da prescrição mais a duração menos 1 dia; num caso de uso contínuo, grava sem quantidade e sem unidade, e fica vigente até ser desativada (sem data de fim). São recusadas: quantidade sem unidade, unidade sem quantidade, quantidade junto com uso contínuo, quantidade 0, quantidade 1000, unidade fora de dias, semanas e meses, e duração em texto livre. A vigente_ate não é coluna guardada: muda a data da prescrição ou a duração, e a leitura seguinte já traz o valor novo. O cartão continua [ ].
Vigência (Inspeção, 2026-10-06): o dia da prescrição é o primeiro dia; vigente_ate = data da prescrição + duração - 1 dia (para semanas e meses, a mesma regra sobre a data somada), e a prescrição é vigente quando a data de hoje é menor ou igual a vigente_ate; uso contínuo é vigente até ser desativada. "Hoje" é a data no fuso America/Sao_Paulo, calculada num ponto único reutilizado por {F5-05} e {F7-09}, nunca a data UTC do banco. Exemplo: 7 dias a partir de 01/10 vale até 07/10. Caso de teste: prescrição de 7 dias com data 01/10 tem vigente_ate 07/10, é vigente em 07/10 (data de hoje no fuso America/Sao_Paulo) e deixa de ser vigente em 08/10; a conferência usa a data de hoje em America/Sao_Paulo, e um instante entre 21h e 24h em São Paulo, que já é o dia seguinte em UTC, não adianta a vigência.
Fechamento [2026-10-06] de {F5-05}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-F5-05, rodada 1 PASS na versão 032c99a, reteste PASS em bf90408 e reteste PASS em 9510270, a mesma árvore do merge de718a6), todas as cláusulas do H1 e da Nota de duração. O Médico com vínculo ativo registra e a prescrição aparece na tela do aluno com data, autor e o aviso de que não substitui o receituário (lista, detalhe, formulário e visão do aluno); o texto vigente é igual ao original, comparado byte a byte (284 bytes). Só o Médico vinculado grava: Personal, Fisioterapeuta, Nutricionista, aluno, Administrador e Super Administrador sem personificar recebem 403, o segundo Médico vinculado recebe 201 e o Médico sem vínculo recebe 404. Duração: contínuo com quantidade, não contínuo sem unidade ou sem quantidade, 0, 1000, -1, 1,5, unidade fora da lista e uso contínuo ausente dão 400 por campo; 1 e 999 dão 201. Vigência medida contra a aritmética de datas: 1 dia hoje vale até hoje; 7 dias a partir de 7 dias atrás vale até ontem e não é vigente; 7 dias a partir de 6 dias atrás vale até hoje e é vigente; 2 semanas valem até hoje mais 13; 1 mês a partir de 31/01 vale até 27/02; uso contínuo sem data de fim é vigente; desativada nunca é vigente; os contadores da lista batem com os três grupos da tela. Data futura (4 e 30 dias) e inválida dão 400; 400 dias atrás dá 201. Consentimento com o par positivo em cada negação: ausente 403 e depois concedido 201; restrito a Nutricionista 403 e depois restrito a Médico 201; revogado 403 (antes 201). Desativar: o autor 200, repetido 409 ja_desativada, quem não é autor 403, Super Administrador 200, e PUT, PATCH e DELETE 404 com o registro intacto. Campos de sistema no corpo, byte nulo, 4001 caracteres, JSON inválido e falta de sessão recusados; 4000 acentuados aceitos. Aviso editável: a versão 2, publicada pela tela /admin/textos, apareceu na lista, no detalhe e no formulário, e a versão 3 devolveu o texto original. Tamanhos distintos no 413: 20.971.521 B contra 20.971.520 B, no servidor e no cliente; o alerta de campos some ao corrigir nos quatro formulários e o de outra origem permanece. 96 combinações de largura (360 a 1920), tema e tela, sem rolagem horizontal, sem travessão, sem [object Object] e sem item colado na borda. Reteste das datas (bf90408): "Registrada em" e "Desativada em" mostram o dia de Brasília nos três fusos do navegador (UTC, Tokyo e São Paulo), inclusive com o instante 01:08Z do dia 07 (22:08 em Brasília) mostrando 06/10; o campo de data abre em hoje. Reteste do nascimento (9510270): o perfil devolve 1990-01-01, o campo abre preenchido e o painel do aluno mostra 01/01/1990 nos três fusos, nunca 31/12/1989. Dados de teste apagados (contas qa.f505, qa.f505r e qa.f505n, varredura sem resíduo, órfãos 0, 0, 0). Lacuna declarada: o P3-03 (eixos 21px no detalhe) não foi reavaliado.
Cobre: RF-SAUD-006.
Como testar: registrar sessão com dor antes sete, depois três, preenchendo tratamento realizado, exercícios realizados, notas de amplitude, notas de progresso e plano da próxima sessão; abrir o painel do fisioterapeuta; registrar outra sessão só com os obrigatórios; tentar registrar dor onze.
Passa quando: a primeira aparece com variação de menos quatro e os cinco campos legíveis no detalhe, o plano da próxima sessão aparece no painel, a segunda salva exibindo só o preenchido, sem campo vazio na tela, e a dor onze é recusada na validação do campo.
Nota (Inspeção, gate {F5-06}, Drifts 1, 5, 6 e 9, 2026-10-06): o caso prova, além do H1, o que o gate decidiu. (1) Com dor antes sete e dor depois três, a variação mostrada é menos quatro, com o rótulo acessível "menos 4 pontos", e o detalhe traz os cinco textos do cenário (os "cinco campos" do caso são os cinco do cenário; o sexto texto é a observação, opcional, como na Nota de RF-SAUD-006). (2) O plano da próxima sessão aparece no painel do Fisioterapeuta como a ação seguinte daquele paciente, e só o da ÚLTIMA sessão ativa: depois de uma sessão mais nova sem plano, o plano antigo não sobe. (3) A sessão registrada só com os obrigatórios (região, tratamento realizado, dor antes, dor depois, duração e data) salva, e o detalhe omite os campos vazios, sem "Não informado". (4) São recusadas: dor 11, dor menos 1, duração 301, duração 0, data dois dias à frente (a mesma folga de fuso dos demais formulários de data) e byte nulo nos textos. (5) Quem grava: o Fisioterapeuta com vínculo ativo, e o aluno para si, com a especialidade do autor nula; Personal Trainer, Médico e Nutricionista são recusados, e o Administrador recebe 403. (6) Consentimento da categoria sessão de reabilitação: ausente, revogado e restrito a outra especialidade recusam, cada um com o par positivo. (7) Desativar só pelo autor ou pelo Super Administrador, e não existe rota de edição. (8) Os painéis de Personal, Médico e Nutricionista seguem idênticos. O cartão continua [ ], e os Betas seguem [ ].
Cobre: RF-SAUD-007.
Nota (Inspeção, reconciliação, 2026-09-30): a medida corporal é da categoria avaliação física de RF-CORE-010; o caso inclui registrar a primeira medida sem esse consentimento (bloqueado, sem linha gravada, com a tela de consentimento) e depois com ele, e o profissional sem o consentimento negado na leitura.
Como testar: registrar duas medições de peso diferentes e abrir o gráfico.
Passa quando: a variação exibida é a diferença exata e o gráfico tem dois pontos na série de peso ordenados por data.
Cobre: RF-SAUD-008.
Como testar: enviar duas fotos de frente em datas diferentes e uma de costas, abrir a comparação em cada categoria e acessar o endereço direto do arquivo sem assinatura.
Passa quando: a galeria agrupa por categoria, a comparação de frente oferece apenas as duas de frente e as exibe lado a lado com as datas, a categoria de costas com uma foto exibe comparação indisponível sem erro, e o endereço direto retorna acesso negado.
Cobre: RF-SAUD-009.
Como testar: acessar sem sessão o endereço direto de uma mídia de exercício e de um anexo de exame, e usar um endereço assinado expirado.
Passa quando: a mídia responde conteúdo, o exame responde acesso negado e o endereço assinado deixa de funcionar após a validade configurada.
Depende de: F1-01 prova o mecanismo (público responde, privado nega, assinatura expira) com arquivo semente; este teste só fecha em F5-08, quando existe anexo de exame real.
Nota (R-12, {F2-02}): o lado público deste teste passa a ter objeto real de mídia de exercício a partir de {F2-02}, em vez de apenas a semente de marca; o caso "endereço direto sem sessão responde conteúdo" deve ser reexecutado contra uma imagem de exercício real.
Cobre: RF-SAUD-010.
Como testar: acionar a explicação num exame, numa prescrição, numa anamnese e numa sessão de reabilitação do mesmo aluno, e depois gerar de novo em um deles.
Passa quando: os quatro oferecem o acionamento e exibem o texto formatado com o aviso, o conteúdo original de cada um permanece intacto, e a segunda geração substitui apenas a explicação daquele registro, sem tocar nos outros três.
Comunicação
Cobre: RF-COMU-001.
Como testar: enviar mensagem num vínculo ativo e tentar abrir a conversa com um profissional não vinculado.
Passa quando: a mensagem aparece para os dois com autor e horário e o não vinculado não consegue abrir nem listar a conversa.
Cobre: RF-COMU-002.
Como testar: enviar mensagem na conversa profissional de um aluno com dois profissionais vinculados, e tentar abri-la como aluno e como terceiro profissional.
Passa quando: o outro profissional recebe, o aluno não enxerga a conversa em nenhuma tela e o terceiro não consegue abri-la.
Cobre: RF-COMU-003.
Como testar: mencionar um dos três profissionais no grupo e depois encerrar o vínculo de um deles.
Passa quando: todos recebem a mensagem, só o mencionado recebe a notificação de menção, e o profissional com vínculo encerrado para de receber mensagens novas mantendo o histórico do período.
Cobre: RF-COMU-004.
Como testar: tentar anexar arquivo em cada um dos três tipos de conversa e enviar uma mensagem com endereço de internet.
Passa quando: os três anexos são bloqueados com a mensagem indicando a tela própria e o endereço vira link clicável.
Cobre: RF-COMU-005.
Como testar: acumular doze notificações, limpar todas, e receber cinco mensagens seguidas da mesma conversa.
Passa quando: a contagem vai a zero sem recarregar e as cinco mensagens aparecem como uma notificação agrupada com contador cinco.
Cobre: RF-COMU-006.
Como testar: com dois navegadores na mesma conversa, enviar de um e cronometrar no outro.
Passa quando: a mensagem aparece em até três segundos sem recarregar e o contador do sino é incrementado na mesma janela.
Engajamento
Cobre: RF-ENGA-001.
Como testar: abrir o painel recém-cadastrado, cumprir um passo e depois cumprir os quatro.
Passa quando: os quatro aparecem desmarcados, o cumprido é marcado sem ação manual e com os quatro cumpridos o bloco deixa de ser exibido.
Cobre: RF-ENGA-002.
Como testar: simular sessões em três dias consecutivos e depois dois dias sem sessão.
Passa quando: a sequência exibe três no dia seguinte sem treino e zero após o segundo dia sem sessão, e uma sessão abandonada no período não conta.
Cobre: RF-ENGA-003.
Como testar: ter sessões em quatro dias distintos dentro da janela e uma fora dela.
Passa quando: exatamente quatro casas aparecem preenchidas nas datas corretas e a sessão fora da janela não aparece, e uma sessão abandonada no período não conta.
Cobre: RF-ENGA-004.
Como testar: concluir a décima sessão de um aluno com nove e depois concluir mais duas.
Passa quando: a conquista de dez é concedida com a data de hoje e notificada, e não é concedida de novo nas sessões seguintes, e uma sessão abandonada no período não conta.
Cobre: RF-ENGA-005.
Como testar: escolher um exercício com cinco sessões e depois um nunca executado.
Passa quando: a série tem cinco pontos ordenados por data com a carga máxima de cada sessão e o exercício inédito exibe o estado vazio sem erro.
Cobre: RF-ENGA-006.
Como testar: com o conjunto de cinco campos configurado e só a altura preenchida, abrir o painel; usar o atalho de cada faltante; preencher um a um até os cinco.
Passa quando: exibe vinte por cento e os quatro faltantes nominalmente, cada atalho leva ao campo correspondente, ao preencher a data de nascimento passa a quarenta por cento e o campo sai da lista, e com os cinco preenchidos exibe cem por cento e o bloco deixa de ser exibido.
Geração assistida
Cobre: RF-IAGE-001.
Como testar: acionar a geração para um aluno com cinco equipamentos declarados e conferir cada exercício proposto contra o catálogo.
Passa quando: todos os exercícios propostos existem no catálogo, são compatíveis com os equipamentos declarados e a duração respeita a preferência.
Cobre: RF-IAGE-002.
Como testar: acionar para um aluno com meta de duas mil calorias, quatro refeições e uma restrição alimentar declarada.
Passa quando: a proposta traz quatro refeições, o somatório fica dentro de mais ou menos dez por cento da meta e nenhum alimento restrito aparece.
Cobre: RF-IAGE-003.
Como testar: gerar, conferir a base antes de salvar, editar e salvar; repetir descartando.
Passa quando: nenhum registro existe antes de salvar, o registro salvo contém exatamente o conteúdo editado e o descarte não cria registro.
Painéis e relatórios
Cobre: RF-PAIN-001.
Como testar: abrir com dados reais em 375 pixels de largura, com e sem sessão em andamento, e depois com um aluno sem nenhum registro.
Passa quando: os blocos aparecem empilhados sem rolagem horizontal, o bloco de treino é o primeiro da pilha, acima de nutrição, medidas, sequência, calendário, conquistas e completude, o atalho de retomar ocupa o topo do bloco de treino quando há sessão em andamento, e cada bloco exibe dado real ou o próprio estado vazio, nunca valor de exemplo.
Cobre: RF-PAIN-002.
Como testar: abrir com quatro alunos vinculados e uma solicitação aberta, existindo alunos de outro profissional na base.
Passa quando: vê os quatro e o indicador de uma solicitação, e nenhum aluno de outro profissional aparece.
Cobre: RF-PAIN-003.
Como testar: abrir com três pacientes com registros nos últimos sete dias.
Passa quando: os três aparecem com aderência do período e plano vigente, e o painel exibido é o da especialidade nutricional.
Cobre: RF-PAIN-004.
Como testar: abrir com um exame enviado ontem por um paciente vinculado e outro por paciente sem vínculo ativo.
Passa quando: o do vinculado aparece com nome e data e o do não vinculado não aparece.
Cobre: RF-PAIN-005.
Como testar: abrir com um paciente com três sessões na mesma região, a última com plano da próxima sessão preenchido, outro paciente cuja última sessão não trouxe plano e outro sem sessão há mais de trinta dias.
Passa quando: a curva de dor da região tem os três pontos na ordem das datas, o plano da próxima sessão aparece sem abrir o detalhe, o paciente sem plano aparece sem esse trecho em vez de campo vazio, e o terceiro aparece marcado como sem sessão recente.
Cobre: RF-PAIN-006.
Como testar: com um aluno de oito dias sem atividade, outro de dois, e um terceiro cuja única atividade nos últimos oito dias foi uma atividade externa sincronizada, abrir o painel, registrar atividade no primeiro e reabrir.
Passa quando: só o primeiro aparece na lista, o terceiro não aparece por ter atividade externa dentro da janela, e após a atividade o primeiro sai da lista na abertura seguinte.
Cobre: RF-PAIN-007.
Como testar: comparar cada indicador com a contagem na base e criar um usuário novo.
Passa quando: cada indicador é igual à contagem correspondente e o total sobe em um na abertura seguinte.
Cobre: RF-PAIN-008.
Como testar: exportar o relatório de atividade de trinta dias e comparar com a tela.
Passa quando: o arquivo tem exatamente as mesmas linhas do mesmo período e o total do rodapé é igual à soma da coluna.
Cobre: RF-PAIN-009.
Como testar: criar um profissional com especialidade médica, entrar com ele, aplicar o bloqueio administrativo e tentar entrar, remover o bloqueio e entrar de novo; em paralelo, marcar um aluno com status de acesso inativo por plano, sem bloqueio, e tentar entrar com ele.
Passa quando: o profissional entra com a senha inicial e cai no painel clínico, o bloqueio nega a entrada com a mensagem de conta bloqueada pela administração, diferente da mensagem de conta inativa por plano, o registro guarda quem bloqueou e quando, removido o bloqueio ele entra sem senha nova, e o aluno com acesso inativo continua entrando e alcançando perfil, plano e leitura do histórico.
Cobre: RF-PAIN-010, RF-CORE-008.
Como testar: nas quatro listas (treinos, histórico, usuários e exercícios), selecionar todas as linhas de um filtro que exibe doze e aplicar a ação; repetir com aluno e com profissional tentando a exclusão em definitivo; repetir com um registro fora do alcance do papel dentro da seleção.
Passa quando: exatamente doze registros são alterados, a contagem informada é doze, existem doze entradas de auditoria, a exclusão em definitivo não é oferecida nem aceita para aluno e profissional nos doze, e a seleção com registro fora de alcance recusa aquele registro, conclui os demais e informa afetados e recusados.
Integrações e portabilidade
Cobre: RF-INTE-001.
Como testar: importar um arquivo com dez atividades e reimportar o mesmo arquivo.
Passa quando: dez registros são criados e aparecem no calendário marcados com a origem, e a reimportação mantém dez.
Cobre: RF-INTE-002.
Como testar: exportar os dados de um aluno com registros em todas as categorias e comparar as contagens.
Passa quando: cada categoria tem no pacote o mesmo número de registros da base, os anexos estão presentes e o pacote traz o aviso de natureza não clínica.
Cobre: RF-INTE-003.
Como testar: conectar um serviço habilitado até o fim; abandonar outra autorização no meio; inspecionar as respostas da aplicação procurando a credencial; desconectar e disparar a sincronização.
Passa quando: a conta aparece conectada com data e permissões, a sincronização seguinte cria as atividades do período, a autorização abandonada não cria conta, a credencial não aparece em nenhuma resposta ao navegador nem em registro de log, e após desconectar nenhuma sincronização ocorre e as atividades já importadas continuam no histórico.
Cobre: RF-INTE-004.
Como testar: com um serviço que tem doze atividades no período, rodar a sincronização duas vezes; acrescentar uma atividade no serviço e rodar de novo; revogar a autorização do lado do serviço e rodar mais uma vez.
Passa quando: a primeira execução cria doze registros com a origem nomeando o serviço, a segunda mantém doze, a terceira passa a treze, e após a revogação a conta fica no estado que exige nova autorização, o aluno é notificado e os treze registros permanecem.
Cobre: RF-INTE-005, RN-005, RN-006.
Como testar: num mesmo dia, concluir uma sessão no sistema e trazer duas atividades externas; abrir o calendário como aluno e o acompanhamento como profissional vinculado; conferir a sequência de dias; e, num segundo aluno, deixar a atividade externa como única atividade dos últimos oito dias e abrir a lista de inativos.
Passa quando: as três aparecem no dia identificadas pela origem, a externa não é exibida como sessão do sistema, a sequência conta apenas a sessão do sistema (RN-005), o profissional enxerga as três, e o segundo aluno não aparece na lista de inativos, porque a atividade externa é a quarta fonte de RN-006.
Cobre: RF-CORE-013, ADR-014, ADR-015, RF-CORE-009.
Como testar: com um usuário de e-mail A, pedir a troca para B com a senha correta; tentar entrar com B antes de confirmar; abrir o endereço de confirmação; tentar entrar com A e com B; reabrir o endereço de confirmação; repetir o pedido com senha errada, com um B já usado por outra conta e com um B inválido; conferir a caixa de A e a auditoria.
Passa quando: antes da confirmação só A entra; depois só B entra; A recebeu o aviso; a auditoria tem autor, A e B; o endereço reaberto ou vencido não tem efeito; os três pedidos inválidos são recusados e nenhum e-mail sai da fila para eles.
Cobrança
Cobre: RF-COBR-001.
Como testar: registrar o acordo como profissional e tentar criá-lo e editá-lo como aluno.
Passa quando: o acordo consta no vínculo e é visível ao aluno, e as tentativas do aluno são negadas.
Cobre: RF-COBR-002.
Como testar: com acordo mensal iniciado há três meses, abrir a cobrança; repetir com acordo cujo dia de vencimento não existe no mês.
Passa quando: existem exatamente três competências com o valor do acordo, nenhuma de mês futuro, e no mês sem o dia contratado o vencimento cai no último dia do mês.
Cobre: RF-COBR-003.
Como testar: marcar uma competência vencida como paga e conferir o total em aberto e a auditoria.
Passa quando: o total em aberto diminui exatamente no valor da competência e a marcação consta na auditoria com autor e momento.
Cobre: RF-COBR-004.
Como testar: abrir a cobrança de um aluno com acordos de dois profissionais.
Passa quando: aparecem dois blocos com acordo e competências e o total em aberto é igual à soma das competências em aberto.
Guia da plataforma
Cobre: RF-AJUD-001.
Como testar: publicar um guia do módulo de treino com conteúdo distinto para Aluno e para Personal Trainer, abrir com os dois papéis, conferir a entrada no menu dos seis papéis e abrir um módulo sem guia para aquele papel.
Passa quando: cada papel lê o conteúdo publicado para ele com os sete blocos presentes, a entrada do guia aparece no topo do menu dos seis papéis, e o módulo sem guia exibe o estado vazio nomeando o módulo, sem erro e sem conteúdo de outro papel.
Cobre: RF-AJUD-002.
Como testar: publicar a versão 1, editar em rascunho e conferir o que o leitor enxerga, publicar a versão 2, consultar o histórico, restaurar a versão 1 e tentar escrever no guia com cada papel que não é administrador.
Passa quando: a versão 2 nasce com data e autor e é a que os leitores enxergam, a versão 1 continua consultável com o conteúdo original, o rascunho nunca aparece ao leitor, restaurar a versão 1 cria a versão 3 sem apagar a 2, e toda escrita por papel diferente de administrador é negada.
Cobre: RF-AJUD-003.
Como testar: acionar a geração para um módulo sem guia, conferir a base antes de publicar, editar dois blocos e publicar; repetir descartando a prévia.
Passa quando: a prévia traz os sete blocos, nenhuma versão existe no banco antes da publicação, a versão criada contém exatamente o conteúdo revisado e o descarte não cria versão nenhuma.
Verificações gerais
Cobre: todas as telas do catálogo do DRS.
Como testar: abrir cada tela do catálogo em 375 e em 1440 pixels, nos temas claro e escuro, com dado real e no estado vazio, registrando imagem, incluindo a página inicial pública sem sessão e as três telas do guia.
Passa quando: nenhuma tela apresenta rolagem horizontal, texto cortado, contraste insuficiente ou imagem fora da proporção natural medida.
Nota (R-12, {F2-02}): a técnica e a tolerância de "imagem fora da proporção natural medida" são as de {TA-21}: getBoundingClientRect() contra naturalWidth/naturalHeight, tolerância 0,5 por cento, nunca clientWidth.
Cobre: RF-CORE-006, RF-CORE-007, D.2 e a matriz de capacidade.
Como testar: para cada papel, tentar cada capacidade marcada como negada na matriz do DRS, incluindo acesso por identificador direto e por endereço de arquivo. (R-9, {F1-19}): consultar o perfil de outro usuário como aluno, como profissional vinculado, como profissional sem vínculo e como Administrador, conferindo campo a campo a resposta contra os quatro públicos e os oito privados de D.2, e tentando também por consulta direta à tabela com o papel de aplicação. (R-1, {F2-02}): medir os cabeçalhos de resposta da aplicação com o servidor web da frente fora do caminho (requisição direta ao container), derrubando o vhost do caminho para provar que os cabeçalhos continuam saindo da aplicação.
Passa quando: toda capacidade negada na matriz é negada no sistema, sem exceção, e nenhuma negação depende apenas de o botão estar escondido. E, para o critério de {F2-02}, os cinco cabeçalhos de segurança (X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy, Content-Security-Policy) continuam presentes na resposta mesmo com o servidor web da frente fora do caminho.
Cobre: D.1 e D.4.
Como testar: medir as cinco linhas da tabela de desempenho com o volume de referência de D.4, três execuções e mediana.
Passa quando: as cinco ficam dentro do alvo declarado.
Cobre: RF-PAIN-001 e F.1.
Como testar: percorrer no celular o cadastro, a execução completa de uma sessão, o registro de refeição, o registro de medida e o chat.
Passa quando: os cinco fluxos completam sem zoom, sem rolagem horizontal e com alvos de toque acionáveis com o polegar.
Cobre: o escopo já entregue.
Como testar: ao fim de cada fase, reexecutar todos os cards Alfa das fases anteriores.
Passa quando: nenhum card anteriormente aprovado passa a falhar.
Cobre: as jornadas de todos os papéis do documento de Jornadas.
Como testar: percorrer cada jornada de cada papel na aplicação real, executando de verdade e conferindo o resultado no banco e na tela.
Passa quando: toda jornada completa de ponta a ponta com resultado observado, com tabela mostrando dado real, botão executando e formulário persistindo.
Cobre: F.1.
Como testar: a partir de cada tela alcançada nas jornadas, voltar usando apenas a interface.
Passa quando: toda tela tem caminho de volta pela própria interface, sem depender do botão de voltar do navegador nem de digitar o endereço de novo.
Cobre: a matriz de capacidade do DRS.
Como testar: para cada papel, exercitar todas as capacidades marcadas como permitidas na matriz.
Passa quando: cada papel consegue executar tudo que a matriz permite a ele, sem depender de outro papel para uma tarefa que é dele.
Cobre: RF-CORE-007 na parte que declara a fronteira de dado clínico, mais RF-PAIN-009, RF-PLAN-001, RF-PLAN-002, RF-CORE-008 e RF-CORE-009 na parte que separa Super Administrador de Administrador; card {AUD-04} do Roadmap.
Como testar: contar, antes da migração, as contas por papel e guardar a lista; rodar a migração e recontar. Criar uma conta de Administrador de teste. Entrar com ela e exercitar, uma a uma, as capacidades privativas de governança de B.1 que já têm rota no sistema nesta data: atribuir plano e status de acesso, escrever na tela de planos, excluir em definitivo e abrir a trilha de auditoria. As outras três das sete não têm rota nenhuma e por isso não se provam aqui pela interface: bloquear e desbloquear conta e promover ou rebaixar papel nascem em {F7-14} e personificar nasce em {AUD-05}; a negação das duas primeiras se prova hoje no banco, pelo gatilho de governança que {AUD-04} instala. Depois, com a mesma conta, pedir leitura e escrita em cada uma das capacidades da fronteira de dado clínico cuja entidade já exista no sistema, com dado criado por outra conta antes de pedir, para que negado e vazio não se confundam. A fronteira tem quatorze capacidades, dez por classificação e quatro por conteúdo (conversa com vinculado, conversa entre profissionais, serviço de atividade e geração assistida), e cada uma só pode ser exercitada depois que a entidade dela nascer: nesta data nenhuma nasceu, e a Nota de placar parcial abaixo nomeia o card dono de cada uma. Pedir também a leitura das preferências de treino, que ficam com ele, esperando sucesso: sem esse controle negativo o card provaria apenas que a conta é fraca, e não que a fronteira é a lista de B.1. Cada tentativa se faz pela interface e, quando o controle não aparece, também pela rota direta, porque esconder não é negar. Depois exercitar as rotas de administração comuns que já existem, quatro das sete (/admin, /admin/exercicios, /admin/vinculos e /admin/textos), mais a leitura da tela de planos e a operação do dado não clínico de um aluno, esperando sucesso; as três que faltam nascem nos cards donos, /admin/usuarios em {F7-14}, /admin/relatorios em {F7-13} e /admin/guia em {F9-03}.
Passa quando: Dado o banco migrado, Quando se conta o papel de cada conta, Então exatamente as três contas de topo têm papel de super administrador, E a contagem de cada um dos demais papéis é igual à de antes da migração, E o Administrador de teste é negado nas capacidades privativas de governança que já têm rota, pela interface e pela rota direta, fechando 4 de 7, com as três restantes nomeadas com o card dono (bloquear e desbloquear conta e promover ou rebaixar papel em {F7-14}, personificar em {AUD-05}) e a negação das duas primeiras provada no banco pelo gatilho de governança, E é negado em leitura e em escrita nas capacidades da fronteira cuja entidade já existe, com dado criado por outra conta antes de pedir, fechando o placar parcial que a Nota deste cartão declara, e que nesta data é 0 de 28 porque nenhuma das quatorze entidades da fronteira existe ainda, E alcança as rotas comuns que já existem, a leitura de planos, o dado não clínico de um aluno e as preferências de treino dele, fechando 7 de 10 do lado positivo, com as três que faltam nomeadas com o card dono (/admin/usuarios em {F7-14}, /admin/relatorios em {F7-13} e /admin/guia em {F9-03}), E este cartão permanece aberto até o último dos três cards donos fechar, no mesmo tratamento que {TA-06} e {TA-08} já recebem.
Nota de placar parcial (onda AUD, {AUD-04}, 2026-09-15): este cartão tem três placares, e os três nascem parciais por aritmética, não por preguiça. Governança, 4 de 7: existem atribuir plano e status de acesso, escrever na tela de planos, excluir em definitivo e consultar a trilha de auditoria; faltam bloquear e desbloquear conta e promover ou rebaixar papel, de {F7-14}, e personificar, de {AUD-05}, e a negação das duas primeiras já se prova no banco pelo gatilho de governança de {AUD-04}. Lado positivo, 7 de 10: existem /admin, /admin/exercicios, /admin/vinculos e /admin/textos, mais a leitura de planos, o dado não clínico de um aluno e as preferências de treino dele; faltam /admin/usuarios de {F7-14}, /admin/relatorios de {F7-13} e /admin/guia de {F9-03}. Fronteira de dado clínico, 0 de 28 nesta data, porque nenhuma das quatorze entidades existe: preencher anamnese é {F5-01}; registrar avaliação física é {F5-02}; registrar medida corporal é {F5-07}; enviar foto de progresso é {F5-08}; registrar exame é {F5-04}; registrar prescrição é {F5-05}; registrar sessão de reabilitação é {F5-06}; registrar refeição é {F4-01}; definir meta nutricional é {F4-02}; criar plano alimentar é {F4-03}; conversar com vinculado é {F6-01}; conversar entre profissionais do mesmo aluno é {F6-02}; conectar e desconectar serviço de atividade é {F8-13}; e acionar geração assistida de treino, dieta e explicação é {F8-06}, {F8-07} e {F5-10}, sobre a camada de {F8-05}. Cada capacidade entra no placar no card que cria a entidade dela, pela política de acesso por linha e não só pela guarda de rota, e este cartão permanece [ ] até o último dos donos fechar. Medido em 2026-09-15 no roadmap publicado: zero cards marcados nas Fases 4, 5, 6 e 8, que é o que sustenta o 0 de 28 e o que o torna falseável, porque basta um card daqueles fechar para o número subir. Confirmação de fechamento [2026-09-15]: os placares de governança (4 de 7) e do lado positivo (7 de 10) estão provados em produção pelo gate de qa de {AUD-04} (retrato super_administrador 3, aluno 1, migrações 0031 a 0033 aplicadas, ops/semear-contas-de-topo.mjs idempotente nas duas rodadas); a fronteira de dado clínico (0 de 28) permanece sem mudança, porque nenhuma das quatorze entidades nasceu.
Fechamento [2026-09-29] de {AUD-05}: o placar de governança sobe de 4 de 7 para 5 de 7. Personificar passou a ter rota e a negação dela foi provada pela rota direta em produção: Administrador, profissional e aluno recebem 403 em POST /api/admin/personificar/:aluno, e o topo recebe 403 ao mirar outro Super Administrador ou a si mesmo, com o par positivo (topo para aluno, profissional e administrador) devolvendo 201. Faltam as duas de {F7-14}, bloquear e desbloquear conta e promover ou rebaixar papel. O lado positivo (7 de 10) e a fronteira de dado clínico (0 de 28) não se movem nesta entrega, porque /admin/usuarios mínima de {AUD-05} é privativa do Super Administrador e não entra no lado positivo do Administrador. O cartão permanece [ ].
Fechamento parcial [2026-09-30] de {F4-01}: a fronteira de dado clínico sobe de 0 de 28 para 2 de 28. Leitura e escrita de refeicao são negadas ao Administrador em produção, com dado criado antes pelo titular e o par positivo no mesmo alvo devolvendo 200; no banco o Administrador lê 0 linhas e o INSERT é negado. Governança (5 de 7) e lado positivo (7 de 10) não se movem. Faltam 26 de 28, nomeadas com os cards donos na Nota de placar parcial acima. O cartão permanece [ ].
Cobre: RF-CORE-014, e RF-CORE-010 na cláusula de consentimento sob personificação; card {AUD-05} do Roadmap.
Como testar: com o Super Administrador, personificar um aluno a partir da administração de usuários; percorrer as telas do aluno conferindo que os dados são dele e contando telas visitadas contra telas com a faixa visível; escrever um registro e conferir o autor gravado e o par na entrada de auditoria; tentar escrever numa categoria sensível que o titular não consentiu; sair pela faixa; repetir e deixar expirar; tentar personificar com conta de Administrador, de profissional e de aluno; tentar personificar uma conta de Super Administrador.
Passa quando: Dado o Super Administrador personificando um aluno, Então toda tela visitada mostra a faixa, fechando o placar de telas visitadas igual a telas com faixa, E a trilha tem a entrada de início com personificador, personificado e momento, E o registro escrito tem como autor o aluno e a entrada de auditoria tem o par, E a escrita em categoria não consentida é bloqueada, E a saída explicita e a expiração produzem cada uma a entrada de fim com o motivo correspondente, E as três tentativas por papel não autorizado são negadas nas três, E personificar conta de Super Administrador é negado.
Resultado [2026-09-29]: passou em produção na rodada 2 do qa (fit.modulareasy.com, merge 3dabc30), com as contas de teste criadas e removidas no fim (mfit.usuario 4 antes, 4 depois, zero personificação residual). Placar de telas com faixa: 44 de 44 (11 telas do aluno em 4 combinações de tema e largura). Trilha: início e fim com o par nos dois desfechos, saída e expiração. Saída pela faixa sem tela de entrada: 8 de 8. Negações: aluno, profissional e administrador 403, alvo Super Administrador 403, a si mesmo 403. Ressalva registrada, sem reprovar: a negação de senha e e-mail sob personificação não tem rota para exercitar (as rotas não existem ainda), e o consentimento foi provado (403 sob personificação contra 400 sem).
Cobre: o bloco B.6 e o Apêndice: Matriz Ator por Capacidade do DRS; ADR-017.
Como testar: contar, na matriz publicada, as células diferentes de N por coluna, e confrontar cada contagem com o comportamento medido no sistema para uma conta de cada papel. A contagem do documento e a medição no sistema são dois caminhos independentes até o mesmo número, e é a coincidência entre os dois que vale; contar só o documento provaria apenas que o documento fecha consigo mesmo.
Passa quando: Dado o documento publicado, Quando se contam as células diferentes de N por coluna nas 48 linhas, Então os números são Super Administrador 41, Administrador 19, Aluno 28, Fisioterapeuta 22, Personal Trainer 21, Médico 19 e Nutricionista 19, E a diferença entre os dois papéis de administração é 22 e não 1 nem 2, E essa diferença se decompõe sem sobra em 8 capacidades privativas de governança mais 14 da fronteira de dado clínico, dez por classificação e quatro por conteúdo, conferidas nominalmente linha a linha e não só pela subtração, E a medição no sistema devolve os mesmos sete números para as capacidades que já existem, E qualquer divergência entre a matriz e o sistema reprova este card sem arredondamento e sem "próximo o bastante". A metade documental deste cartão fechou com {AUD-04} nos números vigentes então (47 linhas, Super Administrador 41, diferença 21, 7 mais 14) e reabre e refecha em {AUD-06}, porque RF-PAIN-011 criou uma oitava capacidade privativa que B.1 ainda não nomeava naquela data; medida de novo por contagem célula a célula no publicado, agora em 48 linhas, Super Administrador 42, diferença 22, 8 mais 14. Reabre e refecha em {AUD-09}, Drift 3 (2026-09-30), porque a linha "Criar ficha de treino" dava T às duas colunas de administração contra os requisitos que a derivam; medida de novo célula a célula, 48 linhas, Super Administrador 41, Administrador 19, diferença 22, 8 mais 14, decomposição inalterada. A medição no sistema só fecha quando o produto fechar, porque a matriz mede 48 capacidades de produto inteiro e a maioria nasce nas Fases 4 a 8, e por isso o cartão permanece aberto com placar parcial declarado em vez de ser marcado no último dia do projeto.
Cobre: RF-PAIN-011; card {AUD-06} do Roadmap.
Como testar: o Super Administrador abre /admin/parametros, grava valor novo dentro
da faixa num parâmetro de cada forma que tem consumidor neste card: número simples, número
composto (três números) e lista; a forma texto fecha no card dono de modelo_geracao, com o
placar parcial declarado no próprio cartão; e exercita o próximo uso real do sistema que
consome cada um; conferir a trilha de auditoria; tentar valor fora da faixa em cada um dos três.
Passa quando: o Super Administrador abre /admin/parametros, grava valor novo dentro
da faixa num parâmetro de cada forma que tem consumidor neste card: número simples, número
composto (três números) e lista (a forma texto fecha no card dono de modelo_geracao, com o
placar parcial declarado no próprio cartão), e o próximo uso real do
sistema que consome cada um respeita o valor novo sem publicação e sem migração, E a
trilha tem uma entrada por alteração, com valor antigo e valor novo, E valor fora da faixa
é recusado nos três, com a faixa na mensagem, e o valor corrente não muda.
Nota: a forma texto fechou em {AUD-08}, no {TA-96}, com o assunto de e-mail; modelo_geracao continua não editável.
Cobre: RF-PAIN-011; card {AUD-06} do Roadmap.
Como testar: rodar o verificador de ART-CFG-02 sobre o universo medido, conferir a
lista de exceções técnicas nominal com motivo de uma linha por item, plantar um decoy (um
literal de negócio novo, com nome em minúsculo) e um controle negativo (linha sem número).
Passa quando: o verificador de ART-CFG-02 devolve zero literal de negócio fora do ponto único SEM card dono nominal ou exceção com
motivo, e imprime o placar honesto com o dono de cada restante, a lista de exceções técnicas é nominal e cada item tem motivo de uma linha, e o
decoy plantado (um literal de negócio novo, com nome em minúsculo) reprova o verificador; o
controle negativo (linha sem número) não reprova.
Cobre: RF-PAIN-011, ADR-012, L.2; card {AUD-07} do Roadmap.
Como testar: o Super Administrador, em /admin/listas, acrescenta um item a uma lista, renomeia um item de outra, muda a ordem de uma terceira e desativa um item de uma quarta; abre /admin/exercicios, /exercicios e /treinos/preferencias em seguida.
Passa quando: o item novo aparece como opção, o rótulo novo aparece em todo lugar que exibia o antigo (inclusive em registro já gravado), a ordem nova vale, o item desativado some das opções novas mas continua exibido com o rótulo nos registros que já o tinham e pode ser regravado por eles, tudo sem publicação nova; a trilha tem uma entrada por alteração com antes e depois; rótulo vazio, acima de 60 caracteres, repetido na lista, e desativar o último item ativo são recusados com a regra na mensagem; valor fora da lista é recusado pela rota e pelo banco.
Fechamento [2026-09-29]: passa em produção (https://fit.modulareasy.com, merge 7b47fa6, qa rodada 1 PASS COM RESSALVAS e rodada 2 PASS depois da 0040). Item acrescentado, rótulo renomeado, ordem trocada e nível desativado e reativado, tudo visto sem publicação nova, e o item novo apareceu ao aluno em /treinos/preferencias; rótulo de 61 caracteres, duplicado (caixa e espaços), vazio e só de símbolos recusados com 422 e a regra na mensagem (60 caracteres passa), e desativar o último item ativo recusado com o banco intacto; item desativado some das opções novas, e o registro que o tinha continua exibindo o rótulo e regrava; a trilha mostra antes e depois. Sem estouro de largura em 400 e 1280, nos temas claro e escuro. Lacunas declaradas: o histórico de sessões não traz grupo muscular, então não há o que provar ali, e a recusa direta pelo banco não foi exercitada pelo qa, que provou a recusa pela rota. Dados de teste apagados, com o retrato antes e depois idêntico (52 itens).
Cobre: RF-PAIN-011, ADR-012, L.2, RF-CORE-002, RF-CORE-004, RF-CORE-005; card {AUD-08}.
Como testar: o Super Administrador, em /admin/parametros, sobe senha_minima_caracteres de 8 para 10, baixa perfil_biografia_max_caracteres para 200, baixa cadastro_por_origem_maximo para 2 cadastros em 15 minutos e troca o assunto de email_assunto_recuperacao_senha; exercita cada um.
Passa quando: o cadastro e a redefinição com senha de 9 caracteres são recusados com "10" na mensagem e a dica do formulário já diz 10 sem recarregar a aplicação; a biografia de 250 caracteres é recusada com "200" e o campo não aceita digitar além de 200; o terceiro cadastro da mesma origem na janela recebe 429; o próximo e-mail de recuperação sai com o assunto novo; a forma texto recusa vazio, acima de 120 caracteres e com quebra de linha, com a faixa na mensagem; cada alteração tem uma entrada na trilha com antes e depois; os valores são restaurados no fim e a restauração também aparece na trilha.
Nota (Inspeção, gate {AUD-10}, drift 5, 2026-09-30): a parte do assunto deste caso (a troca do assunto de email_assunto_recuperacao_senha em /admin/parametros) migrou para /admin/emails em {AUD-10}, porque a linha deixa de existir em mfit.parametro, e passa a ser coberta por {TA-99}. O fechamento abaixo está correto para o que a tela era em 29/09/2026, e a marcação não muda.
Fechamento [2026-09-29]: passa em produção (https://fit.modulareasy.com, merge fa725bc, qa rodada 1 PASS COM RESSALVAS, zero P0 e zero P1; evidência no gate de qa modularfit-AUD-08 e em 56 capturas de tela do qa). Senha mínima de 8 para 10: cadastro de 9 caracteres recusado com "10" na mensagem e conta inexistente no banco, dica do formulário em 10 sem reiniciar (quatro combinações de tema e largura), redefinição de 9 recusada com o endereço de uso único não consumido, e o par positivo (10 caracteres cria a conta; senha longa redefine e a antiga passa a dar 401). Biografia de 1000 para 200: 250 e 201 recusados com "200", 200 exatos aceitos, o campo não deixa digitar além de 200, e biografia antiga de 500 continua exibida e o nome salva sem tocá-la. Anti-abuso de 10 em 60 para 2 em 15: primeiro e segundo cadastro 201, terceiro 429 com espera de 900 segundos (aluno e profissional no mesmo balde), e restaurado o mesmo terceiro cadastro dá 201. Assunto de recuperação: o e-mail enviado gravou o assunto novo, sem reiniciar. Forma texto: vazio, só espaços, 121 caracteres, quebra de linha (LF e CRLF), TAB, número e 2 caracteres recusados com a faixa na mensagem, 120 exatos aceitos. Trilha com antes e depois em cada alteração e na restauração, legível em /admin/auditoria; negações 403 para Administrador, Profissional e Aluno e 401 para anônimo, com o par positivo do Super Administrador. Sem estouro de largura em 400 e 1280, nos temas claro e escuro. Lacunas declaradas: a comparação com o código pai foi por leitura e não por execução; o consumidor do envio de mídia de {TA-93} não foi exercitado; a negação foi provada na rota, sem teste separado da camada de segurança por linha do banco; a recusa de 121 caracteres na tela é impedida pelo limite do campo, e a do servidor foi provada pela API. Dados de teste apagados, com o retrato dos 42 parâmetros idêntico ao inicial.
Cobre: RF-TREI-001, RF-TREI-004, RF-TREI-009, Matriz Ator por Capacidade; card {AUD-09}.
Como testar: com um Médico e um Nutricionista com vínculo ativo com o mesmo aluno, cada um tenta, pela tela e pela rota direta, criar uma ficha, duplicar a ficha do Personal Trainer e atender uma solicitação desse aluno; repetir com o Personal Trainer e o Fisioterapeuta com vínculo ativo, e com o aluno criando ficha para si.
Passa quando: as seis tentativas do Médico e do Nutricionista recebem 403 nomeado sem linha gravada, o Personal Trainer e o Fisioterapeuta com vínculo ativo fazem as três com sucesso, e o aluno cria ficha para si.
Nota (Drift 1, gate modularfit-AUD-09, 2026-09-30): o card {AUD-09} inclui editar, desativar e reativar ficha de que é autor (linha Editar da Matriz, N para Médico e Nutricionista); a ficha antiga de um deles só é alterada pela administração (RN-009).
Nota (Drift 2, gate modularfit-AUD-09, 2026-09-30): POST /api/solicitacoes recusa com 403 nomeado quando o destinatário não prescreve treino; a tela só oferece destinatários que prescrevem e não oferece "Pedir ajuste" em ficha cujo autor não prescreve. O teste prova as duas pontas: o aluno não consegue pedir (rota com 403 nomeado, tela sem o destinatário e sem "Pedir ajuste"), e o pedido antigo, semeado pelo arnês, não é atendido nem recusado.
Fechamento [2026-09-30]: passa em produção (https://fit.modulareasy.com, merge d760b2d, migração 0045, qa PASS COM RESSALVAS, zero P0 e zero P1, evidência no gate de qa modularfit-AUD-09). Médico e Nutricionista com vínculo ativo com o mesmo aluno: 0 de 7 ações (criar, duplicar, editar, desativar, reativar, atender, recusar), 14 de 14 tentativas pela rota direta com 403 nomeado ("A sua especialidade não prescreve ficha de treino") e banco idêntico antes e depois; pela tela, sem "Criar ficha", sem Duplicar, Editar e Desativar, com cartão de negação em /fichas/nova e em /fichas/:id/editar. Par positivo: Personal Trainer e Fisioterapeuta 7 de 7 (pela tela, com clique real, e pela rota), aluno cria, duplica e edita a própria ficha. As duas pontas do Drift 2: o aluno não pede a Médico nem a Nutricionista (403 nomeado, seletor só com Personal e Fisioterapeuta) e o pedido antigo semeado não é atendido nem recusado. Dados de teste apagados, zero resíduo.
Cobre: RF-CORE-010 (categoria nutrição), RN-001, RN-003, E.1, D.6, RF-DIET-001, RF-DIET-002; card {AUD-11}.
Como testar: com um aluno sem consentimento nenhum e um Personal Trainer e um Nutricionista com vínculo ativo com ele, os dois profissionais pedem a refeição, a meta nutricional e o painel do dia do aluno pela tela e pela rota direta; o aluno tenta registrar a primeira refeição; o aluno concede o consentimento de nutrição em /privacidade e repete; restringe a categoria a Nutricionista; revoga; tenta registrar outra refeição.
Passa quando: sem consentimento, as leituras dos dois profissionais são negadas sem conteúdo parcial e a refeição do aluno é recusada sem linha gravada, com a tela de consentimento de nutrição apresentada; a tela de privacidade mostra sete categorias, a de nutrição com texto e versão próprios; depois de conceder, a refeição grava, a vigência padrão da meta nasce com o valor vigente de metas_padrao e os dois profissionais leem; com a restrição a Nutricionista, o Personal Trainer volta a ser negado e o Nutricionista lê; depois da revogação a refeição nova é recusada, as já gravadas continuam legíveis pelo aluno e saem da vista dos dois profissionais; concessão, restrição e revogação aparecem na trilha; o Administrador continua negado em todas as leituras; os dados de teste são apagados no fim.
Nota (Inspeção, {AUD-11}, drift 7, 2026-09-30): a cláusula da restrição vale também para a escrita. Um Nutricionista vinculado que está fora da restrição escolhida pelo aluno (nutrição restrita a Médico, por exemplo) não define a meta: a tentativa é recusada, e o Nutricionista dentro da restrição, com o consentimento vigente, define. O caso registra as duas tentativas, e o dado de teste é apagado no fim.
Fechamento [2026-09-30]: passa em produção (https://fit.modulareasy.com, merge 6490072, migrações 0046 e 0047, qa PASS, zero P0 e zero P1, evidência no gate de qa modularfit-AUD-11). 61 de 61 verificações pela rota e pela tela, 0 falha, com par positivo em cada negação (mesmo aluno, só o consentimento ou a restrição alterna). Sem consentimento: Personal Trainer, Médico e Nutricionista recebem 403 categoria_nao_compartilhada em refeição e em meta, e 403 ao definir meta, com 0 linhas; o aluno novo (0 refeição, 0 meta, 0 consentimento) vê o cartão de consentimento de nutrição no lugar do formulário em /nutricao, /nutricao/refeicoes/nova e /nutricao/metas, e revogar no meio do formulário devolve 403 consentimento_necessario, volta o cartão e o rascunho é mantido e salvo depois de reconsentir. Consentir pela tela cria 1 meta padrão sem autor, reconceder dá 409 sem duplicar e a refeição grava (201). /privacidade mostra sete cartões, o de nutrição com texto e versão próprios. Restrição a Nutricionista: Personal Trainer e Médico negados na leitura e na escrita, Nutricionista lê e grava (201); restrição a Médico: Nutricionista fora, na leitura e na escrita da meta (a cláusula do drift 7), Médico lê. Revogado: todos os profissionais 403, o titular lê a refeição e o histórico, o aluno não registra, não define meta e não desativa refeição antiga (403 consentimento_necessario), e depois de reconsentir desativa (200). Administrador: 403 nomeado pela rota e 0|0|0 no banco contra 1|3|1 do aluno no mesmo alvo; Super lê (200) e grava a trilha (+4 entradas) e, personificando o aluno, grava (201) com consentimento e é negado (403) sem. Dados de teste apagados, zero resíduo. Lacuna nomeada: a escrita de refeição por profissional volta 403 pelo ramo "só o aluno escreve", o que não prova a regra de consentimento, que está provada no aluno; o Fisioterapeuta não foi testado à parte (mesmo ramo do Personal Trainer e do Médico). Achados do qa: 2 P2 (largura do cartão a 1280 e "Dia sem registro" sob o cartão), corrigidos dentro do merge e reconferidos, zero aberto.
Cobre: RF-PAIN-011 (modelos de e-mail), ADR-012, L.2; card {AUD-10}.
Como testar: o Super Administrador, em /admin/emails, abre o modelo de recuperação de senha, pré-visualiza, grava um assunto e um corpo novos usando só variáveis da lista, pede uma recuperação de senha e lê o e-mail na fila de envio; tenta gravar um corpo com {{cpf}}, um corpo sem {{endereco}} e um assunto com quebra de linha; restaura a versão anterior; pré-visualiza os onze modelos na versão da semente; o Administrador abre a tela e tenta gravar pela rota direta.
Passa quando: a prévia mostra o texto renderizado e não cria versão nem e-mail na fila; a gravação válida cria a versão seguinte, vigente, com entrada de antes e depois na trilha; o próximo e-mail de recuperação sai com o assunto e o corpo novos e as variáveis substituídas, sem reiniciar o serviço, e o registro do envio guarda o número da versão; as três gravações inválidas são recusadas com a regra e a variável nomeadas na mensagem, e a vigente não muda; restaurar cria uma versão nova com o conteúdo da antiga; a prévia de cada um dos onze modelos na versão da semente é idêntica ao texto que o código produzia antes da migração para os mesmos dados; o Administrador vê os onze modelos sem controle de edição e recebe negação na gravação; /admin/parametros não lista nenhum email_assunto_; o texto original é restaurado no fim e os e-mails de teste vão só para endereços de teste da casa, apagados depois.
Nota (Inspeção, gate {AUD-10}, drifts 1 e 10, 2026-09-30): (1) Identidade da prévia: a cláusula "idêntica ao texto que o código produzia" vale ao pé da letra para a parte texto dos onze modelos (11 de 11). Na parte HTML, 9 modelos são idênticos byte a byte e 2 (recuperacao_senha e acesso_criado) têm a troca declarada de "Clique" por "Acesse" no HTML, porque o código antigo dizia "Acesse o link abaixo" no texto e "Clique no link abaixo" no HTML e um corpo só não reproduz as duas cópias; a semente parte da versão texto. (2) Gravação em produção: a versão é imutável por lei do produto, então restaurar cria versão nova e nada do que o teste grava sai do histórico. Por isso, em produção, o qa grava UMA vez, só no modelo de recuperação de senha: a versão 2, de teste, e a versão 3, que é a restauração da versão 1, de modo que o texto original volta a ser a versão vigente no fim. Tudo o mais deste caso (as recusas, a restauração de versão intermediária, a concorrência com versão base velha e a prévia dos onze) roda no arnês com banco real efêmero. As versões 2 e 3 ficam gravadas como rastro nominal da prova, declaradas, e as versões de teste ficam identificáveis como teste do qa de {AUD-10} na própria trilha: o assunto e o corpo da versão 2 levam o marcador "teste do qa de AUD-10", e a versão 3 é a entrada de restauração que vem logo depois dela e repete o conteúdo da versão 1. Os e-mails e as contas de teste são apagados como sempre. Estado esperado em produção depois do caso: três versões em recuperacao_senha e treze versões no total, onze da semente mais as duas.
Fechamento [2026-09-30]: passa em produção (merge 17b62d6, migrações 0048 e 0049, https://fit.modulareasy.com, /api/estado na versão 17b62d6; qa PASS COM RESSALVAS, zero P0 e zero P1, evidência no gate de qa modularfit-AUD-10). 12 de 12 critérios e 38 de 38 na bateria de rotas (recusas e negações), mais a tela nos dois temas e nas duas larguras sem rolagem lateral e sem erro de console, com par positivo e negativo no mesmo fixture. Gravação válida pela tela, com confirmação nominal, cria a versão 2 e o e-mail real seguinte sai com o marcador no assunto e no corpo (texto e HTML) e modelo_versao igual a 2, sem reiniciar o serviço; 15 de 15 recusas ({{endereco}} no assunto, corpo sem {{endereco}}, {{cpf}}, assunto com LF, CRLF e U+2028, vazio, 121 caracteres, corpo de 19, e as recusas de rota) com a variável nomeada e o histórico idêntico a cada uma; gravar sem mudança dá 422 nada_mudou e base velha dá 409; dois restaurar paralelos dão 201 e 409, três versões e não quatro; restaurar a versão 3 igual à 1 confere por md5 e o e-mail seguinte sai com o texto original; Administrador lê lista, histórico e prévia (200) e recebe 403 ao gravar e ao restaurar, com o valor intacto; Profissional e Aluno recebem 403 e o anônimo 401; a prévia não grava versão nem enfileira; /admin/parametros tem 33 linhas e zero email_assunto_. Regressão de {TA-96}: 14 de 14 e-mails reais idênticos ao texto de sempre, todos com modelo_versao preenchido. O histórico de recuperacao_senha ficou com a versão 1, a versão 2 (de teste, marcada) e a versão 3, restauração da 1 e vigente. Contas de teste apagadas (varredura sem resíduo), fila e personificações zeradas. Ressalvas nominais: a tela só recusa um texto inválido depois da confirmação (P2-2); acesso_criado e solicitacao_ficha_atendida sem disparo em produção, cobertos por semente e arnês; política de inserção do banco sem teste isolado; restaurar pela tela sem sucesso em produção (201 pela rota); Drift 3 não conferido em produção.
Cobre: RF-CORE-010, RF-CORE-012, ADR-012, L.2; card {AUD-12}.
Como testar: o Super Administrador publica em /admin/textos uma versão nova do texto de consentimento de nutrição; um aluno abre a concessão dessa categoria e concede; outro aluno, que tinha a tela aberta com a versão anterior, tenta conceder; um aluno restringe um consentimento a uma especialidade e abre a tela de privacidade; repetir com uma especialidade cujo nome é prefixo de outra.
Passa quando: o aluno vê o texto novo sem publicação de código; a concessão grava em consentimento.versao_texto a versão exibida; o aluno com a tela aberta na versão anterior recebe 409 texto_atualizado ao conceder e nenhuma linha é gravada; o consentimento restrito a uma especialidade marca só o chip dela, inclusive quando outra especialidade tem nome que é prefixo do dela; os sete textos vêm da vigência de mfit.texto_versionado, um ponto por categoria, e nenhum texto de consentimento permanece em constante de código; os dados de teste são apagados no fim e o texto de produção não fica alterado sem decisão do operador.
Nota (Inspeção, gate {AUD-12}, drifts 5 e 6, 2026-09-30): (5) a cláusula "especialidade com prefixo de outra" não existe em produção, porque o catálogo de especialidades é um enum fechado de quatro valores e nenhum é prefixo de outro; ela se prova por dois meios: teste unitário da função pura chipRealcado com chaves sintéticas medico e medico_esportivo, e prova em produção de que GET /api/consentimentos devolve restrito_a_especialidades como ARRAY JSON (Array.isArray), que é a causa-raiz. (6) "texto de produção não fica alterado" se cumpre pelo estado vigente, e não pelo histórico, que é só de acréscimo: a prova em produção publica nutricao na versão 1.1 (texto de teste), prova, e publica a 1.2 com o texto da 1 (restauração), no precedente de {TA-99}; o estado final tem o texto vigente igual ao de hoje, rótulo de versão 1.2 e duas versões de rastro permanentes no histórico.
Fechamento [2026-09-30] ({AUD-12}, merge 4e5ed26, migrações 0050 e 0051): passa em produção, qa PASS COM RESSALVAS, 27 de 27 critérios (API, tela e banco), 0 P0 e 0 P1, e a reconferência na versão 53c7fd2 PASS nos quatro combos (claro e escuro, larguras de 400 e 1280). Evidência: gate de qa modularfit-AUD-12. Publicar a 1.1 pela tela vale na próxima concessão e a versão exibida fica em consentimento.versao_texto; o aluno com a tela antiga recebe 409 texto_atualizado com nenhuma linha gravada; quem consentiu antes segue na versão aceita; restrição a uma especialidade acende só o chip dela e a rota devolve lista; o Administrador publica e aluno e profissional recebem o mesmo 403. Estado final: texto vigente igual ao de hoje (md5 conferido), versão 1.2, histórico de nutrição com 1, 1.1 e 1.2 (exceção declarada, histórico só de acréscimo), zero resíduo de teste. Ressalvas nominais: P2-1 (markdown cru no cartão Termos de uso de /admin/textos, pré-existente de {F1-18}) e P2-2 (a tela não avisa ao aluno já consentido que há versão nova, fora de escopo); a cláusula do prefixo de outra especialidade foi provada pela causa-raiz (array JSON) e pelo teste unitário, sem caso real em produção.
Cobre: o card {AUD-13}; extensão de {F5-03}.
Como testar: com um usuário autenticado, enviar a cada rota de escrita que lê corpo JSON malformado ({x) e um corpo que não é objeto ([] e null); conferir o estado do banco antes e depois; rodar o verificador sobre um arquivo sintético que lê o corpo fora do ponto único e sobre um que usa o ponto único.
Passa quando: todas as rotas que leem corpo respondem 400 corpo_invalido aos três corpos, sem gravar nada, nas 36 leituras do universo medido em 06/10/2026 (a medir de novo no gate), nutrição incluída; um corpo válido segue gravando; o verificador reprova a leitura de corpo fora do ponto único e não reprova a que o usa; nenhuma regra de negócio mudou; os dados de teste são apagados no fim.
Nota (Inspeção, gate {AUD-13}, Drift 8, 2026-10-06): o teste gerado usa 6 tipos de corpo inválido por rota, um superconjunto dos 3 pedidos acima (que ficam como foram publicados): {x (malformado), vazio, null, [], 1 e "t" (texto). Todos respondem 400 corpo_invalido sem gravar nada; a exceção é /api/sessoes/:id/encerrar, onde o corpo vazio continua valendo {}. O universo medido é 38 rotas (não 36), e o teste cobre também as 6 rotas públicas, sem sessão: sessão (login), cadastro de aluno, cadastro de profissional, conta/confirmar, senha/recuperar e senha/redefinir; nelas {} segue com a resposta de hoje (em senha/recuperar, 202). Por linha de rota, o 401 sem sessão e o 403 ou 404 do ator negado seguem iguais aos de hoje.
Fechamento [2026-10-06] de {AUD-13}: provado em produção (https://fit.modulareasy.com, gate de qa modularfit-AUD-13, rodada 1 PASS, versão ecef515, a mesma árvore do merge 1c32c5e), todas as cláusulas do H1. As 38 rotas que leem corpo, por 6 corpos inválidos (JSON malformado, vazio, [], null, texto e número), respondem 400 corpo_invalido com mensagem única: 32 autenticadas e 6 públicas (sessão, cadastro de aluno, cadastro de profissional, conta/confirmar, senha/recuperar e senha/redefinir). Ordem preservada: sem sessão, 401 nas 32 rotas autenticadas; ator negado, o mesmo 403 de {} em 25 rotas; alvo ausente, o mesmo 404 em 7 rotas. Nada gravado: o estado do aluno (12 listas) e do administrador (6 listas) tem o mesmo md5 antes e depois dos 6 corpos nas 32 rotas. {} responde o medido antes (410 em conta/confirmar e senha/redefinir; 202 em senha/recuperar, com corpo idêntico para e-mail existente e inexistente; encerrar sem corpo segue 200). Par positivo: o profissional com corpo válido em POST /api/vinculos recebe 201 e o aluno e o administrador recebem 403. Caminho feliz por domínio segue gravando e a SPA (aluno, Chrome sem interface) loga, salva perfil, registra refeição e avaliação com 0 erros de console. Dados de teste apagados (5 contas qa.aud13, varredura sem resíduo). Lacuna declarada: o 429 do balde antes do 400 nas 3 rotas com balde não foi forçado em produção; e o P2 preexistente do diretório vazio de exercício fica fora do card.
Beta (testes com o cliente)
Cada cartão corresponde a uma jornada do documento de Jornadas dos Atores. Quem testa é um usuário real do papel, executando a jornada inteira na aplicação em uso, sem roteiro técnico.
Aluno
Cobre: a jornada de primeiro uso do Aluno.
Quem testa: aluno real, recém-cadastrado.
Como validar: chega pela página inicial pública, entende para quem é a plataforma, cria a conta, aceita os termos, e a partir do painel tenta chegar ao primeiro treino, criando a própria ficha ou aguardando a do profissional; depois preenche o que quiser do perfil pelo indicador de completude.
Passa quando: completa sem bloqueio por campo opcional, confirma que a página pública deixou claro que o sistema é para treino de musculação acompanhado, chega ao primeiro treino sem ajuda, e confirma que entendeu que o preenchimento do perfil é opcional.
Cobre: a jornada de consentimentos do Aluno.
Quem testa: aluno real.
Como validar: lê as finalidades, concede uma categoria, restringe outra a uma especialidade e revoga uma terceira.
Passa quando: entende o que cada categoria significa, as três ações têm efeito visível e ele confirma que se sente no controle dos próprios dados.
Cobre: a jornada de resposta a convite do Aluno.
Quem testa: aluno real que recebeu um convite.
Como validar: encontra o convite pela notificação, confere quem é o profissional e aceita.
Passa quando: completa sem ajuda e confirma que sabia quem estava aceitando antes de aceitar.
Cobre: a jornada de execução de treino do Aluno.
Quem testa: aluno real, no celular, dentro da academia.
Como validar: executa uma sessão inteira registrando cargas e usando o descanso, com o celular ocioso entre séries, e no meio do treino fecha o aplicativo e retoma pelo atalho.
Passa quando: conclui a sessão sem interromper o treino para entender a tela, não precisa desbloquear a tela a cada série, a retomada traz o que já tinha registrado, e confirma que os números batem com o que fez.
Cobre: a jornada de ficha própria e solicitação do Aluno.
Quem testa: aluno real.
Como validar: monta uma ficha sozinho, duplica uma recebida e envia um pedido de ajuste com motivo.
Passa quando: completa as três ações e entende por que não consegue editar diretamente a ficha do profissional.
Cobre: a jornada de nutrição do Aluno.
Quem testa: aluno real, ao longo de um dia inteiro.
Como validar: registra as refeições do dia e acompanha o que falta para a meta.
Passa quando: registra o dia completo sem abandonar no meio e confirma que os totais fazem sentido.
Cobre: a jornada de evolução do Aluno.
Quem testa: aluno real.
Como validar: registra as medidas, envia a foto escolhendo a pose e compara com a foto anterior da mesma pose e com a medição anterior.
Passa quando: completa, entende por que a comparação acontece dentro da mesma pose, e confirma que consegue ver a própria evolução sem interpretar número solto.
Cobre: a jornada clínica do Aluno.
Quem testa: aluno real, sem profissional daquela especialidade vinculado.
Como validar: preenche a própria anamnese, anexa um exame e aciona a explicação em linguagem simples no exame e na anamnese.
Passa quando: completa sem bloqueio indevido, encontra a anamnese guardada com a data do dia, e confirma que as explicações ajudaram sem parecer diagnóstico.
Cobre: a jornada de comunicação do Aluno.
Quem testa: aluno real com dois profissionais vinculados.
Como validar: conversa com cada um, participa do grupo, envia um link e limpa as notificações.
Passa quando: completa e confirma que as notificações não se acumularam de forma incômoda.
Cobre: a jornada de plano e cobrança do Aluno.
Quem testa: aluno real com acordo registrado.
Como validar: consulta o plano, os limites e o que deve a cada profissional.
Passa quando: encontra as duas informações sem ajuda e entende que o pagamento acontece fora do sistema.
Cobre: a jornada de integrações do Aluno.
Quem testa: aluno real que usa relógio ou aplicativo de corrida.
Como validar: conecta o serviço que já usa, treina fora do sistema e volta no dia seguinte para ver o registro; depois desconecta.
Passa quando: conecta sem ajuda, encontra a atividade dela no calendário identificada pela origem no dia seguinte, entende que aquilo não virou sessão de treino do sistema, e ao desconectar confirma que o histórico não sumiu.
Cobre: a jornada de portabilidade do Aluno.
Quem testa: aluno real com histórico em várias categorias.
Como validar: solicita a exportação e abre o pacote recebido.
Passa quando: recebe o pacote e reconhece os próprios dados nele.
Personal Trainer
Cobre: a jornada de abertura do dia do Personal Trainer.
Quem testa: personal trainer real com carteira de alunos.
Como validar: abre o painel e decide por quem começar.
Passa quando: identifica em menos de um minuto quem precisa de atenção e confirma que a informação é a que ele usaria.
Cobre: a jornada de vinculação do Personal Trainer.
Quem testa: personal trainer real.
Como validar: busca o aluno e envia o convite.
Passa quando: o vínculo é criado e ele confirma que entendeu por que não vê nada do aluno até o aceite.
Cobre: a jornada de prescrição do Personal Trainer.
Quem testa: personal trainer real.
Como validar: lê preferências e histórico e monta uma ficha completa, manualmente e depois com a geração assistida.
Passa quando: entrega uma ficha que ele daria a um aluno real, e a prévia gerada precisou de ajuste que ele conseguiu fazer.
Cobre: a jornada de solicitação do Personal Trainer.
Quem testa: personal trainer real.
Como validar: recebe a solicitação, lê o motivo e atende criando a ficha.
Passa quando: o ciclo fecha com o aluno notificado e ele confirma que não perderia o pedido de vista.
Cobre: a jornada de avaliação do Personal Trainer.
Quem testa: personal trainer real, com um aluno presente.
Como validar: preenche as seis seções durante a avaliação e compara com a anterior.
Passa quando: preenche no ritmo do atendimento e confirma que os cálculos batem com o que ele faria à mão.
Cobre: a jornada de acompanhamento do Personal Trainer.
Quem testa: personal trainer real.
Como validar: revisa a semana da carteira, olha a progressão de carga e aciona quem parou.
Passa quando: identifica os alunos que precisam de ação e confirma que a leitura de progressão é útil.
Cobre: a jornada de cobrança do Personal Trainer.
Quem testa: personal trainer real.
Como validar: registra o acordo, acompanha as competências e dá baixa numa paga.
Passa quando: o extrato reflete a realidade dele e confirma que substituiu o controle que fazia por fora.
Cobre: a jornada de comunicação do Personal Trainer.
Quem testa: personal trainer real com aluno atendido por outra especialidade.
Como validar: conversa com o aluno e alinha com o outro profissional pela conversa reservada e por menção no grupo.
Passa quando: o alinhamento acontece sem sair do sistema e ele confirma que o aluno não viu a conversa reservada.
Médico
Cobre: a jornada de abertura do dia do Médico.
Quem testa: médico real.
Como validar: abre o painel e identifica o que precisa ler e prescrever.
Passa quando: identifica sem ajuda e confirma que a ordem das informações é a que ele usaria.
Cobre: a jornada de vinculação do Médico.
Quem testa: médico real.
Como validar: envia o convite pelo identificador ou pelo nome.
Passa quando: o vínculo é criado e ele confirma que o processo respeita o consentimento do paciente.
Cobre: a jornada de anamnese do Médico.
Quem testa: médico real.
Como validar: abre uma anamnese nova de um paciente que já tinha uma anterior, confere o tronco pré-preenchido, corrige o que mudou e completa a seção clínica; depois abre a anamnese anterior.
Passa quando: não precisa redigitar o que já existia, confirma que a seção clínica cobre o que ele pergunta, e reconhece a anamnese anterior intacta na lista, com a data em que foi coletada.
Cobre: a jornada de exames do Médico.
Quem testa: médico real.
Como validar: abre um exame anexado pelo paciente, registra resumo e observações e aciona a explicação simples.
Passa quando: o anexo abre com qualidade de leitura e ele confirma que a explicação gerada é adequada para entregar ao paciente.
Cobre: a jornada de prescrição do Médico.
Quem testa: médico real.
Como validar: registra uma prescrição completa e confere como o paciente a enxerga.
Passa quando: o registro é suficiente para o acompanhamento e ele confirma que o aviso de não substituição do receituário está claro.
Cobre: a jornada de cobrança do Médico.
Quem testa: médico real.
Como validar: registra o acordo e dá baixa numa competência.
Passa quando: o extrato reflete a realidade dele.
Cobre: a jornada de comunicação do Médico.
Quem testa: médico real.
Como validar: alinha uma conduta com quem treina ou alimenta o paciente, usando menção.
Passa quando: o alinhamento acontece sem sair do sistema e o mencionado responde.
Fisioterapeuta
Cobre: a jornada de abertura do dia do Fisioterapeuta.
Quem testa: fisioterapeuta real.
Como validar: abre o painel e identifica os tratamentos que precisam de atenção.
Passa quando: identifica sem ajuda e confirma que a curva de dor é a leitura que ele usaria.
Cobre: a jornada de vinculação do Fisioterapeuta.
Quem testa: fisioterapeuta real.
Como validar: envia o convite e aguarda o aceite.
Passa quando: o vínculo é criado sem dúvida sobre o passo seguinte.
Cobre: a jornada de anamnese do Fisioterapeuta.
Quem testa: fisioterapeuta real.
Como validar: completa a seção funcional sobre o tronco já existente.
Passa quando: os campos cobrem a avaliação inicial dele sem precisar escrever tudo em observações.
Cobre: a jornada de sessão do Fisioterapeuta.
Quem testa: fisioterapeuta real, ao fim de um atendimento.
Como validar: registra região, tratamento realizado, exercícios realizados, notas de amplitude e de progresso, dor antes e depois, duração e o plano da próxima sessão.
Passa quando: registra no tempo do atendimento, a evolução da dor aparece corretamente na sessão seguinte, e ele reencontra no painel o plano que deixou escrito, sem reler a sessão inteira.
Cobre: a jornada de prescrição de exercícios do Fisioterapeuta.
Quem testa: fisioterapeuta real.
Como validar: monta uma ficha terapêutica com exercícios do catálogo e acompanha a execução pelo histórico.
Passa quando: encontra no catálogo os exercícios de que precisa, ou registra nominalmente os que faltam para inclusão.
Cobre: a jornada de cobrança do Fisioterapeuta.
Quem testa: fisioterapeuta real.
Como validar: registra o acordo por sessões e dá baixa nas pagas.
Passa quando: o extrato reflete o modelo de cobrança dele.
Cobre: a jornada de comunicação do Fisioterapeuta.
Quem testa: fisioterapeuta real.
Como validar: comunica ao profissional de treino uma restrição de movimento do paciente.
Passa quando: a restrição chega a quem prescreve e a ficha é ajustada em seguida.
Nutricionista
Cobre: a jornada de abertura do dia do Nutricionista.
Quem testa: nutricionista real.
Como validar: abre o painel e identifica quem está fora da meta.
Passa quando: identifica sem ajuda e confirma que a medida de aderência é a que ele usaria.
Cobre: a jornada de vinculação do Nutricionista.
Quem testa: nutricionista real.
Como validar: envia o convite e aguarda o aceite.
Passa quando: o vínculo é criado sem dúvida sobre o passo seguinte.
Cobre: a jornada de anamnese do Nutricionista.
Quem testa: nutricionista real.
Como validar: completa a seção alimentar sobre o tronco já existente.
Passa quando: os campos cobrem a consulta inicial dele, incluindo restrições que depois bloqueiam a geração de dieta.
Cobre: a jornada de metas do Nutricionista.
Quem testa: nutricionista real.
Como validar: define as quatro metas e confere como o paciente as enxerga no painel diário.
Passa quando: as metas valem imediatamente e o paciente entende o que mudou.
Cobre: a jornada de avaliação física do Nutricionista.
Quem testa: nutricionista real, com um paciente presente.
Como validar: registra a avaliação com dobras cutâneas, perímetros e o percentual de gordura pelo método que utiliza, e compara com a avaliação anterior do paciente.
Passa quando: consegue registrar a antropometria completa sem recusa por especialidade, no ritmo do atendimento, e confirma que os cálculos e a comparação servem para ajustar meta e plano.
Cobre: a jornada de plano alimentar do Nutricionista.
Quem testa: nutricionista real.
Como validar: monta o plano manualmente e depois com a geração assistida, editando a prévia.
Passa quando: entrega um plano que ele daria a um paciente real e a prévia gerada respeitou as restrições declaradas.
Cobre: a jornada de acompanhamento do Nutricionista.
Quem testa: nutricionista real, após duas semanas de registros do paciente.
Como validar: consulta médias, dias com meta atingida e evolução de peso, e ajusta o plano.
Passa quando: consegue decidir o ajuste com o que a tela mostra, sem exportar nada.
Cobre: a jornada de cobrança do Nutricionista.
Quem testa: nutricionista real.
Como validar: registra o acordo e dá baixa numa competência.
Passa quando: o extrato reflete a realidade dele.
Cobre: a jornada de comunicação do Nutricionista.
Quem testa: nutricionista real.
Como validar: alinha com quem prescreve o treino o volume e o gasto estimado do paciente.
Passa quando: o alinhamento acontece sem sair do sistema.
Administração da plataforma
As jornadas abaixo pertencem aos dois papéis de administração. Quem testa cada uma é o papel que a percorre no documento de Jornadas: {TB-44}, {TB-47}, {TB-48} e {TB-54} são do Super Administrador; as demais são percorridas pelos dois, e vale testar com os dois quando houver conta de cada.
Cobre: a jornada de catálogo do Administrador.
Quem testa: operador real da administração.
Como validar: cadastra exercícios novos com mídia, aciona a geração de mídia em lote para os que estão sem, aprova umas e rejeita outras, e desativa vários em desuso pela seleção em massa.
Passa quando: o cadastro é rápido o bastante para uma carga de dezenas de itens, a mídia aprovada aparece correta na tela do aluno, a rejeitada não entra no catálogo, e a contagem da ação em lote confere com o que ele selecionou.
Cobre: a jornada de contas, na parte comum e na parte privativa.
Quem testa: um operador com conta de Administrador e um com conta de Super Administrador.
Como validar: o Administrador cria uma conta, corrige o cadastro, marca um registro como verificado e desativa; o Super Administrador, na mesma tela, promove um papel, bloqueia e desbloqueia uma conta e exclui em definitivo.
Passa quando: as ações comuns completam para os dois e o usuário afetado sente o efeito imediatamente, E o Administrador diz, sem consultar documento nenhum, o que a tela lhe permite e o que ele precisa encaminhar, porque a tela deixou isso claro sozinha.
Cobre: a jornada de planos do Super Administrador.
Quem testa: operador real da plataforma.
Como validar: cria um plano, ajusta um limite operacional, atribui a um aluno e desliga o acesso de outro; depois abre a mesma tela com uma conta de Administrador e confirma que lê sem escrever.
Passa quando: o efeito aparece na sessão seguinte dos alunos e a operação de cobrança por fora do sistema fica viável.
Cobre: a jornada de vínculos do Administrador.
Quem testa: operador real da administração.
Como validar: resolve um caso de suporte filtrando e ajustando um vínculo.
Passa quando: o caso é resolvido pelo próprio painel, sem intervenção técnica.
Cobre: a jornada de relatórios do Administrador.
Quem testa: responsável pelo produto.
Como validar: acompanha um mês de operação pelos relatórios e exporta uma tabela.
Passa quando: responde as perguntas de acompanhamento do produto sem precisar consultar o banco.
Cobre: a jornada de auditoria do Administrador.
Quem testa: operador real da administração.
Como validar: apura quem alterou um registro específico e quando.
Passa quando: chega à resposta pelos filtros disponíveis e vê também os próprios acessos registrados.
Cobre: a jornada de pedido do titular do Administrador.
Quem testa: responsável pela proteção de dados.
Como validar: atende um pedido de exportação e um de eliminação, do início ao registro.
Passa quando: os dois pedidos são atendidos e comprovados, com a auditoria preservada e anonimizada.
Cobre: a jornada de rotinas do Administrador.
Quem testa: operador real da administração.
Como validar: confere por uma semana se as sete rotinas rodaram e reage a uma falha simulada.
Passa quando: identifica a falha pelo registro e pelo alerta, e sabe o que fazer sem depender de acesso técnico.
Cobre: a jornada de manutenção do guia do Administrador.
Quem testa: operador real da administração.
Como validar: percorre a matriz de módulo por papel, escreve um guia, gera outro com a geração assistida e revisa, publica os dois e restaura uma versão anterior.
Passa quando: identifica pela matriz o que está sem guia, publica sem precisar de apoio técnico, confirma que o leitor não viu rascunho e que a versão restaurada não apagou a anterior.
Cobre: a jornada de personificação do Super Administrador (documento de Jornadas).
Quem testa: operador real da plataforma, sobre um chamado real ou reproduzido.
Como validar: recebe a descrição de um problema de tela vinda de um usuário, personifica esse usuário, percorre o caminho descrito, entende o caso e sai pela faixa. Depois consulta a trilha e confere o próprio rastro.
Passa quando: entende o caso vendo a tela do usuário, sem pedir senha a ninguém e sem consultar o banco, confirma que a faixa esteve visível o tempo todo e soube dizer quanto tempo restava, e encontra na trilha o início e o fim da própria personificação.
Executado em: 29/09/2026, pela Inspeção, produção fa725bc (https://fit.modulareasy.com): PASS. Faixa visível com o tempo restante, saída pela faixa, início e fim na trilha.
Cobre: RF-PAIN-011, o lado do Administrador; card {AUD-06} do Roadmap.
Quem testa: operador real da administração, com conta de Administrador.
Como validar: com conta de Administrador, abrir /admin/parametros e conferir que
abre em leitura, sem controle de escrita; tentar a gravação pela rota direta com o cookie
dele.
Passa quando: com conta de Administrador, /admin/parametros abre em leitura, nenhum
controle de escrita aparece, e a gravação pela rota direta com o cookie dele responde 403.
Executado em: 29/09/2026, pela Inspeção, produção fa725bc (https://fit.modulareasy.com): PASS. /admin/parametros em leitura, gravação direta por PUT responde 403.
Cobre: RF-PAIN-011, o lado do Administrador; card {AUD-07} do Roadmap.
Quem testa: operador real da administração, com conta de Administrador.
Como validar: com conta de Administrador, abrir /admin/listas e conferir que
abre em leitura, sem controle de escrita; tentar a gravação pela rota direta com o cookie
dele.
Passa quando: com conta de Administrador, /admin/listas abre em leitura, nenhum
controle de escrita aparece, e a gravação pela rota direta com o cookie dele responde 403.
Executado em: 29/09/2026, pela Inspeção, produção fa725bc (https://fit.modulareasy.com): PASS. /admin/listas em leitura, gravação direta por POST e por PATCH responde 403.
Todos os papéis
Cobre: a jornada de consulta ao guia, comum aos seis papéis.
Quem testa: um usuário real de cada um dos seis papéis.
Como validar: cada um chega ao guia pelo menu, escolhe o módulo sobre o qual tem dúvida e tenta resolver a dúvida só com o que está escrito ali.
Passa quando: os seis encontram o guia sem ajuda, resolvem a dúvida sem perguntar a outra pessoa e confirmam que o texto fala a língua do papel deles, sem descrever ação que o sistema não permite àquele papel.
Verificações gerais da etapa Beta
Cobre: todas as jornadas.
Quem testa: um usuário de cada papel.
Como validar: cada um percorre as próprias jornadas e relata se ficou preso em alguma tela.
Passa quando: nenhum usuário precisou do botão de voltar do navegador nem digitar endereço para sair de uma tela.
Cobre: N.2.
Quem testa: todos os participantes da etapa.
Como validar: cada um envia retorno pelo canal dentro da aplicação, registrando papel, tela e o que atrapalhou.
Passa quando: existe retorno registrado de todos os seis papéis e a fila foi triada.
Cobre: o resultado dos cartões Beta.
Quem testa: o time do produto com o dono.
Como validar: classificar cada retorno em correção, ajuste de requisito ou fora de escopo, e tratar as correções.
Passa quando: nenhuma correção classificada como bloqueante segue aberta e todo ajuste de requisito foi levado ao DRS antes de virar código.