Skip to content

Releases

v1.4.28 - Prints da tela como momentos-chave

Choose a tag to compare

@allanrmartins allanrmartins released this 10 Nov 13:44

Prints da tela viram momentos-chave do resumo

Durante a gravação, a pílula ganhou um botão de câmera 📷, e a tecla Print Screen também tira o print (#229).

  • O print vai para a pasta da reunião, e o resumo ganha a seção Momentos-chave, com o assunto daquele momento e a imagem.
  • Com mais de um monitor, sai só o monitor da janela ativa (o app em que você clicou por último), e não a mesa inteira.
  • A tecla é configurável em Configurações → Gravação → Tecla de print na call: clique em Trocar… e aperte a tecla. O padrão é a Print Screen.
  • No Mac, a Print Screen de teclado de PC (que chega como F13) funciona, e os prints do sistema (Cmd+Shift+3, 4 ou 5) feitos durante a gravação também entram na reunião.
  • A tecla só é observada durante a gravação e continua fazendo o que já fazia.
  • Os prints ficam guardados mesmo quando a limpeza apaga a gravação antiga. Eles têm limpeza própria, desligada por padrão: Configurações → Gravação → Apagar prints da call após (dias).

Gravar teste

Novo item Gravar teste no menu do ícone, para experimentar o app sem bagunçar o seu trabalho.
A gravação passa pelo processamento inteiro, mas não vira apontamento de horas, pendência nem resultado de busca, e não ensina termos ao vocabulário.
A nota aparece com o título "TESTE - ..." e é apagada sozinha 24 h depois, com a gravação e os prints.

Call em espera seguida de outra call

Com uma call em espera e outra atendida, o microfone do Teams não fecha, e as duas reuniões saíam numa nota só.
Agora o ScribaDev percebe a troca pelo título da janela da call e separa uma nota para cada reunião.

Apontamento de horas revisado

  • O horário digitado é gravado como foi digitado (antes, digitar no fim do campo podia manter o horário antigo).
  • Salvar confere fim depois do início, cliente obrigatório e blocos sobrepostos; os sobrepostos ficam em vermelho.
  • Excluir, descartar e marcar como lançado valem para vários itens de uma vez.
  • A OS segue o cliente: a lista mostra só as OS dele, e trocar o cliente tira a OS de outro.
  • Cadastro de clientes e OS a partir do histórico, com prévia e backup.

Outras correções

  • O número de participantes escolhido na pílula não se perde mais no meio da call.
  • Mac: clicar no ícone do Dock abre a janela quando o app foi iniciado só na barra de menus.
📋 Mudanças completas

Funções novas

  • feat(prints): print da tela durante a call vira momento-chave do resumo (#229)
  • feat(prints): tecla de print configurável e limpeza própria dos prints (#229)
  • feat(prints): print só do monitor da janela ativa (#229)
  • feat: gravação de teste que não polui o trabalho

Correções

  • fix(detector): call em espera + outra call vira duas notas (corte pelo título)
  • fix(recorder): regravar o meta no meio da call preserva o num_speakers da pílula
  • fix(mac): clique no ícone do Dock abre a janela com o app iniciado só na bandeja
  • fix(timesheet): revisão da janela de horas - hora fixa, exclusão em lote, OS presa ao cliente

Outros

  • test(ci): launcher universal e VM sem o motor da Apple não reprovam o macOS do CI
  • test(prints): falha ao achar a janela ativa testada com a plataforma fixa (Linux do CI)
  • chore: bump 1.4.28

Diff completo: v1.4.27...v1.4.28

v1.4.27 - O que há de novo depois de atualizar; aviso de versão por sistema

Choose a tag to compare

@allanrmartins allanrmartins released this 20 Oct 23:14

"O que há de novo" depois de atualizar

Depois de cada atualização, o ScribaDev agora abre uma tela com o que mudou e onde experimentar.

  • Destaques em cartões, com o botão Experimentar, que abre direto a opção nas Configurações.
  • Melhorias e correções resumidas logo abaixo.
  • Só aparece o que vale para o seu sistema: quem usa Windows não vê o que é só do Mac.
  • Pulou versões? A tela junta tudo o que você ainda não viu, com os destaques primeiro.
  • Abre sozinha uma vez, nunca durante uma gravação; dá para reabrir em Novidades (menu do ícone) ou em Configurações → Sobre.

No Mac, quem atualizar da 1.4.26 ou anterior vai ver em destaque a transcrição pelo motor de fala da Apple (macOS 26+), que chegou na versão anterior.

Aviso de versão por sistema

O aviso de versão nova passa a considerar o seu sistema: uma versão com mudanças só para o Mac não incomoda quem usa Windows, e vice-versa.

📋 Mudanças completas

Funções novas

  • feat(update): aviso por sistema e tela "O que há de novo" após atualizar (#228)

Correções

  • fix(novidades): destaques de todas as versões primeiro (o recurso grande não fica sob melhorias miúdas)

Documentação

  • docs(novidades): entrada da 1.4.27

Outros

  • chore: bump 1.4.27

Diff completo: v1.4.26...v1.4.27

v1.4.26 - Motor de fala da Apple, vocabulário que aprende, pílula visível no Mac

Choose a tag to compare

@allanrmartins allanrmartins released this 20 Oct 22:41

Motor de fala da Apple (macOS 26+)

Em Configurações → Transcrição → Motor agora há a opção Apple, que usa o reconhecimento de fala do próprio macOS, 100% no Mac.
Numa call real de 12 min, a transcrição levou 6 s (contra 27 s do Whisper), com o Mac bem mais frio.
O Whisper continua disponível no mesmo seletor e é a reserva automática se o motor da Apple falhar.

  • Transcrever ao vivo (opcional, só com o motor Apple): a transcrição acontece durante a call; ao fim só faltam as vozes e o resumo.
  • Com o motor Apple escolhido, os campos que são só do Whisper (modelo, dispositivo, avançado) ficam esmaecidos.

Vocabulário: corrige o jargão e aprende com as reuniões

  • Correção dos termos na transcrição: a grafia do seu vocabulário é aplicada ao texto ("S 80" vira SE80, "smartformes" vira SmartForms), com regras conservadoras para não trocar palavra certa. Vale para qualquer motor e é essencial no da Apple, que ignora o vocabulário. Liga/desliga em Configurações → Transcrição.
  • O resumo recebe o seu vocabulário, e a nota sai com a grafia certa mesmo onde a transcrição errou.
  • Termos aprendidos: o resumo identifica os termos técnicos de cada reunião; quando um termo aparece em 2 ou mais reuniões, ele vira sugestão em Configurações → Transcrição, e você decide se entra no vocabulário. Nada entra sozinho.
  • Assistente de perfil: sem jargão informado, o Claude pesquisa na web os termos mais usados na sua stack e área e monta o vocabulário inicial. Em perfil SAP, a lista inclui transações e tabelas de vários módulos.
  • Regras específicas de SAP (como o "Z" de objeto customizado) só ligam para quem é de SAP.

macOS

  • A pílula aparece durante a call: ela sumia sempre que outro app (o Teams) estava na frente. Agora fica visível, no topo da tela, logo abaixo da barra de menus, e continua fora do compartilhamento de tela.
  • Nome da reunião do Teams: o Teams do Mac usa outro formato de título; o nome agora vem da janela da call, e não do chat aberto.
  • Iniciar com o sistema abre o app pelo .app, com as permissões certas (antes, o áudio dos participantes podia sair mudo).
  • Modo código-fonte: o setup.sh cria o "ScribaDev Dev.app", que hospeda o Python do venv; microfone, áudio do sistema e Acessibilidade ficam com o app.

Outras melhorias

  • Separar vozes só na tomada (notebooks): na bateria a nota sai na hora sem separar vozes; ao ligar na tomada, a separação roda sozinha.
  • Vozes sem componentes: se a separação de vozes estiver ligada e os componentes não estiverem instalados, o app agora avisa (antes só o log sabia).
  • Janela minimizada: clicar em Notas (ou em outra janela) com ela minimizada no Dock agora a traz de volta.
  • As abas das Configurações não abrem mais buracos ao maximizar a janela.
📋 Mudanças completas

Funções novas

  • feat(stt): motor de fala da Apple no macOS 26+, com transcrição ao vivo (#222, PR #224)
  • feat(vocab): corrige os termos do vocabulário na transcrição e no resumo (PR #226)
  • feat(vocab): vocabulário que aprende com as reuniões - fase 1 (#227)
  • feat(perfil): jargão inicial pesquisado na web e modo SAP pelo perfil (#227)
  • feat(perfil): jargão SAP inclui transações e tabelas de vários módulos
  • feat(diarize): separar vozes só na tomada (nota já, vozes depois) (PR #221)

Correções

  • fix(ui): janela minimizada volta ao abrir; avisa vozes sem componentes (PR #219)
  • fix(pilula): aparece no macOS durante a call e nasce no topo da tela (PR #220)
  • fix(mac): iniciar com o sistema abre o .app; lançador do modo código-fonte (PR #223)
  • fix(mac): lançador nativo hospeda o Python (Acessibilidade vai para o app) (PR #223)
  • fix(detector): nome da reunião do Teams no formato do macOS (PR #225)
  • fix(config-ui): controles de cada motor só ativos com ele; aba sem buracos
  • fix(config-ui): mesmo espaçamento nas linhas de termos aprendidos

Outros

  • chore: bump 1.4.26

Diff completo: v1.4.25...v1.4.26

v1.4.25 - Transcrição volta a recortar o silêncio no Mac; PyAV compatível no Windows

Choose a tag to compare

@allanrmartins allanrmartins released this 19 Oct 14:12

Transcrição: o PyAV 19 quebrava a leitura do áudio

O PyAV 19 (lançado em 29/09) removeu um argumento que o faster-whisper ainda usa para abrir o áudio.
Os instaladores gerados depois disso (1.4.22 a 1.4.24) levaram essa combinação incompatível.

  • Mac: o filtro de voz voltou a recortar o silêncio antes de transcrever.
    Sem ele, o áudio inteiro ia ao modelo, a transcrição demorava mais e trechos mudos podiam virar texto inventado na ata.
    O log mostrava "AVISO: filtro de voz indisponível (open() got an unexpected keyword argument 'metadata_errors')".
  • Windows: a transcrição pelo faster-whisper usa a mesma leitura de áudio e podia falhar com o mesmo erro.
  • O ScribaDev agora fixa o PyAV abaixo da versão 19, e um teste novo pega a incompatibilidade no CI antes de um release.
📋 Mudanças completas

Correções

  • fix(deps): limita o PyAV a <19 (decode_audio do faster-whisper quebrado) (PR #218)

Outros

  • chore: bump 1.4.25

Diff completo: v1.4.24...v1.4.25

v1.4.24 - Teams: a call segue gravando em qualquer vista; suspender não é travamento

Choose a tag to compare

@allanrmartins allanrmartins released this 14 Oct 23:21

Teams: a call segue gravando com você calado, em qualquer vista

  • A janela da reunião do Teams agora é reconhecida pelo título que o Teams realmente usa.
    Na 1.4.22 a proteção "Teams soltou o mic com você calado, mas a call continua" só funcionava com a vista compacta aberta; agora vale também com a reunião em tela cheia, na sala de espera e compartilhando a tela.
  • O nome da reunião vem da janela da call, e não mais da janela principal do Teams.
    Trocar de chat durante a reunião não gera mais avisos de "possível nova call" no log, e o título da ata deixa de sair como "Microsoft Teams meeting".
  • Um chat destacado em janela própria ("Pinned window") não é confundido com a janela da call.

Watchdog: suspender o notebook não é travamento

  • Ao acordar o computador, o app não registra mais "GUI sem responder há horas" nem enche o logs/hang.log: o tempo em suspensão deixou de contar como travamento.
📋 Mudanças completas

Correções

  • fix(detector): reconhece a janela da call do Teams pelo título real (PR #215)
  • fix(watchdog): suspensão da máquina não conta como travamento (PR #214)

Outros

  • chore: bump 1.4.24

Diff completo: v1.4.23...v1.4.24

v1.4.23 - Resumo espera o Claude CLI se atualizar; aviso de Claude deslogado

Choose a tag to compare

@allanrmartins allanrmartins released this 13 Oct 19:52

🔴 Aviso quando o Claude CLI está deslogado

Com o claude CLI deslogado, toda reunião saía sem resumo, e só dava para perceber ao abrir a nota.
Agora o app checa o login uma vez por dia e, se a CLI estiver deslogada, mostra um banner vermelho na capa e um toast que se repete a cada 2 horas.

  • A checagem diária usa claude auth status, que não gasta tokens.
  • Uma sessão que venceu e não renova pode seguir aparecendo como "logada" no status. Por isso, quando um resumo, o chat ou o assistente de perfil batem em logout de verdade, o app também fica sabendo e confirma com uma chamada real.
  • Depois do /login, o banner some sozinho em até 30 minutos, ou na hora pelo botão "Verificar de novo".
  • Só vale para quem tem o resumo ligado no provider claude. Quem usa Ollama ou um endpoint OpenAI-compatível não vê nada disso.

🧠 O resumo não é mais pulado quando o Claude Code se atualiza

O Claude Code instalado pelo npm se atualiza sozinho, e durante a reinstalação o comando claude some do PATH por alguns segundos.
Uma reunião que terminasse de processar nessa janela ficava sem resumo, com "claude CLI não encontrado" no log.

  • O resumo agora espera até 3 minutos a CLI voltar e tenta de novo se ela falhar no meio da reinstalação.
  • A sessão OAuth vencida ("OAuth session expired") passa a ser reconhecida como logout, e a nota pede o /login em vez de uma dica genérica.
  • A dica de "Resumo indisponível" na nota diz o motivo e aponta para Reprocessar → Refazer o resumo. Antes, ela citava um caminho de pasta que deixava de existir quando a pasta era renomeada com o título da reunião.

✨ Ajustes visuais na capa

  • Em janela estreita, a versão no cabeçalho passava por baixo do botão Notas. Agora ela corta com reticências e mostra o texto inteiro ao passar o mouse.
  • O link "abrir" das pendências estava quase invisível no tema escuro.

Atualizar de qualquer 1.x é seguro.
Se alguma nota recente saiu sem resumo, clique com o botão direito na reunião → Reprocessar → Refazer o resumo.

📋 Mudanças completas

Funções novas

  • feat(resumo): aviso de claude CLI deslogado - banner vermelho na capa e toast (PR #213)

Correções

  • fix(resumo): espera o claude CLI voltar durante a atualizacao do Claude Code (PR #212)

Outros

  • ci: actions em Node 24 (checkout@v7, setup-python@v7, upload-artifact@v7) (PR #211)
  • chore: bump 1.4.23 (resumo espera o claude CLI se atualizar; aviso de claude deslogado)

Diff completo: v1.4.22...v1.4.23

v1.4.22 - Windows: calls voltam a ser detectadas; Teams calado não encerra a gravação

Choose a tag to compare

@allanrmartins allanrmartins released this 13 Oct 18:14

🪟 Windows: as calls voltam a ser detectadas (#207)

Desde as atualizações KB5124009 e KB5124010 do Windows 11 25H2 (setembro de 2026), o Windows parou de registrar quando um app usa o microfone.
O detector dependia só desse registro e deixou de perceber qualquer call: a gravação automática simplesmente não começava.

Agora o app lê direto as sessões de captura de áudio do Windows, a mesma informação que o mixer de volume usa.
Isso vale para qualquer versão do Windows, com ou sem essas atualizações, e o registro antigo fica só como reserva.
O scribadev doctor passa a juntar as duas fontes para dizer quais apps já usaram o microfone.

🎧 Teams: ficar calado na call não encerra mais a gravação

Em reunião grande, o Teams fecha o microfone por dentro quando você fica muito tempo calado ou mudo.
O detector entendia isso como fim da call e cortava a gravação no meio da reunião.

  • Com o microfone livre, mas a janela da call do Teams ainda aberta, a gravação continua. Quando você volta a falar, segue a mesma call, sem partir em duas.
  • Gravação iniciada à mão no ⏺ só termina no ■ (ou no × da pílula). Se o detector achar que a call acabou, um aviso aparece e a gravação continua.

🕒 Timesheet: sugestões de horas vindas de fora

O novo scribadev timesheet suggest deixa ferramentas externas, como o Claude Code, sugerirem apontamentos de horas por bloco de trabalho.
Reenviar o mesmo bloco atualiza a sugestão em vez de duplicar, e sugestão confirmada ou descartada não volta.
A aba Sugestões ganha as colunas Origem e OS, com destaque para o que está sem OS.

🔧 Estabilidade

  • O PySide6 fica abaixo da 6.12: a 6.12.0, lançada neste mês, derrubou o processo ao fechar nos testes das três plataformas. Assim nenhum update puxa essa versão (investigação em #209).
  • A janela "Quantas vozes?" para de se trazer para a frente a cada 2 s depois de respondida.

Atualizar de qualquer 1.x é seguro.
Na instalação pelo git, o update reinstala as dependências porque o pyproject.toml mudou; quem já estava no PySide6 6.12 volta para a 6.11.

📋 Mudanças completas

Funções novas

  • feat(timesheet): sugestoes de horas vindas do Claude Code (scribadev timesheet suggest) (PR #210)

Correções

  • fix(detector): calls voltam a ser detectadas no Windows (WASAPI) e Teams calado nao encerra a call (#207, PR #208)

Outros

  • chore: bump 1.4.22 (Windows: calls voltam a ser detectadas; Teams calado nao encerra a gravacao)

Diff completo: v1.4.21...v1.4.22

v1.4.21 - Mac: silêncio do mic não vira texto na ata; separação de vozes no Metal

Choose a tag to compare

@allanrmartins allanrmartins released this 18 Sep 20:30

🍎 Mac: o silêncio do microfone deixa de virar texto inventado na ata (#202)

No Apple Silicon a transcrição local roda pelo mlx-whisper, que não tem o filtro de voz (VAD Silero) que o faster-whisper aplica por dentro. O stream do microfone numa call em que você mais escuta do que fala é quase todo silêncio, e o Whisper preenchia essas janelas com frases que ninguém disse. No report do @FidelisMM, "A CIDADE NO BRASIL" entrou 17 vezes num microfone de 19,5 minutos com 2,7 minutos de fala, e 8 delas chegaram à ata e ao resumo por IA.

Agora o app detecta a fala com o mesmo Silero do faster-whisper antes de entregar o áudio ao modelo, transcreve só os trechos com voz e devolve os tempos ao relógio da gravação. Na gravação do report, o resultado foi zero inserções e a transcrição do microfone caiu de 17 s para 4 s, porque o modelo passou a ver 2,7 minutos em vez de 19,5. Um microfone sem fala nenhuma nem chega ao modelo.

  • Novo vad_filter no [whisper] do config.toml (padrão ligado, checkbox em Configurações → Transcrição → Avançado). Desligar manda o áudio inteiro ao modelo, só para depurar. Os ajustes vad_threshold e vad_min_silence_ms passam a valer no MLX também.
  • O scribadev doctor reporta o caminho efetivo da transcrição. Com o motor desviado para o faster-whisper, ele avisa que o Metal está instalado mas não está em uso, em vez de dizer "GPU (Metal/MLX)" só porque o pacote existe.

🍎 Mac: a separação de vozes roda na GPU do chip (Metal/MPS) (#203)

A separação de vozes só tinha o caminho CUDA e, no Mac, rodava inteira em CPU: nas medições do @FidelisMM num M5 Pro, cerca de 11 minutos para uma call de 20, contra 33 segundos da transcrição em Metal. Agora o pyannote vai para o Metal via MPS quando o PyTorch enxerga o backend.

Como o pyannote no Metal não tem a quilometragem do CUDA, há duas redes de segurança: um op sem kernel Metal cai na CPU em vez de derrubar o processamento, e se o Metal falhar logo no início a separação é refeita inteira em CPU, com o motivo no process.log. O doctor e a aba Sobre mostram em qual dispositivo a separação vai rodar. Ainda não há medição de tempo no Metal: a validação em gravações reais está combinada na issue.

Obrigado ao @FidelisMM pelos dois reports, com medições e a receita da correção.

Atualizar de qualquer 1.x é seguro. No Mac, quem tinha desviado o motor para cpu por causa do texto inventado pode voltar para local e recuperar o Metal.

📋 Mudanças completas

Funções novas

  • feat(diarizacao): separacao de vozes no Metal (MPS) do Apple Silicon, com fallback p/ CPU (#203) (#206)

Correções

  • fix(mlx): recorte de fala pelo VAD antes do mlx-whisper - silencio do mic nao vira texto inventado na ata (#202) (#204)

Outros

  • chore: bump 1.4.21 (Mac: silencio do mic nao vira texto na ata; separacao de vozes no Metal)

Diff completo: v1.4.20...v1.4.21

v1.4.20 - Separação de vozes funciona no app instalado

Choose a tag to compare

@allanrmartins allanrmartins released this 16 Sep 19:21

🎙️ Separação de vozes passa a funcionar no app instalado (Windows e macOS)

Quem instalou pelo instalador (setup.exe ou DMG) e baixou a separação de vozes nunca a viu rodar: no macOS aparecia dependências ausentes (No module named 'unittest.mock') (#197), e no Windows o processamento morria com partially initialized module 'torch' has no attribute 'autograd' (most likely due to a circular import) (#196). As duas têm a mesma causa. O torch e o pyannote são baixados sob demanda, fora do pacote do app, e importam em tempo de execução módulos que o empacotador não levava: o unittest.mock da biblioteca padrão e partes do scipy e do safetensors que entravam pela metade. Como a cópia do pacote vence a cópia completa baixada, a diarização nunca chegava a rodar. No Windows o primeiro erro ainda era engolido em silêncio ao liberar o Whisper, e o segundo import dava a mensagem enganosa de import circular.

O que muda:

  • O pacote leva a biblioteca padrão inteira, com submódulos, e o scipy e o safetensors inteiros quando presentes. O build agora falha na hora se algum desses módulos ficar de fora, em vez de a diarização morrer só na máquina de quem instalou.
  • A mensagem de erro diz a verdade: "falta o extra [diarization]" só quando o torch ou o pyannote não existem mesmo. Um import interno quebrado aparece como problema de instalação ou empacotamento, com a orientação de reinstalar os componentes, e o motivo real vai inteiro para o log.
  • scribadev components --check verifica se os componentes de voz importam neste app sem baixar nada. O scribadev doctor usa a mesma checagem, e o CI de release passa a instalar os componentes com o próprio executável congelado e a rodar essa checagem nos dois sistemas antes de publicar.

Obrigado ao @FidelisMM pelo diagnóstico detalhado da #197 e ao @rdaraujo pelo report da #196.

🔢 O número de vozes informado vale para reuniões longas (#198)

A pergunta "quantas vozes?" ao fim da call só tinha efeito em gravações de menos de 3 minutos: acima disso a separação roda em blocos e o número era descartado. Agora ele vale como teto por bloco e, no fim, as vozes reconhecidas entre os blocos são reduzidas ao número informado, fundindo as mais parecidas. Com uma voz só, a separação continua rodando, porque é ela que alimenta o cadastro de vozes.

Atualizar de qualquer 1.x é seguro. Quem já tinha baixado a separação de vozes no app instalado não precisa baixar de novo: basta instalar esta versão.

📋 Mudanças completas

Funções novas

  • feat(diarizacao): numero de vozes informado vale no caminho em blocos - teto por bloco + reducao das vozes globais ao N (#198) (#201)

Correções

  • fix(instalador): separacao de vozes nunca rodava no app instalado - stdlib sem submodulos e scipy/safetensors parciais no bundle (#196, #197) (#200)

Outros

  • chore: bump 1.4.20 (separacao de vozes funciona no app instalado; numero de vozes vale em reunioes longas)

Diff completo: v1.4.19...v1.4.20

v1.4.19 - Sentinela de travamento sem o watchdog em C do Python

Choose a tag to compare

@allanrmartins allanrmartins released this 11 Sep 16:28

🛡️ Sentinela de travamento sem o watchdog em C do Python

A sentinela que a v1.4.16 colocou dentro do processamento (#188) despeja as pilhas de todas as threads em hang.log quando o processo fica 8 minutos sem progresso, para um travamento na transcrição ou na separação de vozes chegar com diagnóstico. Ela usava o faulthandler.dump_traceback_later do Python, uma thread em C que lê os frames das outras threads sem o GIL. Investigando um job do CI que ficou 22 minutos pendurado no macOS (#194), a causa apareceu: no CPython 3.12 essa thread entra em loop infinito quando a thread principal está executando Python no instante do dump, e o cancelamento seguinte espera por ela para sempre. É um bug do próprio Python (python/cpython#140815), corrigido só no 3.13 e 3.14. Reproduzido em CI e confirmado com a pilha nativa do processo travado.

No app, o mesmo caminho existia: no macOS, um sinal de vida chegando no instante de um retrato podia pendurar o processamento até o watchdog do app encerrá-lo aos 20 minutos, e a reunião ficava sem nota.

A partir desta versão a sentinela é uma thread Python, no mesmo desenho do watchdog da interface: o sinal de vida vira só um timestamp, e o retrato sai com faulthandler.dump_traceback síncrono, com o GIL. Nenhuma outra thread mexe em frames enquanto ele lê. O hang.log continua igual (cabeçalho ao armar, um retrato a cada 8 minutos parado, nota de "processo seguiu"). O que se perde é o retrato de um travamento que segure o GIL em código C; nesse caso o watchdog do app continua encerrando o processamento, só sem as pilhas.

No macOS, 200 rodadas do teste da sentinela e 3 suítes completas passaram sem travar; o código antigo travou 2 vezes em menos de 120 rodadas.

Atualizar de qualquer 1.x é seguro.

📋 Mudanças completas

Correções

  • fix(idlewatch): sentinela em thread Python, sem o watchdog em C do faulthandler (#194) (#195)

Outros

  • chore: bump 1.4.19 (sentinela de travamento sem o watchdog em C do faulthandler)

Diff completo: v1.4.18...v1.4.19