Notas de Lançamento — 26 de abril de 2026
Há 19 dias lançámos uma grande atualização com o módulo de diagnóstico e a análise de prosódia. Desde então, a equipa avançou com mais 295 alterações — e não são pequenas. Neste lançamento pode gravar uma sessão ad-hoc antes mesmo de o paciente chegar, as suas notas fundem-se com o trabalho da IA e a transcrição lado a lado em três colunas, o perfil público do terapeuta está de volta em pleno vigor, e a aplicação móvel tem agora um tema escuro. Nos bastidores, passámos por um reforço de segurança SOC 2 / HIPAA, uma auditoria DDD e uma pseudonimização completa dos dados dos pacientes do lado da IA.
💚 Obrigado à equipa que impulsionou este lançamento — através de relatórios, testes, código e paciência:
- Bohdan — sessões ad-hoc, limites de pacote e período de tolerância, auditoria DDD, faturas KSeF, dezenas de correções (SCRUM-756, 815, 1267, 1268, 1276, 1280-1290, 1293, 1309-1316, 1353-1357, 1366, 1388, 1391, 1392)
- Bartek — fusão a três vias, 9 análises de TCC separadas, distorções cognitivas, contador de sessões do pacote (SCRUM-1266, 1320, 1338, 1368-1375, 1385, 1386)
- Ewa Cylwik / Ewa — PDF de Beck, segunda sessão AITS para o mesmo paciente, tema escuro móvel e estado vazio, envio de e-mails multilingue, cores da interface, unicidade do e-mail do paciente (SCRUM-883, 898, 902, 1089, 1094, 1297, 1304, 1307, 1319)
- Joanna — calendário recorrente, ocultação do Zoom, cancelamento dentro do prazo, autorreflexão em vez de avaliação da qualidade da sessão (SCRUM-789, 874, 918, 919, 1005)
- Além do Bartlomiej, pelas distorções cognitivas e pelo contador de sessões, que se tornou a base do novo modelo de subscrição
1. ⚡ Sessões ad-hoc — gravar antes de o paciente chegar
Se alguma vez teve de ligar rapidamente um gravador — porque um paciente apareceu sem aviso, porque é uma consulta única, porque é um encontro com alguém que ainda não está nos seus registos — o novo módulo de sessão ad-hoc resolve por completo essa dor de cabeça.
- Botão de Gravação Rápida no painel web, na PWA do telemóvel e na aplicação MAUI — um clique inicia a gravação antes mesmo de preencher os dados do paciente
- Caixa de Entrada AdHoc — uma bandeja dedicada para gravações não atribuídas até decidir para onde vão
- AssignPatientModal — atribua a gravação a um paciente existente ou crie um novo diretamente a partir da caixa de entrada
- Retomar / Reentrar na sala — termine de gravar uma sessão que começou anteriormente
- Retenção de órfãs + conclusão automática — as sessões não atribuídas durante X dias fecham-se automaticamente para manter a caixa de entrada organizada
- Vídeo “Iniciar sem paciente” — na sala LiveKit pode iniciar uma sessão sem colidir com um paciente existente; a AdHoc cai depois na caixa de entrada
A secção está bloqueada atrás do código PromptyAI em Definições — desativada por predefinição, para utilizadores que queiram ver primeiro o resto. Concebida e implementada pelo Bohdan.
2. 📊 Limites de pacote e período de tolerância — subscrição transparente
As subscrições foram totalmente revistas. Os antigos planos Starter/Standard estão desativados, substituídos por Start / Practice / Pro — dimensionados para o volume real de sessões por mês.
- Contador de sessões no painel — veja quantas sessões já usou este mês e quantas restam no seu pacote
- E-mails de limite — notificações automáticas aos 80% e 100% de utilização
- Sugestão de upgrade — quando atinge o limite, recebe uma sugestão suave de mudança de plano em vez de um bloqueio total
- Preços do Stripe + descontos — o preço que vê na aplicação vem diretamente do Stripe com os descontos ativos aplicados (o código de beta tester não expira)
- Cancelamento nativo de subscrição — cancele diretamente na aplicação, sem necessidade de enviar um e-mail ao suporte
- Período de tolerância de 14 dias — se um pagamento falhar, tem 14 dias de acesso apenas à sua própria conta (sem pré-visualizações de pacientes), com e-mails em T+0 e T+13. A perda real de dados só ocorre após duas semanas
- Faixa de subscrição — mensagem clara no topo da aplicação, sem barra vazia entre o menu e o alerta
- Simulador de limite de sessões — no painel PromptyAI existe um modo de teste onde pode ver como a aplicação se comporta com um pacote esgotado
Trabalho conjunto do Bartlomiej (contador e limites, SCRUM-1266) e do Bohdan (subscrição, tolerância, sugestão de upgrade — SCRUM-756, SCRUM-1366, SCRUM-1391, SCRUM-1392).
3. 📝 Fusão a três vias para as notas — terapeuta, IA e transcrição numa só vista
Esta é uma das maiores alterações arquiteturais nos bastidores, mas o efeito no trabalho diário é bem visível: cada campo de notas (Notas, Resumo da Sessão, secções de conceptualização) agora recorda separadamente o que o terapeuta escreveu, o que a IA gerou e o que veio do dictafone / transcrição.
- Notas a três vias — a vista de notas mostra três fontes lado a lado: o seu texto, as sugestões da IA e a transcrição automática, e escolhe o que quer manter
- Resumo da Sessão a duas vias + fusão JSON — no resumo da sessão funde o seu trabalho com a análise da IA num único documento coerente
- Separador temporal — quando edita manualmente um campo da IA, o sistema deixa um rasto visível de quando e de quem é esse fragmento
- Marcador [IA] desde a primeira geração — os seus campos não se misturam com os gerados
- SourceBadge — pastilha colorida com ícone que mostra a origem de um fragmento, em vez de texto em MAIÚSCULAS
- Substituição de secção pela IA em vez de acrescentar — quando pede a regeneração do resumo, a IA substitui a secção em vez de empilhar outra cópia por baixo
Concebida e implementada pelo Bartek (SCRUM-1320, SCRUM-1368-1375). Por baixo: i18n completo em 8 idiomas e novos contextos DDD.
4. 🔍 Análises de TCC — 9 relatórios separados a pedido
O antigo “gerar análise de TCC” monolítico foi dividido em 9 itens separados que o terapeuta executa quando realmente precisa deles. Menos espera, mais controlo.
- 9 análises independentes — cada uma gerada separadamente, a pedido
- Ícone de engrenagem para editar o prompt — clique na engrenagem junto de cada análise para ver/modificar o prompt que a IA vai usar
- Secção ANÁLISES DE TCC atrás do código PromptyAI — secção disponível depois de introduzir o código em Definições, para utilizadores que testam funcionalidades novas
As distorções cognitivas ganharam a sua própria vista (reportado pelo Bartlomiej, SCRUM-1385):
- Vista de dados em vez de um relatório de IA — vê citações concretas da transcrição marcadas pela IA, não uma narrativa gerada a partir delas
- Todas as citações após expandir — sem filtro de intervalo de datas, expandir revela tudo
- Disponível no menu principal — em Conceptualização v2
O antigo prompt COGNITIVE_DISTORTIONS_INVENTORY foi removido (SCRUM-1386).
5. 🌐 Perfil público do terapeuta — reformulação completa com painéis de edição
O perfil público sob a marca aitherapy.support foi totalmente reconstruído.
- 3 novos painéis de edição — biografia, especializações, dados de contacto editados em elegantes painéis laterais
- Modo de edição do proprietário — quando vê o seu próprio perfil enquanto autenticado, os botões de edição estão à mão
- Anos de experiência — novo campo
YearsOfExperiencevisível no perfil público - Rebranding de cores — paleta sálvia/lavanda sob a marca aitherapy.support
- Secção “A sua privacidade” removida — era redundante; o RGPD está no rodapé
- Ícones Lucide — tipografia de ícones moderna e limpa
Por baixo, foi adicionado um endpoint público GET /api/public/therapists — que devolve terapeutas com perfis públicos ativos. Base para um diretório de terapeutas.
6. 🎥 Sessões de vídeo — PiP, troca de câmaras, desfoque de fundo corrigido
O vídeo recebeu um conjunto de correções que qualquer terapeuta que faça sessões pela aplicação vai notar.
- PiP / minimizar — minimize a sala de vídeo para um mini-leitor flutuante e verifique notas noutro separador sem quebrar a ligação. O microfone e a câmara continuam a funcionar
- Trocar câmaras — troque quem está na vista principal e quem está na mini com um clique
- Retomar do PiP — ao voltar da minimização, salta a sala de espera (PreJoinLobby) e entra diretamente na conversa
- Áudio por participante para a diarização — a transcrição separa os falantes mesmo em PiP
- Desfoque de fundo corrigido — o CSP estava a bloquear o WASM do MediaPipe; o desfoque funciona agora com um clique
- Interface da sessão AITS mais limpa — o assistente de IA desapareceu da barra de ferramentas, menos ruído visual
- Sobreposição PiP clicável — removendo
pointerEvents:noneeoverflow:hidden, os botões do PiP respondem a cliques - Botão “Entrar na sessão” — estava escondido por uma substituição de CSS, agora está visível
- Fecho obsoleto (stale closure) em handleMaximize — corrigido; maximizar o PiP já não gera um erro
7. 📐 Conceptualização Beck v2 e ABC — PDF, alternância de versão, edição do prompt
- PDF Beck e ABC v2 — formatação corrigida e inclusão automática nos materiais da sessão (reportado pela Ewa, SCRUM-1297)
- PDF Beck — secções apenas com contorno, especializações coloridas, iniciais limpas, seta SVG entre secções
- Alternância ABC v1/v2 em Conceptualização v2 — escolha qual versão do ABC mostrar
- Ícone de engrenagem para editar o prompt no ABC v2 — modifique o prompt da IA no separador ABC v2
- Exportação em PDF das análises de IA e do ABC por sessão — análises individuais exportadas separadamente
- Pluralização das etiquetas ABC em 8 idiomas — a tabela de conceptualização tem as formas plurais corretas
- Correção das colunas vazias do ABC — o backend devolve os nomes de propriedade no plural correto
8. 🧾 Faturas e KSeF — seleção de pagamentos + máquina de estados
O sistema de faturação foi refatorado para conformidade com o KSeF (sistema nacional polaco de faturação eletrónica).
- Fatura a partir de pagamentos selecionados — selecione pagamentos e o sistema cria uma única fatura a partir deles (snapshot + Payment FK)
- Ponto de entrada “Emitir fatura” na vista financeira do terapeuta — acesso rápido a partir do painel
- Remoção de item no modal de emissão de faturas — corrija erros na hora
- Separação KSeF dev/prod — o sandbox e a produção trabalham com credenciais separadas
- Máquina de estados da fatura (SCRUM-1357 Bohdan) — Rascunho → Emitida → Enviada → Cancelada, com uma restrição na base de dados sobre transições ilegais
- AE KsefToken — token KSeF encriptado com Always Encrypted
Trabalho conjunto do Bohdan (SCRUM-1357, SCRUM-1388).
9. 📅 Calendário, sessões recorrentes e localizações
O calendário semanal e recorrente recebeu dezenas de melhorias pequenas mas visíveis — a maioria reportadas pela Joanna e pela Ewa.
- Sessões a partir das 22:00 — eram invisíveis na grelha semanal, agora aparecem até ao final do dia
- Todas as horas na grelha de vagas recorrentes (SCRUM-874, Joanna)
- Sessão cancelada dentro do prazo — não aparece como “Não paga” (SCRUM-918, Joanna)
- Etiqueta de recorrência junto à vaga recorrente (SCRUM-919, Joanna) — vê “semanal”, “quinzenal” junto a cada sessão repetida
- Ocultação da integração com o Zoom da interface (SCRUM-789, Joanna) — o Zoom já não é suportado como canal de vídeo
- Popover da sessão no calendário — já não fica escondido fora do ecrã
- TherapistAvailability — guardar automático a cada alteração (debounce de 800 ms), sem necessidade de botão de guardar
- AddSessionModal — opção “criar sessão fora do horário de disponibilidade” — as exceções podem forçar uma vaga
- Estado “Faltou” (No-show) (NoShow=5) — novo estado, configurável mesmo a partir de sessões concluídas ou canceladas
- RecurringSessionsCalendar — blocos de resumo acima da legenda e da grelha
As localizações do terapeuta ganharam canais de reunião online por localização:
- Modo presencial — campos de morada e cidade para localizações presenciais
- Comutador presencial/online em vez de uma caixa de verificação — escolha de modo mais clara
- Canal online por localização — localizações diferentes podem ter canais diferentes (AITS, Google Meet, link externo), propagado automaticamente para as sessões
- Salas de reunião permanentes por paciente — cada paciente tem um link de sala AITS permanente e um link externo separado visível nas definições do paciente
- Eliminação de localização — corrigida (estava a desaparecer da base de dados mas a permanecer na lista da interface)
E, por fim, o tipo de reunião nas sessões recorrentes — corrigida a propagação de MeetingType e MeetingLink da configuração da série recorrente para cada sessão gerada e para os e-mails de lembrete (SCRUM-902, Ewa).
10. 📱 Aplicação móvel — tema escuro, Caixa de Entrada AdHoc, polimento
A aplicação móvel passou para a versão 1.5.0 (build 18) com uma série de alterações visíveis para o utilizador e alguns ajustes de assinatura para a App Store / Play Store.
- Tema escuro — modo escuro completo com cabeçalhos de grupo legíveis (SCRUM-1089, Ewa + SCRUM-815)
- Lembretes configuráveis — escolha quando quer receber uma notificação de sessão
- Lembrete móvel de 15 min — lembrete 15 minutos antes da sessão + aviso quando as notificações do sistema estão desativadas (SCRUM-815, Bohdan)
- Estado vazio para a lista de sessões — em vez de um ecrã em branco, um onboarding mais rico (SCRUM-1094, Ewa)
- Faixa de atualização automática — quando a aplicação deteta uma atualização, mostra uma faixa convidativa para atualizar
- Caixa de Entrada AdHoc + AssignPatient + início rápido no MAUI (SCRUM-1289, Bohdan)
- Início rápido PWA móvel para sessões ad-hoc (SCRUM-1286, Bohdan)
- Vista web responsiva para telemóvel — o desktop mantém-se inalterado, no telemóvel a disposição adapta-se ao ecrã estreito
- Manipulador de deep-link no iOS — usa BindingContext, registo de esquema de URL
- Strings de finalidade de localização iOS (NSLocation) — a corrigir o ITMS-90683 (a App Store rejeitava a compilação sem isto)
- Android AAB — passo explícito de jarsigner
- Materiais para o App Store Connect e o Google Play — pacote completo mais auditoria WCAG 2.2
11. 🔐 Segurança: SOC 2 / HIPAA, MFA, pseudonimização total pela IA
Nos bastidores, fizemos um reforço completo de segurança SOC 2 e HIPAA mais uma auditoria DDD com cinco entregas concretas.
- Reverificação MFA para operações críticas — para ações sensíveis (mudança de palavra-passe, exportação de dados) reconfirma-se com MFA
- Códigos de recurso para o MFA — códigos de emergência caso perca o telemóvel
- IAnonymizedLlmGateway (SCRUM-1353, Bohdan) — todas as chamadas a modelos de IA passam agora por um gateway pseudonimizador. Nomes, datas e locais são substituídos por pseudónimos antes de saírem da aplicação; a IA recebe apenas a versão anonimizada
- Pseudonimização das notificações por e-mail/SMS (SCRUM-1354) — os modelos de mensagem também não expõem dados do paciente ao serem enviados
- Tokens OAuth Google/Zoom encriptados com Always Encrypted (SCRUM-1355) — os tokens de acesso das integrações são encriptados ao nível da coluna
- Sinalizador Patient.PendingConsent (SCRUM-1356) — os pacientes sem consentimento ativo recebem um fluxo de exigência + emblema no frontend
- Máquina de estados da fatura (SCRUM-1357) — os estados das faturas são imutáveis em direções inválidas, aplicado ao nível da base de dados
- Imutabilidade da auditoria + instantâneo do utilizador em 3 tabelas de auditoria — o registo de ações não pode ser modificado a posteriori
- DeanonymizationAuditLog — cada uso de dados do paciente após a desanonimização é registado juntamente com o instantâneo de e-mail + nome de apresentação do utilizador que o efetuou
- Remoção de segredos codificados — todas as chaves e palavras-passe do appsettings.json foram movidas para o Azure Key Vault
- Always Encrypted para todos os dados de texto do utilizador (ADR-0018) — direção arquitetural aprovada; mais tabelas migram no próximo lançamento
- Análise de lacunas de conformidade ISO/IEC — 95 lacunas mapeadas em 9 normas, com um plano de remediação
Apoiado por uma auditoria DDD completa (Sessões 1-8, Fases 1-6) — reestruturação de contextos de domínio, documentação arquitetural, ADRs, mermaid + testes, manuais de procedimentos, integração com o Confluence.
12. 👤 Portal do paciente — análises em Objetivos, materiais, melhor pré-visualização
- Conceptualização de Beck no separador “Objetivos” do paciente — quando publica a conceptualização, o paciente vê-a no seu portal
- Publicação de análises no portal do paciente + preferências de notificação (SCRUM-1338, Bartlomiej) — controle o quê e quando o paciente recebe
- Pré-visualização de PDF no portal —
iframeem vez deembed, o CSP permiteblob:(os PDFs carregam) - Pré-visualização do portal do paciente a partir da vista do terapeuta — veja o que o paciente vê (moldura no invólucro, painel 1:1)
- Materiais da sessão no Azure Blob Storage — SessionMaterial como blob, sem mais sistema de ficheiros local
- Secção de consentimento / documentos + origem do registo nas definições do paciente
- Unicidade global do e-mail do paciente (SCRUM-898) — um segundo paciente com o mesmo e-mail recebe um 409 e o modal fecha-se (SCRUM-898, Ewa)
- Semeador de modelos de notificação para SK, CA, RU, UK, LT (SCRUM-883, Joanna) — envio de e-mails multilingue completo
- Recurso predefinido da plataforma para o resolver — quando um terapeuta não substituiu o modelo, é enviado o modelo multilingue predefinido (SCRUM-883)
13. 🎙️ Transcrição — gravação fiável, acrescentar, tempo real com diarização
- Acrescentar a uma transcrição existente — continue a gravar na mesma sessão; os segmentos são acrescentados (a intenção sobrevive a uma atualização da página)
- Áudio por participante para a diarização — a transcrição de vídeo separa os falantes em faixas independentes
- A transcrição sobrevive ao PiP — minimizar a sala não interrompe a gravação
- Idioma da transcrição a partir das definições da sessão — o STT usa o idioma que definiu para o paciente
- Atualização automática da transcrição ao ganhar foco / visibilitychange / regresso do vídeo
- Confirmação ao parar a gravação < 2s — proteção contra um WAV vazio por um clique acidental
- Distintivo “A enviar” na lista de sessões — vê quando uma gravação está em envio
- Tempo real com diarização na sessão de vídeo — não estava a iniciar antes; agora funciona
- Cópia de segurança OPFS + Opus a 48 kbps — a gravação também guarda localmente em OPFS como reserva, parâmetros de áudio unificados
- Envio direto de áudio via SAS (SCRUM-1276, Bohdan) — o áudio vai diretamente para o Azure via URL SAS, contornando o backend
- m4a nativo para o Azure Speech — m4a tratado nativamente, sem conversão
- Deteção de formato por bytes mágicos (SCRUM-1311, Bohdan) — quando o Content-Type=
application/octet-stream, o formato é detetado a partir do conteúdo do ficheiro - Hub sem texto na base de dados — o hub SignalR em tempo real já não persiste texto na base de dados; o finishPending usa um POST multipart como o MAUI
- Correção do erro 1006 do SignalR — removido o skipNegotiation para que o Azure SignalR funcione + ajuste do keep-alive
- Marcador [IA] desde a primeira geração + pesquisa fiável do marcador
14. 💬 Notificações, definições do paciente, pequenos ajustes de UX
- NotificationTemplatesAdmin — alternância HTML/Texto no editor de e-mail
- NotificationSettings — a pré-visualização do e-mail renderiza HTML com um recurso alternativo
- PromptEditModal — reconstruído: separadores, seletor de modelo, nomes de versão obrigatórios
- Reposição do sinalizador Hide_dev_ui ao terminar sessão — os sinalizadores de desenvolvimento não persistem entre sessões
- Paciente de teste Ann Fauler — equivalente inglês 1:1 da polaca Anna Pełnialska para demonstrações apenas em inglês
- Alternância do modo de apresentação na interface de desenvolvimento — mudança rápida para o modo de apresentação
- Relatório de erros — anexos do Jira + etiqueta do autor do relatório + botão “Submeter” centrado
- Ciclo de reautenticação corrigido — abortar pedidos e voltar ao ecrã de login em caso de 401
- Faixa “O servidor está a iniciar” — no arranque a frio (escala a zero) mostramos um aviso em vez de uma página em branco
- Escala de avaliação da sessão — autorreflexão em vez de avaliação de qualidade + aviso legal (SCRUM-1005, Joanna)
- Cor do botão “Minimizar” alterada para violeta cobalto (SCRUM-1307, Ewa)
- Cor da etiqueta “Transcrição” alterada de vermelho para verde (SCRUM-1304, Ewa)
- “Gravar agora” → “Gravar sessão AdHoc” — nome de botão mais preciso
- Sandbox com faixa verde no canto superior esquerdo + prefixo
[SANDBOX]no título — para evitar confusão de ambientes, mais um clone repetível PROD → Sandbox (Azure IaC + scripts)
✅ Lista de verificação de QA — o que confirmar após o deploy
| Funcionalidade | Verificar |
|---|---|
| Sessão ad-hoc — Gravação Rápida | Clique em Gravação Rápida no painel ou na PWA — a gravação começa imediatamente, a sessão cai na Caixa de Entrada AdHoc |
| AssignPatient na Caixa de Entrada AdHoc | Abra uma gravação ad-hoc — pode atribuí-la a um paciente existente ou criar um novo |
| Limite de pacote | O painel mostra o contador de sessões do mês atual e quantas restam no pacote |
| Período de tolerância após falha de pagamento | Simulador de subscrição no PromptyAI — force uma falha de pagamento, obtém acesso apenas à conta durante 14 dias |
| Fusão a três vias das notas | Nos detalhes da sessão, o campo Notas mostra três fontes lado a lado (terapeuta / IA / transcrição); pode escolher o que manter |
| 9 análises de TCC | O separador de análises de TCC mostra 9 itens separados; cada um gerado a pedido; cada um com um ícone de edição do prompt |
| Perfil público — painéis | Abra o seu próprio perfil público autenticado — os painéis de edição de biografia, especialização e contacto estão visíveis |
| PiP no vídeo | Durante uma sessão de vídeo clique em minimizar — a janela reduz-se a mini-leitor, o microfone continua a funcionar, regressa sem sala de espera |
| Desfoque de fundo | Na sala de espera de vídeo ative o desfoque de fundo — funciona imediatamente, sem erros de CSP |
| PDF da conceptualização Beck | Gere o PDF da conceptualização — também aparece nos materiais da sessão |
| Alternância ABC v1/v2 | Em conceptualização v2 pode alternar a origem do ABC entre a versão 1 e a 2 |
| Fatura a partir de pagamentos selecionados | Selecione alguns pagamentos e clique em “Emitir fatura” — é produzida uma única fatura a partir do instantâneo |
| Sessão recorrente com Google Meet | A segunda e a terceira sessão da série têm o Google Meet corretamente configurado e o e-mail contém o link correto |
| Sessões a partir das 22:00 | O calendário semanal mostra sessões marcadas às 22:00 e mais tarde |
| Estado “Faltou” | Numa sessão concluída / cancelada pode mudar o estado para “Faltou” |
| Tema escuro no móvel | Na aplicação móvel mude para o tema escuro — os cabeçalhos de grupo são legíveis |
| Caixa de Entrada AdHoc no móvel | O móvel mostra a caixa de entrada ad-hoc e permite atribuir um paciente |
| Reverificação MFA | Ao mudar a palavra-passe, a aplicação pede novamente o MFA |
| Pseudonimização pela IA | Nos registos vê os dados do paciente a chegar à IA como pseudónimos |
| Materiais da sessão como blob | Carregue um ficheiro nos materiais da sessão — cai no Azure Blob Storage, não no disco local |
| Unicidade global do e-mail do paciente | Adicione um segundo paciente com o mesmo e-mail — obtém um 409 e o modal fecha-se |
| Faixa “O servidor está a iniciar” | Após um período mais longo de inatividade, a entrada na aplicação mostra a faixa em vez de uma página em branco |
🛠️ O que corrigimos — letra miúda
Além das grandes funcionalidades, foram resolvidos cerca de 80 relatórios de testers e utilizadores. Destaques:
- A sobreposição PiP não era clicável — corrigido
- Fecho obsoleto (stale closure) em handleMaximize — maximizar o PiP já não gera erro
- O PiP mantém a ligação — anteriormente
room.disconnect()disparava na transição fullscreen↔PiP - O botão “Entrar na sessão” estava escondido por uma substituição de CSS — revelado
- Segunda sessão AITS para o mesmo paciente (SCRUM-1319, Ewa) — remover o UNIQUE INDEX em
Session.VideoInviteToken - A numeração de sessões na conceptualização ignora as canceladas (SCRUM-1267, Bohdan)
- Acesso seguro (null-safe) ao Payment em GetSessionDetailsAsync (SCRUM-1268, Bohdan)
- Colisão de sessão de teste da Anna Pełnialska com o Jan às 14:00 — corrigido no seeder
- Lentidão no painel — mapeamento null-safe em GetTodaySessionsAsync e GetSessionDetailsAsync
- Atualização automática após o fim da gravação a partir do microfone — funciona
- O recurso alternativo em lote (batch fallback) não sobrescreve o texto de gravações anteriores nem bloqueia a interface com o estado “A processar”
- Idioma da transcrição a partir das definições da sessão — o STT respeita a preferência do paciente
- CSP — a permitir
*.clarity.ms,blob:em connect-src, análises em script-src - Ciclo de reautenticação — a abortar pedidos após 401 e a voltar ao login
- CSP MediaPipe WASM — o desfoque de fundo funciona
- Faixa DEV/SANDBOX também no FQDN do Azure, não apenas no domínio personalizado
- Toast falso “Falha na transcrição” ao entrar na sessão — removido
- Toast em vez de faixa vermelha em caso de falha na transcrição + botão “Reamostrar” removido
- Tempo real com diarização na sessão de vídeo — inicia corretamente
- Streaming de IA — AbortController por manipulador em vez de partilhado (
BodyStreamBuffer was aborted) - Nginx não-root + Azure Container Apps — várias iterações até funcionar
- Bloqueio distribuído (sp_getapplock) — as migrações de arranque já não entram em conflito em deploys paralelos
- DbUpdateConcurrencyException no poller de transcrição em lote (SCRUM-1313, Bohdan)
- BlobNotFound como estado esperado (SCRUM-1314, Bohdan)
- Payloads não-JSON no webhook do Stripe (scanners / bots) — tratados silenciosamente (SCRUM-1315, Bohdan)
- Deteção de formato de áudio por bytes mágicos (SCRUM-1311, Bohdan)
- Envio de áudio resiliente + Content-Type defensivo (SCRUM-1293, Bohdan)
- Migração de FK ActiveEmbeddingModelId → ON DELETE NO ACTION
- Deploy do cliente de dev — CACHE_BUST=
github.shaforça a reconstrução do frontend
Este é o lançamento maior e mais denso desta primavera. Se uma funcionalidade lhe parecer familiar — é porque foi o seu pedido ou o seu ticket. Obrigado por cada relatório e por cada captura de ecrã.
Artigo preparado pela equipa da Therapy Support