Skip to content

Releases: mouradjnet/guardkids-wp

v1.41.0 — Academy Onda 5 (Insights de IA)

Choose a tag to compare

@mouradjnet mouradjnet released this 09 Aug 22:47

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, molde Geocoder), chave fora do bundle (GUARDKIDS_ANTHROPIC_KEY no 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; Atualizar forç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 /insights e POST /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)

  1. Definir GUARDKIDS_ANTHROPIC_KEY no wp-config.php.
  2. Reemitir a licença Pro incluindo ai_insights (issuer scripts/issue-license.php já 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

Choose a tag to compare

@mouradjnet mouradjnet released this 09 Aug 13:59

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

Choose a tag to compare

@mouradjnet mouradjnet released this 09 Aug 13:08

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

Choose a tag to compare

@mouradjnet mouradjnet released this 23 Jul 13:18

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á concedida consagrava 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

Choose a tag to compare

@mouradjnet mouradjnet released this 23 Jul 12:55

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

Choose a tag to compare

@mouradjnet mouradjnet released this 23 Jul 12:29

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

Choose a tag to compare

@mouradjnet mouradjnet released this 23 Jul 11:38

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 o notificationclick já fazia) e o novo hook usePushRefresh recarrega 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. invalidateQueries só 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

Choose a tag to compare

@mouradjnet mouradjnet released this 19 Jul 12:55

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)

Choose a tag to compare

@mouradjnet mouradjnet released this 18 Jul 21:39

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)

Choose a tag to compare

@mouradjnet mouradjnet released this 18 Jul 20:34

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.