Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
544 commits
Select commit Hold shift + click to select a range
73c42db
feat(auth): endpoints do staff recebem o código de ativação (#48)
hbgit Oct 7, 2026
c13ef6f
feat(ops): CLI que emite o código de ativação do staff (#48)
hbgit Oct 7, 2026
2ed7650
feat(admin): tela de ativação pede o código de uso único (#48)
hbgit Oct 7, 2026
b04052d
test(e2e): login do staff com código de ativação (#48)
hbgit Oct 7, 2026
ef0ed23
docs: ativação do TOTP do staff com código de uso único (#48)
hbgit Oct 7, 2026
2668c1f
docs(admin): captura da etapa do código de ativação (#48)
hbgit Oct 7, 2026
6d41c85
docs(admin): etapa do código de ativação em telas-admin e PROGRESS (#48)
hbgit Oct 7, 2026
11c85d7
feat(db): modelos de resposta do admin e ubsId do staff (#40)
hbgit Oct 7, 2026
405f5e9
feat(admin): rótulos minimizados de paciente e usuário (#40)
hbgit Oct 7, 2026
a323f23
feat(admin): store de leitura com escopo, paginação e TMRAV (#40)
hbgit Oct 7, 2026
c3ce4fc
feat(admin): endpoint admin somente leitura com papel, escopo e audit…
hbgit Oct 7, 2026
33a0af5
feat(admin): painel lê do backend real; TMRAV nulo vira traço (#40)
hbgit Oct 7, 2026
b54bd73
test(e2e): painel do admin com dados reais no emulador (#40)
hbgit Oct 7, 2026
71086e3
docs: endpoints do backoffice e painel com dados reais (#40)
hbgit Oct 7, 2026
f72b944
docs: corrige a ressalva sobre falha de leitura do painel (#40)
hbgit Oct 7, 2026
76e9915
fix(admin): microárea com mais de um ACS aparece uma vez (#40)
hbgit Oct 7, 2026
0de5761
docs(admin): recaptura as telas 02-05 com dados do backend (#40)
hbgit Oct 7, 2026
3675096
Merge pull request #50 from hbgit/fix/staff-totp-activation-48
hbgit Oct 8, 2026
112a0d9
Merge pull request #51 from hbgit/feat/admin-endpoints-40
hbgit Oct 8, 2026
06f6313
feat(admin): mostra a falha de leitura e volta ao login com token ven…
hbgit Oct 8, 2026
67729c0
test(e2e): admin no e2e.sh e cabeçalho do admin_login_e2e sem o mock …
hbgit Oct 8, 2026
cedb497
docs: admin sobre o sinalacs_client e prova no emulador (#41)
hbgit Oct 8, 2026
e99a749
fix(admin): falha de rede embrulhada e token recusado após o vencimen…
hbgit Oct 8, 2026
aec6b94
docs: achados da revisão da #41 e pendências
hbgit Oct 8, 2026
fe24016
docs: plano da #41
hbgit Oct 8, 2026
ca79d8b
Merge pull request #52 from hbgit/feat/admin-client-41
hbgit Oct 8, 2026
db6a756
Merge pull request #26 from hbgit/fix/ci-checks-obrigatorios-skip
hbgit Oct 8, 2026
79f304d
fix(lgpd): cifrar patients.emergencyContact em repouso (AES-256-GCM)
GuilhermeAlmeidadaLuz Oct 8, 2026
a5f23c2
fix(lgpd): ipHash de audit_logs via HMAC-SHA256 com chave rotativa di…
GuilhermeAlmeidadaLuz Oct 8, 2026
37ecab8
fix(lgpd): sanitizar logs de exceção (VAZ-01)
GuilhermeAlmeidadaLuz Oct 8, 2026
255ad44
feat(lgpd): rotina de expurgo LGPD-RF07 (FutureCall diário, DELETE fí…
GuilhermeAlmeidadaLuz Oct 8, 2026
014269a
docs(lgpd): auditoria e plano de ação atualizados
GuilhermeAlmeidadaLuz Oct 8, 2026
f298b52
Merge remote-tracking branch 'origin/develop' into fix/lgpd-conformid…
GuilhermeAlmeidadaLuz Oct 8, 2026
3f809a8
chore: regenerar migração de patients.emergencyContact sobre a develop
GuilhermeAlmeidadaLuz Oct 8, 2026
10a42f3
fix(test): adaptar testes do admin ao emergencyContact cifrado
GuilhermeAlmeidadaLuz Oct 8, 2026
723c830
docs: plano da #42
hbgit Oct 8, 2026
3462441
docs: linha de base da #42
hbgit Oct 8, 2026
1c8a654
feat(lgpd): estado 'em análise' e colunas de decisão em data_subject_…
hbgit Oct 8, 2026
aa88f12
feat(lgpd): serviço de atendimento de pedidos do titular (#42)
hbgit Oct 8, 2026
b6b111e
feat(lgpd): store do atendimento e anonimização transacional (#42)
hbgit Oct 8, 2026
ba2cd81
fix(lgpd): anonimização completa e push barrado após exclusão (#42)
hbgit Oct 8, 2026
b1382e0
feat(lgpd): endpoints do backoffice para pedidos do titular e respost…
hbgit Oct 8, 2026
e53ab6a
fix(lgpd): conta anonimizada não regrava condições crônicas nem respo…
hbgit Oct 8, 2026
7151122
feat(lgpd): aviso push ao titular quando o pedido é decidido (#42)
hbgit Oct 8, 2026
dce4be8
feat(admin): tela de pedidos do titular com prazo e decisão (#42)
hbgit Oct 8, 2026
a363f9d
docs: plano da #43 (gestão de ACS e reset de MFA)
hbgit Oct 9, 2026
25148d2
refactor(admin): extrai o escopo do backoffice para AdminScopeResolve…
hbgit Oct 9, 2026
ee001f9
feat(admin): lista ACS e equipe do backoffice por escopo de UBS (#43)
hbgit Oct 9, 2026
acd8de4
feat(admin): cadastro de ACS com senha inicial gerada e mostrada uma …
hbgit Oct 9, 2026
6212bd2
feat(admin): vincula e move ACS entre microáreas com escopo de UBS (#43)
hbgit Oct 9, 2026
14483a9
feat(admin): ativa/desativa ACS revogando refresh token e envio difer…
hbgit Oct 9, 2026
74cea95
feat(admin): redefine senha e MFA do ACS com trilha e desbloqueio (#43)
hbgit Oct 9, 2026
b6b307c
feat(admin): redefinição de MFA do staff com código de ativação emiti…
hbgit Oct 9, 2026
ff7b942
fix(admin): compara a própria conta por id canônico no reset de MFA d…
hbgit Oct 9, 2026
35fc9fe
feat(admin): auditoria escopada à UBS para o coordenador (#43)
hbgit Oct 9, 2026
c42fd0d
feat(admin-app): camada de dados da gestão de contas do backoffice (#43)
hbgit Oct 9, 2026
79f8711
feat(admin-app): gestão de ACS e equipe na tela Microáreas, com confi…
hbgit Oct 9, 2026
aff0f47
test(admin-app): alvos de toque e contraste da gestão de contas (#43)
hbgit Oct 9, 2026
f6def51
test(admin-app): confere também a altura PINTADA dos botões da gestão…
hbgit Oct 9, 2026
7cb46a5
test(qa): e2e da gestão de ACS no emulador contra o backend real (#43)
hbgit Oct 9, 2026
45d64d5
docs: fecha a #43 no PROGRESS e nos CLAUDE.md
hbgit Oct 9, 2026
b680fc6
fix: aplica a onda de correções do review final da #43
hbgit Oct 9, 2026
5073f1d
fix(test): escopo de sistema do teste de contas imune aos fixtures de…
hbgit Oct 9, 2026
c1aa101
Merge pull request #54 from hbgit/feat/issue-43-gestao-de-acs-e-mfa
hbgit Oct 9, 2026
5bf686d
feat(patient): mostra análise e resposta do pedido do titular (#42)
hbgit Oct 9, 2026
e172217
test(admin): prova no emulador do atendimento a pedidos do titular (#42)
hbgit Oct 9, 2026
f8285d6
docs: atendimento dos pedidos do titular (#42)
hbgit Oct 9, 2026
715c58b
Merge origin/develop em feat/admin-pedidos-titular-42
hbgit Oct 9, 2026
08c0356
Merge pull request #55 from hbgit/feat/admin-pedidos-titular-42
hbgit Oct 9, 2026
36a8d3c
Merge branch 'develop' into fix/lgpd-conformidade-dados
hbgit Oct 9, 2026
4cc1a76
fix(db): regenera a migração do emergencyContact cifrado sobre a últi…
hbgit Oct 11, 2026
112fceb
fix(lgpd): anonimização do titular zera emergencyContactEncrypted (co…
hbgit Oct 11, 2026
1090112
Merge pull request #53 from hbgit/fix/lgpd-conformidade-dados
hbgit Oct 11, 2026
be08ec4
merge: develop em docs/slide-showcase
hbgit Oct 11, 2026
22f4ede
chore(docs): remover arquivo de lock do LibreOffice e .flutter-plugin…
hbgit Oct 11, 2026
89624f2
Merge pull request #35 from hbgit/docs/slide-showcase
hbgit Oct 11, 2026
1ed6286
docs(plano): issue #44 — escalonar alertas e tempo quase real no admin
hbgit Oct 12, 2026
06430d6
feat(alertas): prazo de escalonamento configurável (#44)
hbgit Oct 12, 2026
a9fc6d7
feat(alertas): colunas de escalonamento em alerts (#44)
hbgit Oct 12, 2026
6e0e621
test(alertas): inventário das rotas de descarte de alerta vermelho (#44)
hbgit Oct 12, 2026
da4fbe9
test(alertas): endurece a varredura de escritores de alerts (#44)
hbgit Oct 12, 2026
50f0f0c
fix(alertas): ACK e expurgo não descartam vermelho sem registro (#44)
hbgit Oct 12, 2026
82d29d2
test(alertas): ACK fail-closed e cadeia de auditoria verificada (#44)
hbgit Oct 12, 2026
7d58d6f
feat(alertas): serviço de escalonamento auditado e idempotente (#44)
hbgit Oct 12, 2026
a461f5d
feat(alertas): store ORM do escalonamento com lock por linha (#44)
hbgit Oct 12, 2026
019a8ca
feat(alertas): admin.escalateAlert (#44)
hbgit Oct 12, 2026
a237d49
docs(plano): adendo Task 7b — app do ACS exibe o reforço do escalonam…
hbgit Oct 12, 2026
2ca0565
feat(admin): leitura expõe escalonamento e alerta vencido (#44)
hbgit Oct 12, 2026
e992d97
test(admin): pina o acordo entre overdue da leitura e o escalonamento…
hbgit Oct 12, 2026
51d86ad
feat(acs): app exibe o reforço de escalonamento do alerta (#44)
hbgit Oct 12, 2026
84320f7
test(acs): cobre o rótulo e a semântica do reforço no cartão (#44)
hbgit Oct 12, 2026
37fd940
docs(adr): tempo real do backoffice por polling (#44)
hbgit Oct 12, 2026
1e618b4
docs(adr): D5 com auditoria server-side e fim das linhas read por pol…
hbgit Oct 12, 2026
2eda8d6
feat(admin): alertsPulse e sessão de monitoramento (D5) (#44)
hbgit Oct 12, 2026
a7bc021
docs(adr): ADR reflete o alertsPulse implementado (#44)
hbgit Oct 12, 2026
99a1d21
feat(admin): fonte de dados com escalonamento, pulso e fim de sessão …
hbgit Oct 12, 2026
8339ae4
feat(admin): atualização automática por pulso e selo de dado desatual…
hbgit Oct 12, 2026
a2cb945
fix(admin): pulso sem pausa no inactive, recarga sem reler microáreas…
hbgit Oct 12, 2026
c8a3338
feat(admin): ação de escalonar alerta vermelho vencido (#44)
hbgit Oct 12, 2026
a75e645
test(e2e): fixtures do escalonamento e prazo de 30 s na stack de e2e …
hbgit Oct 12, 2026
589fc56
test(e2e): escalonamento e tempo real no emulador (#44)
hbgit Oct 12, 2026
b67f701
test(e2e): painel provado pelo pulso, corte de 120 s e tetos de leitu…
hbgit Oct 12, 2026
a7b3736
docs: escalonamento de alertas e monitoração do backoffice (#44)
hbgit Oct 12, 2026
d5dd289
feat(admin): vencidos primeiro na lista de alertas (#44)
hbgit Oct 12, 2026
f841e87
fix(alerts): ACK por MQTT auditado como acknowledged_mqtt (#44)
hbgit Oct 12, 2026
2435d7f
feat(admin): contador de vermelhos vencidos e filtro sem Escalonado (…
hbgit Oct 12, 2026
cd44d6b
test(e2e): contagem de read do pulso exclui recusas (#44)
hbgit Oct 12, 2026
788bb9d
docs: ajustes da revisão final do escalonamento (#44)
hbgit Oct 12, 2026
c9eb5bc
test(admin): asserção negativa do filtro enxerga cartões fora da dobr…
hbgit Oct 12, 2026
786c6f4
docs(progress): origem do ACK por deviceId é controlada pelo cliente …
hbgit Oct 12, 2026
5a844eb
test(e2e): queda de rede pausa o Traefik, não o backend (#44)
hbgit Oct 12, 2026
d6bf07f
docs: execução real do e2e da #44 e a queda pelo Traefik (#44)
hbgit Oct 12, 2026
8587072
docs: e2e da #44 passou de ponta a ponta no emulador (log e estado at…
hbgit Oct 12, 2026
dd28239
docs(progress): defeito do despachante MQTT acompanhado na issue #56
hbgit Oct 12, 2026
47c6740
docs(#56): plano de investigação e correção da queda do backend por s…
hbgit Oct 12, 2026
d186225
docs(#56): esqueleto do registro de evidências, linha de base e mapa …
hbgit Oct 12, 2026
432fd48
test(#56): broker MQTT falso sobre TCP real e sonda de processo
hbgit Oct 12, 2026
9c2a5ce
test(#56): cenário de processo congelado com conexão derrubada e regi…
hbgit Oct 12, 2026
0824207
test(#56): cenários A, B e C no Docker reproduzem a queda do backend …
hbgit Oct 12, 2026
cffce90
test(#56): sonda TLS com zona guardada e pilha do SocketException (H1…
hbgit Oct 12, 2026
c6b0c2c
fix(mqtt): erros assíncronos do socket viram queda de conexão tratada…
hbgit Oct 13, 2026
498d951
fix(mqtt): zona por cliente, nada de onFatal após close e reconexão q…
hbgit Oct 13, 2026
366614a
test(#56): re-execução dos cenários A, B e C no Docker com a correção…
hbgit Oct 13, 2026
6190c83
test(mqtt): logs do erro tratado não carregam identidade, local nem p…
hbgit Oct 13, 2026
f1f9b42
docs(lgpd): VAZ-01 com os pontos atuais de stderr do dispatcher e o r…
hbgit Oct 13, 2026
f190829
test(outbox): alerta vermelho gravado na queda do broker é entregue a…
hbgit Oct 13, 2026
1de0b48
docs(#56): H5 confirmada — outbox marca publicado sem PUBACK e a mens…
hbgit Oct 13, 2026
4523af1
feat(runtime): rede de proteção global para erros assíncronos sem don…
hbgit Oct 13, 2026
90f8b9e
test(qa): cenários B e C do broker com alerta vermelho real e pausa d…
hbgit Oct 13, 2026
03296a9
docs(#56): E2E da Tarefa 10b — B e A entregam após a reconexão; C per…
hbgit Oct 13, 2026
47fea05
fix(alertas): outbox só marca publicado após o PUBACK do broker (#56,…
hbgit Oct 13, 2026
2bd0fbb
docs(#56): Tarefa 9b — H5 corrigida no código; valor do timeout de PI…
hbgit Oct 13, 2026
97d2763
docs(#56): Tarefa 9b-v — cenário C com a correção no Docker/TLS; obse…
hbgit Oct 13, 2026
5415b19
fix(qa): assinante único e persistente no script de resiliência MQTT;…
hbgit Oct 13, 2026
5400565
chore(compose): reinício automático do backend após saída inesperada …
hbgit Oct 13, 2026
0e746e4
docs(#56): causa, decisões, evidências e riscos residuais
hbgit Oct 13, 2026
77fa089
docs(#56): marca como histórico os trechos da evidência já superados …
hbgit Oct 13, 2026
febfcb7
chore(#56): remove relatório de trabalho commitado por engano
hbgit Oct 13, 2026
9f12b29
Merge pull request #57 from hbgit/feat/issue-44-alertas-escalonar-tem…
hbgit Oct 13, 2026
0e3286d
docs(plano): trilha de auditoria administrativa completa (#45)
hbgit Oct 13, 2026
8d27472
docs(plano): linha de base da #45 (suites e audit_logs do e2e)
hbgit Oct 13, 2026
3ba5ed6
feat(auditoria): tabelas audit_exports e audit_chain_checkpoints e in…
hbgit Oct 13, 2026
3956af5
feat(auditoria): filtro, busca segura e keyset filtrado em admin.audi…
hbgit Oct 13, 2026
1aa9149
fix(auditoria): filtro aceita digitos e ':' em resourceType e result …
hbgit Oct 13, 2026
19d3141
test(auditoria): regressão de escopo e privacidade da consulta filtra…
hbgit Oct 13, 2026
6104701
feat(auditoria): selo por linha e verificacao da cadeia em lotes (#45)
hbgit Oct 13, 2026
91a084d
feat(auditoria): admin.verifyAuditChain com estado fechado e escopo p…
hbgit Oct 13, 2026
69a7339
feat(auditoria): checkpoint de cauda assinado na verificacao da cadei…
hbgit Oct 13, 2026
89490b8
feat(admin): consulta filtrada e integridade da trilha de auditoria (…
hbgit Oct 13, 2026
a18e78a
fix(admin): periodo com inicio e fim na consulta da auditoria (#45)
hbgit Oct 13, 2026
0ed812c
feat(auditoria): gerador puro do CSV de exportacao com defesa contra …
hbgit Oct 13, 2026
09a31b2
fix(auditoria): defesa de formula ignora espacos/TAB/CR/LF iniciais e…
hbgit Oct 13, 2026
f5645b9
feat(auditoria): exportacao auditada da trilha em CSV, so admin (#45)
hbgit Oct 13, 2026
3f2cb3a
fix(auditoria): chainState da exportacao vem de verificacao fresca (#45)
hbgit Oct 14, 2026
f1ba0d3
feat(admin): exportacao da trilha de auditoria em CSV na tela, so adm…
hbgit Oct 14, 2026
469d81c
fix(admin): exportacao da auditoria nao mistura filtros e avisa da ar…
hbgit Oct 14, 2026
83bbb38
test(e2e): trilha de auditoria no emulador com adulteracao, exportaca…
hbgit Oct 14, 2026
7853a9c
docs(e2e): evidencia do e2e da auditoria e do login do admin (#45)
hbgit Oct 14, 2026
3b1d261
docs(auditoria): documenta a trilha completa e a regressao final (#45)
hbgit Oct 14, 2026
4473faa
fix(auditoria): coordenador nao recebe timeBudget no status da cadeia…
hbgit Oct 14, 2026
01649a5
Minor changes
hbgit Oct 14, 2026
a8b8339
Merge pull request #59 from hbgit/feat/issue-45-trilha-auditoria-comp…
hbgit Oct 14, 2026
b7047e7
docs(avisos): plano da issue 46 com decisões e fase de UI detalhada (…
hbgit Oct 14, 2026
56a8a60
feat(avisos): tabela scheduled_notices (#46)
hbgit Oct 14, 2026
e9b7f9a
feat(avisos): agendamento autorizado e auditado (#46)
hbgit Oct 14, 2026
bc4c1fd
fix(avisos): valida microárea inexistente no agendamento (#46)
hbgit Oct 14, 2026
ecac4c5
test(avisos): teste de ausência do texto na auditoria deixa de ser va…
hbgit Oct 14, 2026
981b443
feat(avisos): cancelar e histórico escopado (#46)
hbgit Oct 14, 2026
e9e1e6a
feat(avisos): disparo dos agendados sem duplicidade (#46)
hbgit Oct 14, 2026
9a4316f
fix(avisos): auditoria do disparo pelo id do aviso (#46)
hbgit Oct 14, 2026
2f57f3e
feat(avisos): store ORM e laço de disparo (#46)
hbgit Oct 14, 2026
6a92eb1
feat(avisos): endpoints de agendamento e histórico (#46)
hbgit Oct 14, 2026
c840801
feat(termos): tabela terms_versions (#46)
hbgit Oct 14, 2026
5eb34a9
feat(termos): publicação com revisão jurídica e 15 dias (#46)
hbgit Oct 14, 2026
e87e807
feat(termos): cartão do paciente lê a agenda publicada (#46)
hbgit Oct 14, 2026
f0fc211
feat(termos): endpoints de rascunho, revisão e publicação (#46)
hbgit Oct 14, 2026
7d4219e
docs(avisos): achados da fase 0 da issue 46 (#46)
hbgit Oct 14, 2026
88eab53
docs(avisos): backend da #46 (#46)
hbgit Oct 14, 2026
7700294
feat(admin): contrato de avisos e termos no data source (#46)
hbgit Oct 14, 2026
de924ec
fix(admin): cobre ordenação, paginação e limites do mock de avisos (#46)
hbgit Oct 14, 2026
b8d8c3a
feat(admin): avisos e termos sobre o AdminEndpoint (#46)
hbgit Oct 14, 2026
fc2145f
feat(admin): aba Avisos com histórico por papel (#46)
hbgit Oct 14, 2026
a6ae56d
fix(admin): roteiros de emulador acham destinos pelo tooltip e cobre …
hbgit Oct 14, 2026
2f9e49c
feat(admin): formulário de agendamento de aviso (#46)
hbgit Oct 14, 2026
8c1a8b3
feat(admin): painel de termos com bloqueio por revisão jurídica (#46)
hbgit Oct 14, 2026
040f9ba
test(admin): acessibilidade e layout de avisos e termos (#46)
hbgit Oct 14, 2026
74c8f64
fix(admin): sub-abas de avisos com alvo de 48dp e testes de a11y mais…
hbgit Oct 14, 2026
00ee8f3
test(admin): integração de avisos e termos no emulador (#46)
hbgit Oct 14, 2026
cad0cb1
test(avisos): e2e do aviso agendado no push_e2e (#46)
hbgit Oct 14, 2026
383f7ca
docs(avisos): roteiro de validação manual da #46 (#46)
hbgit Oct 14, 2026
660ab42
docs(avisos): regressão final e estado da #46 (#46)
hbgit Oct 14, 2026
e76fdf4
chore(avisos): tira artefato de processo do índice (#46)
hbgit Oct 14, 2026
707bcc9
fix(avisos): auditoria fail-closed no agendamento e na publicação de …
hbgit Oct 14, 2026
d636aad
fix(avisos): valida identificadores antes de consultar o store (#46)
hbgit Oct 14, 2026
e48ecf6
fix(avisos): audita a varredura de envios interrompidos (#46)
hbgit Oct 14, 2026
b361679
docs(avisos): LGPD das tabelas novas e pendências da #46 (#46)
hbgit Oct 14, 2026
8a2f669
test(admin): bordas de 15 dias e de 1 minuto na UI (#46)
hbgit Oct 14, 2026
fdf0461
docs(avisos): regressão e e2e após a revisão final (#46)
hbgit Oct 14, 2026
347e5cd
Merge pull request #60 from hbgit/feat/issue-46-avisos-e-termos
hbgit Oct 14, 2026
b72c3a3
docs(ci): plano de implementação da issue #23
hbgit Oct 14, 2026
944aee5
test(ci): casos de concorrência com o ref no grupo de push (#23)
hbgit Oct 14, 2026
3091b0c
fix(ci): check_concorrencia exige o ref no grupo de push/dispatch (#23)
hbgit Oct 14, 2026
a8b8fd3
test(ci): avalia o grupo de concorrência real com o act (#23)
hbgit Oct 14, 2026
8015e3e
fix(ci): inclui o ref no grupo de concorrência de push e dispatch (#23)
hbgit Oct 14, 2026
0964126
docs(ci): registra o grupo de concorrência por ref e SHA (#23)
hbgit Oct 14, 2026
6cdf9db
docs(ci): marca a conferência real no GitHub da #23 como pendente
hbgit Oct 14, 2026
7d70671
Merge pull request #61 from hbgit/fix/issue-23-concorrencia-por-ref
hbgit Oct 14, 2026
ba6d36e
docs(ci): registra a conferência real da #23 no GitHub
hbgit Oct 14, 2026
dbdbdfe
Merge pull request #62 from hbgit/docs/issue-23-conferencia-real
hbgit Oct 14, 2026
dfc7484
fix(ci): guarda exige event_name no prefixo e github.ref estrito (#63)
hbgit Oct 14, 2026
2bae028
test(ci): fixa as limitações da guarda de concorrência e cita #23/#63…
hbgit Oct 14, 2026
3edb612
fix(ci): sonda do act sai com 2 sem pré-requisito, guarda o log e ign…
hbgit Oct 14, 2026
3166ca0
ci: roda o teste da sonda do act no workflow-lint e documenta a guard…
hbgit Oct 14, 2026
64b59ce
Merge pull request #64 from hbgit/fix/issue-63-acabamentos-concorrencia
hbgit Oct 15, 2026
541796e
docs(plano): plano da issue #24 (grupo de concorrência por igualdade …
hbgit Oct 15, 2026
f9ab3a9
fix(ci): check_concorrencia compara o grupo por igualdade exata (#24)
hbgit Oct 15, 2026
26fccc9
docs(ci): registra a guarda de concorrência por igualdade exata (#24)
hbgit Oct 15, 2026
a7e0949
Merge pull request #65 from hbgit/fix/issue-24-grupo-concorrencia-exato
hbgit Oct 15, 2026
0b9042d
Minor changes
hbgit Oct 15, 2026
951ae68
docs(plano): verificação e fechamento da #46
hbgit Oct 15, 2026
5d205ce
docs(plano): linha de base do fechamento da #46
hbgit Oct 15, 2026
a373a6f
fix(avisos): disparo reconfere a autoridade de quem agendou (#46)
hbgit Oct 15, 2026
c7e7cf3
test(e2e): push_e2e agenda pelo endpoint real admin.scheduleNotice (#46)
hbgit Oct 15, 2026
0af7043
docs(plano): provas de emulador do fechamento da #46
hbgit Oct 15, 2026
d21e3cf
docs(avisos): fechamento da #46 — autor reconferido e e2e pelo endpoi…
hbgit Oct 15, 2026
d479134
docs(avisos): remove pendência de stack parada já resolvida (#46)
hbgit Oct 15, 2026
30c4bc9
Merge pull request #66 from hbgit/fix/issue-46-fechamento
hbgit Oct 15, 2026
b3d8ce1
docs(plano): plano da issue #19 (filtros de pull_request)
hbgit Oct 15, 2026
2fbbfa3
fix(ci): check_gatilhos exige pull_request sem filtro (#19)
hbgit Oct 15, 2026
8f9394a
docs(ci): registra a guarda dos filtros de pull_request (#19)
hbgit Oct 15, 2026
5f4afe8
Merge pull request #67 from hbgit/fix/issue-19-gatilho-pull-request
hbgit Oct 15, 2026
6a927cd
docs(plano): plano da issue #68 (gatilhos que não são dict)
hbgit Oct 15, 2026
5cfc885
fix(ci): push/pull_request fora de dict viram mensagem de tipo, sem t…
hbgit Oct 15, 2026
567e5b6
docs(ci): registra a guarda de gatilhos que não são dict (#68)
hbgit Oct 15, 2026
498121e
Merge pull request #69 from hbgit/fix/issue-68-gatilho-nao-dict
hbgit Oct 15, 2026
e6ec2b9
docs(plano): plano de atualização do README e da documentação de entrada
hbgit Oct 15, 2026
ea7bfec
docs(readme): atualiza estado atual, funcionalidades, estrutura e seg…
hbgit Oct 15, 2026
054aea9
docs(readme): configuração antes da execução, backoffice, release e C…
hbgit Oct 15, 2026
40478c1
docs(contributing): piso de SDK, admin, bootstrap e conferidor de links
hbgit Oct 15, 2026
7d31e6f
docs(apps): descrições atuais dos apps, código de ativação do admin e…
hbgit Oct 15, 2026
bb3ffe7
docs: telas do paciente, índice de docs e escopo da política de segur…
hbgit Oct 15, 2026
1b1f05a
docs: corrige os achados da revisão final
hbgit Oct 15, 2026
7b01d98
fix(qa): conferidor de links ignora .worktrees e os planos em docs/su…
hbgit Oct 15, 2026
d74d5a1
Merge pull request #70 from hbgit/docs/atualiza-readme-e-docs
hbgit Oct 15, 2026
08db533
merge: traz a correção da #56 (queda do backend pelo socket MQTT) par…
hbgit Oct 15, 2026
7f85013
Merge pull request #71 from hbgit/fix/issue-56-integra-develop
hbgit Oct 15, 2026
2c45c22
docs(plano): limpeza das branches remotas de 2026-10-15
hbgit Oct 15, 2026
b8b4503
docs(plano): registra a execução da limpeza de branches de 2026-10-15
hbgit Oct 15, 2026
92106d1
Merge pull request #72 from hbgit/docs/plano-limpeza-branches
hbgit Oct 15, 2026
723eb70
merge: alinha a main com a develop (2026-10-15)
hbgit Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 0 additions & 1 deletion .claude/.headroom_wrap_marker.json

This file was deleted.

26 changes: 0 additions & 26 deletions .claude/.headroom_wrap_owners.json

This file was deleted.

43 changes: 43 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ MQTT_ACS_PASSWORD=
# MQTT_CERT_SAN_EXTRA=IP:192.168.0.10
MQTT_CERT_SAN_EXTRA=

# mTLS do broker: o backend apresenta um certificado de cliente (CN = usuário
# MQTT, emitido pelo mosquitto-init com a CA de desenvolvimento). O
# docker-compose.yml já define as duas variáveis para o container do servidor
# (/app/certs/backend.crt e backend.key); só precisam vir aqui para rodar o
# servidor fora do Compose. Vêm sempre juntas; fora de development com
# MQTT_USE_TLS=true são obrigatórias. A senha MQTT continua valendo.
# MQTT_CLIENT_CERT_PATH=infra/docker/mosquitto/runtime/certs/backend.crt
# MQTT_CLIENT_KEY_PATH=infra/docker/mosquitto/runtime/certs/backend.key

# SANs adicionais no certificado do RPC, que o Traefik apresenta em :443
# (RNF04). Mesma necessidade e mesmo formato do MQTT_CERT_SAN_EXTRA acima, mas
# para a outra CA: a do RPC é SEPARADA da do broker — ver docs/README.md.
Expand Down Expand Up @@ -161,6 +170,11 @@ CPF_HASH_PEPPER=
# ---------------------------------------------------------------------------
DEV_ACS_PASSWORD=

# Senha do admin de desenvolvimento do backoffice (matrícula ADM-001), também
# gravada por `acs-credential-seed`. A MFA do staff é obrigatória: o primeiro
# acesso passa pela tela de ativação do TOTP. Gere com `openssl rand -hex 32`.
DEV_ADMIN_PASSWORD=

# ---------------------------------------------------------------------------
# Comportamento · consumido por: serverpod
# ---------------------------------------------------------------------------
Expand All @@ -173,6 +187,12 @@ APP_ENV=development
# autenticação institucional.
ENABLE_DEV_LOGIN=true

# MFA por TOTP (RFC 6238) no login institucional do ACS (RF07). Com true, o ACS
# sem MFA ativa não entra: precisa ativá-la antes (auth.beginTotpEnrollment).
# Em produção o padrão é `true` (variável ausente = ligada fora de development);
# este default é só da stack local.
REQUIRE_ACS_MFA=false

# Gateway de SMS do login passwordless. `log` (padrão em development) escreve o
# código no log do processo em vez de enviar SMS. Em produção é obrigatório
# apontar para um gateway real — nenhum provedor está escolhido ainda, então
Expand Down Expand Up @@ -216,3 +236,26 @@ SMS_GATEWAY=
# credencial do broker não pode viajar no app. A correção é credencial por
# dispositivo / mTLS, registrada como lacuna conhecida.
# ---------------------------------------------------------------------------

# --- Avisos push (RF14) ----------------------------------------------------
# Gorush é o relé para FCM/APNs e continua exigindo as credenciais dos
# provedores (arquivos fora do repositório). Vazio desliga o envio de avisos.
# Para ligar: `docker compose --profile push up` e GORUSH_URL=http://gorush:8088.
GORUSH_URL=
GORUSH_CREDENTIALS_DIR=
GORUSH_IOS_KEY_ID=
GORUSH_IOS_TEAM_ID=

# --- Retenção e expurgo (LGPD-RF07) ---------------------------------------
# Opcionais: os defaults são a tabela de spec/lgpd_design.md §5.6 — alertas 2
# anos (730), visitas e triagens 5 anos (1825). Só inteiro positivo de dias
# (teto 36500): um valor errado aqui apaga dados de forma irreversível.
# RETENTION_ALERT_DAYS=730
# RETENTION_VISIT_DAYS=1825
# RETENTION_TRIAGE_DAYS=1825

# --- Escalonamento de alertas vermelhos (issue #44) -----------------------
# Opcional: segundos até um alerta vermelho sem reconhecimento ficar elegível
# a escalonamento. Padrão 300 (5 min); só inteiro de 30 a 3600, fora disso o
# servidor não sobe.
# RED_ALERT_ESCALATION_SECONDS=300
3 changes: 2 additions & 1 deletion .github/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ explique como os mantenedores podem reproduzir o problema sem retê-la.

Esta política abrange vulnerabilidades nos componentes versionados do SinalACS:

- Aplicativos em `apps/acs` e `apps/patient`.
- Aplicativos em `apps/acs`, `apps/patient` e `apps/admin` (backoffice).
- Backend em `backend` e seus clientes gerados.
- Infraestrutura, arquivos Docker Compose e configurações sob `infra`.
- Scripts de desenvolvimento, validação e CI sob `scripts/`.
- Workflows de CI e dependências declaradas no repositório.

Relatos são bem-vindos inclusive para limitações já documentadas quando
Expand Down
80 changes: 71 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,25 @@ on:
# de develop rodava CI — foi assim que 74d89c0 ficou sem um run sequer
# (FINDING-2/FINDING-4 da avaliação de 2026-09-28).
branches: [main, master, develop]
# Sem filtro nenhum (branches, branches-ignore, types, paths): uma PR fora
# do filtro nunca reporta os checks obrigatórios e espera para sempre.
# check_gatilhos em scripts/qa/ci_invariants.sh falha se aparecer um (issue #19).
pull_request:
# Para gerar o dado sem precisar abrir PR: `gh workflow run CI --ref <branch>`.
workflow_dispatch:

# Um run vivo por PR: push novo na mesma PR cancela o anterior, que já não
# descreve a ponta dela — o android-e2e sozinho chega a 60 min (FINDING-7).
# Push e dispatch são agrupados pelo SHA, então nenhum commit de main/develop
# perde o próprio resultado para o commit seguinte.
# Push e dispatch são agrupados pelo ref E pelo SHA: o SHA impede que um commit
# de main/develop perca o resultado para o seguinte; o ref impede que main e
# develop, no mesmo SHA (fast-forward de uma para a outra), se cancelem
# (issue #23). github.ref, e não ref_name, para uma tag não colidir com uma
# branch de mesmo nome num dispatch.
# Este texto é comparado por igualdade com GRUPO_CONCORRENCIA em
# scripts/qa/ci_invariants.sh (issue #24): mudou aqui, muda lá e em GRUPO_NOVO
# de scripts/qa/ci_invariants_test.sh no mesmo commit.
concurrency:
group: ci-${{ github.event_name }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.sha }}
group: ci-${{ github.event_name }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || format('{0}-{1}', github.ref, github.sha) }}
cancel-in-progress: true

# Todos os jobs fixam ubuntu-24.04 em vez de ubuntu-latest: o label migra
Expand All @@ -37,6 +46,16 @@ jobs:
run: |
python3 -c 'import yaml' 2>/dev/null || { sudo apt-get update && sudo apt-get install -y python3-yaml; }
./scripts/qa/ci_invariants.sh
./scripts/qa/ci_invariants_test.sh
- name: Testes dos scripts de CI
run: |
./scripts/ci/decode_secret_file_test.sh
./scripts/qa/ci_push_e2e_test.sh
./scripts/qa/ci_invariants_fcm_test.sh
./scripts/qa/ci_concurrency_act_test.sh
./scripts/dev/sync_dev_ca_test.sh
./scripts/dev/bootstrap_env_test.sh
./scripts/dev/run_acs_captura_test.sh
serverpod-backend:
runs-on: ubuntu-24.04
defaults:
Expand Down Expand Up @@ -177,6 +196,10 @@ jobs:
with:
flutter-version: '3.44.8'
- run: flutter pub get
# Mesmo motivo do job patient-app: assets/certs/ é gitignored e vem do
# scripts/dev/sync_dev_ca.sh, que precisa da stack de pé.
- name: Cria o diretório assets/certs/ que o pubspec declara
run: mkdir -p assets/certs
- run: flutter analyze
- run: flutter test

Expand Down Expand Up @@ -214,11 +237,6 @@ jobs:
GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }}
steps:
- uses: actions/checkout@v7
# Sem isto o emulador roda por emulação de CPU em software: medido, o log
# dizia "ProbeKVM: This user doesn't have permissions to use KVM", o boot
# levava ~12 min e cada `adb install` de 45 a 95 s. O runner tem
# /dev/kvm, só não para o usuário do job — a regra do udev abre o
# dispositivo. É o passo documentado pelo android-emulator-runner.
- name: Habilita KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
Expand Down Expand Up @@ -254,12 +272,15 @@ jobs:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-36-x86_64-pixel_7-ubuntu-24.04
# target no nome: o push e2e precisa de Play Services (a imagem padrão da action é
# AOSP, sem ele); trocar o target sem trocar a chave restauraria o AVD antigo.
key: avd-36-google_apis-x86_64-pixel_7-ubuntu-24.04
- name: Gera o snapshot do AVD para o cache
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 36
target: google_apis
arch: x86_64
profile: pixel_7
force-avd-creation: false
Expand All @@ -278,10 +299,39 @@ jobs:
(cd apps/patient && flutter pub get) & p2=$!
(cd apps/acs && flutter pub get) & p3=$!
wait $p1 && wait $p2 && wait $p3
# Credenciais do FCM para o push e2e (Gorush e FCM reais). Cada secret é um arquivo em
# base64 (`base64 -w0 arquivo`). A chave da conta de serviço vai para um arquivo
# temporário (0600) e GOOGLE_APPLICATION_CREDENTIALS aponta para ele; o
# google-services.json vai para onde o build do paciente o procura (sem ele o APK
# compila e degrada para "sem push"). Sem os secrets (PR de fork) os passos só avisam
# e o job roda como sempre. Cada secret entra por `env:` do PASSO: nunca em `run:`
# (injeção de script) e nunca no `env:` do job (toda ação de terceiros o veria) —
# ci_invariants.sh vigia as duas coisas. Ficam LOGO ANTES do E2E (e depois do
# setup de Java/Flutter/caches/AVD): as credenciais só existem em disco quando quem as usa roda,
# e nenhuma ação de terceiros que não precisa delas as lê — o guarda também exige isso.
- name: Decodifica a credencial do FCM
env:
FCM_CREDENTIALS_BASE64: ${{ secrets.FCM_CREDENTIALS_BASE64 }}
run: |
./scripts/ci/decode_secret_file.sh --env FCM_CREDENTIALS_BASE64 \
--kind service_account --temp-export GOOGLE_APPLICATION_CREDENTIALS
- name: Decodifica o google-services.json
env:
GOOGLE_SERVICES_JSON_BASE64: ${{ secrets.GOOGLE_SERVICES_JSON_BASE64 }}
run: |
./scripts/ci/decode_secret_file.sh --env GOOGLE_SERVICES_JSON_BASE64 \
--kind google_services --package br.com.prismrr.sinalacs.patient \
--to apps/patient/android/app/google-services.json
# Sem isto o emulador roda por emulação de CPU em software: medido, o log
# dizia "ProbeKVM: This user doesn't have permissions to use KVM", o boot
# levava ~12 min e cada `adb install` de 45 a 95 s. O runner tem
# /dev/kvm, só não para o usuário do job — a regra do udev abre o
# dispositivo. É o passo documentado pelo android-emulator-runner.
- name: E2E no emulador Android
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 36
target: google_apis
arch: x86_64
profile: pixel_7
force-avd-creation: false
Expand All @@ -296,6 +346,15 @@ jobs:
# container. O pós-passo do flutter-action faz hashFiles('**/pubspec.lock')
# sobre o workspace inteiro, não consegue ler pg_data/ e derruba o job
# depois de o E2E ter passado — medido no run 36494654391.
# Apaga as credenciais mesmo se o E2E falhar. Num runner hospedado o disco é descartado
# ao fim do job, mas o passo mantém a regra verdadeira em qualquer runner (inclusive um
# autohospedado no futuro) e tira o google-services.json e a chave do Gorush do workspace.
- name: Remove as credenciais do FCM
if: always()
run: |
./scripts/ci/decode_secret_file.sh --cleanup-temp GOOGLE_APPLICATION_CREDENTIALS
./scripts/ci/decode_secret_file.sh --cleanup-file apps/patient/android/app/google-services.json
./scripts/ci/decode_secret_file.sh --cleanup-file infra/docker/gorush/credentials/fcm-service-account.json
- name: Remove pg_data/ do workspace
if: always()
run: sudo rm -rf pg_data
Expand Down Expand Up @@ -336,4 +395,7 @@ jobs:
key: gradle-admin-${{ hashFiles('apps/admin/android/**/*.gradle.kts', 'apps/admin/android/gradle/wrapper/gradle-wrapper.properties') }}
restore-keys: gradle-admin-
- run: flutter pub get
# Sem a CA o APK sobe fail-closed (só raízes do sistema); aqui só interessa compilar.
- name: Cria o diretório assets/certs/ que o pubspec declara
run: mkdir -p assets/certs
- run: flutter build apk --debug
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
.DS_Store
*.log
*.tmp
.serena/

# Dart / Flutter
.dart_tool/
Expand Down Expand Up @@ -38,4 +39,19 @@ graphify-out/
# e uma CA de desenvolvimento gerada por máquina não pode ser versionada.
apps/acs/assets/certs/
apps/patient/assets/certs/
apps/admin/assets/certs/
.worktrees/

# Estado local do proxy headroom (PID e timestamps), reescrito a cada sessão
.claude/.headroom_wrap_*.json
infra/docker/gorush/credentials/

# Google services
google-services.json
fcm-service-account.json

# Fixtures e segredos da stack de e2e (gerados por scripts/qa/e2e_stack.sh seed)
.e2e/

__pycache__/
*.pyc
2 changes: 0 additions & 2 deletions .serena/.gitignore

This file was deleted.

Loading
Loading