Releases: mouradjnet/guardkids-wp
Release list
v1.41.0 — Academy Onda 5 (Insights de IA)
Academy — Onda 5: Insights de IA para o responsável
Fecha o ciclo do Academy: ensinar → praticar → testar → agir sobre o próprio dado. Um card Insights com IA na tela de Relatórios lê o uso real da família (as mesmas agregações do ReportsController) e devolve, em linguagem natural, o que mudou e o que fazer.
Destaques
- IA só no servidor (
includes/AI/AnthropicClient.php, moldeGeocoder), chave fora do bundle (GUARDKIDS_ANTHROPIC_KEYno wp-config, fallback option). - Privacidade: só dado agregado e pseudonimizado ("Criança 1"), zero endereço; nome real nunca entra no prompt.
- Custo controlado: resultado cacheado por hash do dado — reabrir a tela não re-chama a IA;
Atualizarforça regenerar (rate-limited). - Pro-gated (
ai_insights) com degradação leniente (travado/sem chave/erro → sem 500). - Modelo
claude-opus-4-8.
Técnico
- Sem migration (DB fica 27).
- Endpoints
GET /insightsePOST /insights/refresh. - Testes: PHPUnit 677 · vitest (app-parent) 448 · build/tsc ok. Guards falsificados: vazamento de PII no prompt, chamada da IA no Free / no cache hit.
Deploy (para acender em produção)
- Definir
GUARDKIDS_ANTHROPIC_KEYnowp-config.php. - Reemitir a licença Pro incluindo
ai_insights(issuerscripts/issue-license.phpjá sincronizado).
Validado em produção end-to-end (API + UI no browser com IA real).
🤖 Generated with Claude Code
v1.40.0 — Academy Onda 4
Academy Onda 4 — avaliações (quiz) por aula
Cada aula agora termina num quiz de 3 questões; acertar todas conclui a aula e libera os 25 XP/15 coins. Errar mostra "Quase! Você acertou X de Y" sem creditar.
Segurança: servidor é dono do gabarito (AcademyQuiz); o /complete da Onda 3 foi removido (não há mais caminho pra XP sem quiz). Sem migration (DB 27).
Deployado e smokado em prod (guardiaokids.site): API (reprovar não credita, aprovar credita 1x, /complete→404, chave inválida→400) e UI (reprovar→"tentar de novo" → corrigir → celebração +25 XP) validadas ponta a ponta. PR #113.
v1.39.0 — Academy Onda 3
Academy Onda 3 — Academia da criança (trilhas que rendem XP)
Área Academia dentro do app da criança (app-child): 2 trilhas × 4 aulas em linguagem infantil onde concluir uma aula rende 25 XP + 15 moedas pela gamificação existente (reusa ProgressionRepository, preservando o streak). Complementa o Academy do responsável (Ondas 1–2).
Segurança: servidor é dono do valor do XP e do allowlist de aulas — chave forjada dá 400, sem farm. Idempotência por ledger UNIQUE (child_id, lesson_key).
Migração: 027 cria academy_child_lessons · DB 26 → 27 (roda no on_init).
Gate: PHPUnit 648 · vitest 150 · integração (CI) · build. Deployado e smokado em prod (guardiaokids.site): API (idempotência + chave inválida) e UI (Concluí! → celebração +25 XP) validadas ponta a ponta.
PR #112.
v1.36.16 — Toggle de notificações mostra o estado do aparelho
Correção
O toggle de notificações mentia. Ele mostrava a configuração notifications.push, que é da família e fica no banco — então aparecia ligado num aparelho que nunca concedeu permissão. Em teste real foi exatamente o que aconteceu: o toggle azul, e nenhuma notificação chegando.
Push é por dispositivo. Agora quem manda é a assinatura local:
- O toggle reflete este aparelho (
hasDeviceSubscription()— registro do service worker + assinatura, sem efeito colateral de registrar nada). - Quando o banco diz ligado mas este aparelho não assinou, a descrição explica: "Ativado em outro aparelho. Ligue aqui para receber neste também — a permissão vale por aparelho." Sem isso, quem ativou no celular abriria no computador, veria desligado e acharia que o app perdeu a configuração.
- Mesmo defeito no app do filho: o card "Ativar avisos" sumia quando a permissão estava concedida, mesmo sem assinatura nenhuma — a criança ficava sem caminho para ativar (em produção a tabela de assinaturas do filho estava vazia). Agora ele só some quando existe assinatura de verdade naquele aparelho.
Técnico
- Sem migration (DB v25 mantida). Só frontend.
- Gate verde: app-parent 380, app-child 137, tsc limpo.
- O teste antigo
não renderiza se permissão já concedidaconsagrava o bug e foi substituído. Os dois toggles novos foram provados por falsificação.
Instale via wp-admin → Plugins → Adicionar novo → Enviar plugin, usando o zip anexado.
v1.36.15 — Card de aviso na tela, sem depender de push
Novidades
A notificação agora chega como um card dentro do app — não depende mais de o aparelho ter concedido permissão de notificação.
- Painel dos pais: quando o filho faz um pedido, aparece um card sobre a tela — " fez um pedido" + o que foi pedido, com botão que leva direto a Aprovações. Funciona em qualquer página do painel.
- App do filho: quando o pai decide, aparece "Seu pedido foi aprovado! 🎉" ou "Seu pedido não foi aprovado", com botão para a tela de Pedidos.
- O card some sozinho em 15s ou no X.
Por que isso era necessário
A notificação do sistema só existe se o Web Push estiver ativo, e o push depende de permissão concedida naquele aparelho específico. Em teste real com pai e filho em aparelhos diferentes, nenhum dos dois tinha permissão — o pedido chegava, aparecia na lista de Aprovações, e nada avisava ninguém.
O card observa a lista que a tela já busca: o push invalida em ~2s quando existe, senão o refetch de 60s (v1.36.14) traz. Sem permissão nenhuma envolvida.
Detalhes de comportamento
- A primeira carga nunca alerta: pedido que já estava lá não é novidade, senão todo F5 encheria a tela de cards velhos.
- No app do filho o gatilho é a transição pendente → decidido, pelo mesmo motivo.
Técnico
- Sem migration (DB v25 mantida). Só frontend.
- Gate verde: app-parent 378, app-child 135, tsc limpo. Detectores cobertos por teste e provados por falsificação.
Instale via wp-admin → Plugins → Adicionar novo → Enviar plugin, usando o zip anexado.
v1.36.14 — Status Online e pedidos atualizam sem F5, mesmo sem push
Correções
Teste real com pai e filho em aparelhos diferentes expôs dois sintomas com a mesma raiz: a tela do painel nunca refazia a consulta.
- Status "Online" do filho ficava travado em offline. Ele deriva do heartbeat que o app do filho manda 1x/min, mas a lista de filhos não tinha refetch: o filho conectava e o painel seguia dizendo offline indefinidamente. Push não resolve isso — heartbeat não gera push, e gerar um por minuto seria absurdo. Agora atualiza a cada 30s.
- Pedido do filho parecia não chegar ao painel. O push entrega em ~2s, mas só existe se aquele aparelho tiver notificações ativadas. Sem isso, nada avisava a tela — o pedido estava no banco o tempo todo. Refetch de 60s como rede de segurança em Aprovações, PendingRequests, SideNav (badge) e Dashboard.
- Mesmo buraco no app do filho: sem push no aparelho da criança, a resposta do pai nunca aparecia. Refetch de 60s em Pedidos e Alertas.
O Web Push (v1.36.13) segue sendo o caminho rápido; isto é o piso para quando ele não existe.
Técnico
- Sem migration (DB v25 mantida). Só frontend.
- Gate verde: app-parent 375, app-child 131, tsc limpo nos dois.
Instale via wp-admin → Plugins → Adicionar novo → Enviar plugin, usando o zip anexado.
v1.36.13 — Tela atualiza sozinha ao chegar push, sem F5
Novidades
- Pedidos aparecem na hora, sem recarregar a página. O Web Push já avisava os dois lados (filho cria pedido → guardião; guardião decide → filho), mas só entregava a notificação: com o app aberto, Aprovações (painel dos pais) e Pedidos/Alertas (app do filho) seguiam mostrando o dado velho até alguém dar F5.
- Agora cada service worker, ao receber o push, avisa as abas abertas do próprio painel (
client.postMessage, filtrando por URL como onotificationclickjá fazia) e o novo hookusePushRefreshrecarrega as listas correspondentes — incluindo o contador de não-lidas do menu do filho.
Técnico
- Sem migration (DB v25 mantida). Nenhuma mudança no backend: o payload atual (
title/body/url) já bastava. - Sem
refetchInterval: nada de consultar o servidor o dia todo para descobrir o que o push já contou.invalidateQueriessó refaz fetch do que está montado — página fechada apenas fica marcada como velha e recarrega ao abrir. - Gate verde: PHPUnit 599, app-parent 375, app-child 131.
Limitação conhecida
Isso pega carona no Web Push: em dispositivo onde as notificações não foram ativadas, nada chega e a tela continua exigindo F5. O push também exige contexto seguro (HTTPS ou localhost).
Instale via wp-admin → Plugins → Adicionar novo → Enviar plugin, usando o zip anexado.
v1.36.10 — Checklist de onboarding + preço R$ 29,90
Novidades
- Checklist de primeiro acesso no topo do Dashboard (OnboardingChecklist), guiando o pai/mãe nos primeiros passos (parear filho, definir regras etc.), apoiado por
Child.paired/pairedChildIds/valuesByPrefix. - Preço Premium ajustado de R$ 19 para R$ 29,90/mês.
- Ampliação da cobertura de testes nos dois apps (parent/child) e no PHP.
Técnico
- Sem migration (DB v25 mantida).
- Gate verde: PHPUnit 598, app-parent 367, app-child 128.
Instale via wp-admin → Plugins → Adicionar novo → Enviar plugin, usando o zip anexado.
v1.36.9 — Erros visíveis nas ações mudas (Lote 2)
Fecha a frente de ações que falhavam sem feedback. Sem migration, deploy idempotente.
- Settings: remover o PIN de segurança agora mostra erro na falha.
- Recompensas: criar recompensa e ativar/desativar agora mostram erro.
Verificação por-mutation confirmou que ContentDashboard e Limites de Tempo já estavam cobertos. Cada correção com teste do caminho de erro. app-pais 343/343.
v1.36.8 — Erros visíveis nas ações que falhavam mudas (Lote 1)
Melhoria de UX: 10 ações que antes falhavam sem nenhum feedback (o botão não fazia nada no erro) agora mostram o erro na tela (role="alert"). Sem migration, deploy idempotente.
Ações cobertas
Tier A (destrutivas / laço central): excluir zona · revogar Companion · aprovar/negar pedido · resgatar recompensa (app-filho).
Tier B (writes de controle): pausar/retomar filho · salvar bloqueio de apps · add/remover/reordenar recomendação · equipar avatar (app-filho).
Sob o capô
- Padrão existente reaproveitado:
MutationError(app-pais) /FormError(app-filho, extraído pra componente compartilhado). - Cada correção tem teste do caminho de erro, provado por falsificação.
- app-pais 340/340, app-filho 115/115, tsc limpo.