Repository navigation
feat: reserva por HTTP para o ACS receber alertas quando o MQTT cai (#80) - #92
Merged
Merged
Conversation
…o pendente mais novo e consulta ao armar (#80)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #80
Resumo
Quando o MQTT do aparelho do ACS não está conectado, o app passa a consultar por HTTPS os alertas abertos da microárea e os põe na mesma fila de priorização, sem duplicar o que o MQTT entregar depois e sem nunca desfazer um ACK (PRD R2, INV-03). Antes, com o broker inalcançável, o ACS não tinha como receber alerta nenhum. Plano:
docs/superpowers/plans/2026-10-17-issue-80-reserva-http-alertas.md.Backend
alerts.openForMicroArea(accessToken)→List<AcsOpenAlert>: só ACS com microárea, que vem do token (INV-01). Devolvepending/escalatede depoisacknowledged(concluídos fora), cada grupo do mais antigo ao mais novo, teto de 200 que corta os mais antigos — nunca o pendente mais novo. Campos = envelope MQTT +status,acknowledgedAt,escalated; semescalatedBy/escalationReason.App do ACS
AlertHttpFallback+AlertQueue.mergeFromServer: nunca remove cartão, ignora outra microárea, só ganha ACK/reforço (um ACK feito em outro aparelho promove o cartão), nunca desfaz; só notifica quando algo muda.AcsHomeShell: consulta ao abrir o painel, ao voltar ao primeiro plano e no instante em que a reserva arma; a cada 30 s só enquanto o broker está fora e o app em primeiro plano; uma consulta por vez, resposta tardia descartada nodispose. Linhaalert_fallback_statusno painel ("Recebendo alertas pelo servidor a cada 30 s. Última consulta às HH:MM.").autoReconnect, omqtt_client10.5.1 não chamaonDisconnectedquando o broker cai depois de conectar — o painel seguia "em linha" (defeito anterior a esta issue) e a reserva nunca ligaria.MqttSecureClientagora trataonAutoReconnectcomo queda e usadisconnectOnNoResponsePeriod = 10contra conexão meio aberta (test/mqtt_drop_after_connect_test.dart, broker falso em TCP real).Testes
dart test -j 11418/1418 (test/integration/acs_open_alerts_test.dart, grupoopenForAcs (#80)emred_alert_service_test.dart).flutter test628/628 (alert_queue_merge_test.dart,alert_http_fallback_test.dart,alert_http_fallback_shell_test.dart,mqtt_drop_after_connect_test.dart);flutter analyzelimpo;ci_invariants.shok.emulator-5554, banco de teste):scripts/qa/acs_alert_fallback_e2e.sh— broker fora do alcance do aparelho, alerta inserido por SQL semalert_outbox, intervalo de produção de 30 s: o cartão apareceu sem toque em 29 633 ms, foi confirmado pela tela e seguiu único e confirmado depois de mais um tique; no banco,acknowledged, 1 linhaacknowledged, 0 leituras auditadas, 0 linhas no outbox. Log emdocs/superpowers/plans/2026-10-17-issue-80-e2e.log. Regressão do MQTT real:integration_test/red_alert_cycle_test.dart7/7 ee2e.sh --emulatorverde.Em aberto (registrado no
PROGRESS.md)spec/stack.md); sem som/vibração/notificação do SO.