v0.6.0
[0.6.0] — 2026-09-30
Detalhes e exemplos: doc/releases/v0.6.0.md
(PT).
Adicionado
- Som selecionável e em mais formatos (
.wav,.mp3,.m4a,.aac,.ogg,.oga,.flac,
.wmaconforme a camada): a GUI toca peloQMediaPlayer(QtMultimedia, já empacotado), o
CLI/runusaminiaudio(agora dependência core; thread daemon, sem bloquear o loop) e o
backend legado (winsound/paplay/aplay/ffplay/afplay) segue como fallback.filerelativo
procura emapp-data/sounds/antes do CWD; arquivo ausente ou formato sem decoder cai no
beep()+ aviso (nunca silêncio nem exceção). Ofeaturesmostra camadas, formatos e a pasta. - Grupo “Detecção e alertas” na GUI: linha Som do alerta com o caminho efetivo,
Escolher… (só pré-visualiza; nada é gravado), Reproduzir e Copiar caminho (trecho
file: "<caminho>"para colar no alertasounddo YAML); text_watch— alertar quando um texto aparece/desaparece na ROI (somente no modoadvanced):
com o filtro configurado (compare_options.advanced.text_watchno perfil ou
overrides.text_watchna seleção, que tem precedência), o alerta dispara somente na transição
escolhida (expect: appears|disappears) e as demais mudanças de texto não disparam. Casamento por
substring comcase_sensitive: falseeignore_accents: true(NFKD + remoção de diacríticos nos
dois lados) por padrão; a transição valeseverity: 3. Na GUI, a linha Verificar texto edita o
override da seleção atual (habilitada só noadvanced) e é limpa ao trocar o modo.
Corrigido
- Telegram não enviava quando o
chat_iddo perfil estava com o placeholder doinit-config
(123456789): o erro do Telegram ("chat not found") era apenas logado. Agora otest-alert
reportaalert <id> failed: ...e retorna código != 0 mesmo que outro canal (som/popup) tenha
funcionado. test-alert --only <id>e o botão Testar alerta… sinalizam token/URL ausentes como falha
(TELEGRAM_BOT_TOKEN not set/no url resolved) em vez de reportar "sent".httpx/httpcorenão logam mais a URL completa em INFO — ela carregava o token do Telegram e
segredos de webhook (vazamento em logs).
Mudado
- Modo
advanced: agora ophash(default) roda como gate de pixel antes do OCR
(MODE_STAGES["advanced"] = ("default", "advanced")). O OCR só roda/pontua quando os pixels
mudaram, reduzindo falsos positivos ("mudanças" repetidas sem alteração real). O threshold do gate
écompare_options.default.threshold. - Com
text_watchconfigurado o gate é bypassado (("advanced",)): o OCR roda a cada tick e o
veredito do filtro é autoritativo — ochangeddo OCR não é propagado escore/thresholddele
ficam apenas nodetail(calibração pelocompare-modes). Sem o bypass o gate esconderia a
transição. - Seleção de ROI: uma ROI que não cabe inteiramente na janela é rejeitada
(runtime.roi_outside_window) em vez de salva com um aviso. Uma ROI fora da janela fazia o tick
capturar uma região alheia ao alvo, gerando prints e alertas que não correspondiam à janela.
Notas
text_watchfora doadvancedé erro de config (config.text_watch_needs_advanced); a GUI limpa
o override ao trocar o modo. Como o filtro decide ochanged, as ações também só rodam na
transição configurada.- Custo do bypass: OCR a cada tick (100–500 ms; o intervalo default é 2 s); o veredito por presença
não sofre o ruído de OCR que motivou o gate. - Matriz de formatos: a GUI no Windows (Media Foundation) toca M4A/AAC; no CLI isso depende de um
player externo (ffplay) — senãobeep. No Linux (GUI), depende dos plugins do GStreamer. - 5 códigos de erro novos (
config.text_watch_*), chavesmain.*/help.*nos dois catálogos.