Repository navigation
Releases: amaurycarvalho/flowscope
Release list
v1.7.0
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.7.0 - 2026-10-31
calendario-feriados-anbima Calendário ANBIMA como fonte única de feriados por ano, com cache, fallback, aba Feriados e correção da data local no botão "Hoje"
Added
- Adotar o calendário ANBIMA como fonte única de feriados por ano, com origem por feriado, normalização de datas/nomes, validação do dia da semana, cache em arquivo por ano, TTL por recência, cache negativo para ano futuro não publicado, fallback para cache anterior e modo degradado somente-fim-de-semana.
- Adicionar a aba
Feriadosna GUI: árvore ano/mês/dia construída apenas do cache, textbox somente leitura, botão de atualização comview-refresh/content-loading, atualização em background e seleção preservada.
Changed
- Recuperar e adaptar o subsistema de calendário já copiado: renomear
b3_selic_preparaflowscope, corrigir caminhos de cache, usar o lock/escrita atômica existentes e manter compatibilidade com Python 3.10. - Garantir o calendário do ano da data de referência antes das cargas, de forma best-effort: falha do calendário não bloqueia a carga principal, que segue com cache anterior ou apenas fim de semana.
- Resolver a data de referência para o dia útil anterior quando ela cair em fim de semana ou feriado. A amostragem existente continua avançando para o próximo dia útil, preservando o contrato de
sampling-strategy. - Expor consulta e exportação: CLI com
consultar feriados,exportar feriados(CSV/JSON) eatualizar feriados; MCP com toolscalendario_*somente-leitura e somente-cache, sem gravar arquivos. - Manter 24/12 e 31/12 como recesso local da B3, complementando a ANBIMA quando caem em dia de semana e não estão na página.
- Manter fora de escopo: a janela de evolução de 7/14/21/28 dias, por não ter consumidor no FlowScope atual.
Fixed
- Corrigir o botão "Hoje" e o
maxdatedo DateEntry para usarem a data local do processo, não UTC.
Removed
- Remover a lista estática de feriados e fiar a verificação de dia útil em uma porta de aplicação alimentada pelo cache do calendário.
See CHANGELOG Archive for older releases.
v1.6.0
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.6.0 - 2026-10-24
2026-10-24-inferir-direitos-obrigacoes-resumos Inferência opcional de direitos e obrigações no lote "Resumir pendentes", a partir dos resumos já persistidos, com cache por ticker, proveniência e precedência do dado oficial da CVM
Added
- Adicionar inferência opcional de "Direitos e obrigações" ao lote "Resumir pendentes", executada após o resumo dos documentos e antes da finalização.
Changed
- Usar como entrada os resumos longos já persistidos de Relatórios Gerenciais e Relatórios Mensais, sem reabrir PDFs nem reextrair texto.
- Persistir as inferências em cache separado por ticker, com proveniência do documento, trecho de evidência, confiança e versão do prompt; nunca sobrescrever os dados oficiais da CVM.
- Exibir os itens inferidos como nós distintos ("inferido pela IA") em Obrigações e Direitos, mantendo o dado oficial como autoritativo em caso de conflito.
- Habilitar a inferência apenas quando a flag
renda_fixa.inferir_no_resumoestiver ligada, houver LLM configurada e a cobertura oficial do ticker estiver vazia ou parcial. - Estender
flowscope resumir documentospara executar a mesma fase de inferência e reportar o desfecho no JSON. - Manter fora de escopo: inferência para ações, uso de texto integral de PDF na inferência, substituição de fontes oficiais e extração de eventos.
2026-10-24-titulos-renda-fixa Títulos de renda fixa (FRE, SECURIT CRI/CRA e carteira de FII) em Obrigações e Direitos, com aquisição idempotente, cache por ticker e navegação cache-only no Chat AI
Added
- Criar modelo de domínio e árvore de "Direitos e obrigações" com "Obrigações" e "Direitos", sub-ramo "Títulos", tipo do título e títulos individuais; usar nós agregados rotulados quando só houver total por ticker e nós
sem-fonteexplícitos quando não houver fonte pública. - Adicionar
AquisicaoTituloscomo serviço explícito, idempotente e cache-aware, acionado pelo mesmo botão "Atualizar" da sub-aba Documentos, internamente separado da aquisição de documentos.
Changed
- Ingerir títulos de renda fixa emitidos por companhias a partir do
FREda CVM (outro_valor_mobiliario), tratando CRI/CRA pelo devedor econômico do lastro. - Complementar CRI/CRA com o
INF_MENSAL_CRI/INF_MENSAL_CRAda CVM (SECURIT): emissor legal, devedor/cedente, garantias, subordinação, rating, situação, atrasos, contingências, impacto, desempenho e LTV. - Ingerir a carteira de FIIs a partir do
INF_TRIMESTRAL/ativopara os direitos por título (CRI/CRA, LCI/LCA) e doINF_MENSAL/ativo_passivopara os agregados de debêntures e CDB. - Expor, para cada título, "Informações gerais", "Informações adicionais", "LTV" (quando aplicável) e "Documentos relacionados", com resumo estruturado e links — sem extração por IA nesta change.
- Estender a árvore do Chat AI com os caminhos canônicos de Obrigações e Direitos, incluindo agregados e
sem-fonte, mantendo a navegação cache-only. - Manter fora de escopo:
InstrumentRegistrationdo BDI da B3 (fase 2), extração/sumarização de eventos por LLM e granularidade por título para CDB/LCI/LCA no lado Obrigações.
See CHANGELOG Archive for older releases.
v1.5.1
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.5.1 - 2026-10-18
facilitar-atualizacoes-container Atualizações sem --data usam a data de hoje e resumir documentos sem ticker processa toda a watchlist, simplificando o entrypoint do container MCP
Changed
flowscope atualizar fundamentos,flowscope atualizar documentoseflowscope atualizar noticiaspassam a usar a data de hoje quando--datanão for informado, em vez da data de referência resolvida.--datacontinua tendo precedência.flowscope resumir documentospassa a aceitar o ticker como argumento opcional: sem ticker, processa os pendentes de todos os tickers delast_tickersem uma única execução, com checagem única de LLM e sem abortar o lote quando um ticker falha.- O resultado de
resumir documentossem ticker passa a ser{"resultados": {<ticker>: <desfecho>}, "falha": <bool>}, com falha por ticker em{"erro": {"motivo": "falha_resumo", "detalhe": "..."}},falhasempre presente e código de saída 1 quando algum ticker falha; com ticker explícito, o formato atual é preservado. - O entrypoint de container passa a usar
flowscope resumir documentossem ticker, sem percorrer a watchlist em shell;FLOWSCOPE_REFERENCE_DATEtorna-se override opcional e, quando ausente, as atualizações usam a data de hoje no fuso do container. - Documentação de
docs/misc/mcp.mdeREADME.mdatualizada para o uso do MCP em container, as atualizações opcionais na inicialização, o novo default de data e o resumo de toda a watchlist.
See CHANGELOG Archive for older releases.
v1.5.0
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.5.0 — 2026-10-16
cli-acoes-atualizacao Subcomandos CLI de ação para agendamento externo (carregar watchlist, atualizar fundamentos/documentos/notícias e resumir pendentes), marcador de data de referência dos fundamentos e escrita concorrente segura
Added
- Novo grupo de subcomandos CLI de ação (
carregar,atualizar,resumir) para agendamento externo:flowscope carregar watchlist,flowscope atualizar fundamentos|documentos|noticiaseflowscope resumir documentos|noticias. - Marcador
last_fundamentals({data, fetched_at}) emconfig.json, com resoluçãomarcador → fallback last_date, escrito pela CLI e pela GUI ao carregar fundamentos. - Leitura consultiva da data de referência: nó
/fundamentos/data-referenciana árvore de conhecimento, operaçãodata_referenciano núcleo de navegação, tool MCPnav_data_referenciae comandoflowscope nav data-referencia. - Segurança de escrita concorrente: escrita atômica com temporário único, lock global de ação na CLI e participação da GUI no mesmo lock nas fases de escrita.
Changed
- Núcleo de composição neutro
montar_nucleo()reusado por GUI e CLI, e extração do núcleo do lote de resumos para a camada de aplicação.
reorganizar-cli-subcomandos Reorganização das flags de leitura da CLI em subcomandos exportar/consultar, remoção das flags planas e do alias --mcp
Added
- Subcomandos de leitura
flowscope exportar vwapeflowscope consultar proventos|fatos|noticias|regulacao, com saída emstdoutou em arquivo via--saida.
Changed
--outputrenomeado para--saida, disponível nos subcomandos de leitura;exportar vwapmantém o arquivo padrãovwap_<AAAA-MM-DD>.csve aceita sobrescrita do nome.- Parâmetros escopados ao subcomando correto (
--categoriasó emconsultar fatos,--palavrasó emconsultar noticias, datas apenas onde aplicáveis). README.md,docs/misc/mcp.mde specs atualizadas para a nova superfície.
Removed
- Flags planas de leitura
--vwap,--structured-earnings,--fatos-relevantes,--noticias,--regulacao,--data-inicio,--data-fim,--output,--categoriae--palavra, sem aliases de compatibilidade. - Caminho standalone
flowscope --tickers ARQUIVO. - Alias legado
flowscope --mcp.
See CHANGELOG Archive for older releases.
v1.4.1
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
cli-acoes-atualizacao Subcomandos CLI de ação para agendamento externo (carregar watchlist, atualizar fundamentos/documentos/notícias e resumir pendentes), marcador de data de referência dos fundamentos e escrita concorrente segura
Added
- Novo grupo de subcomandos CLI de ação (
carregar,atualizar,resumir) para agendamento externo:flowscope carregar watchlist,flowscope atualizar fundamentos|documentos|noticiaseflowscope resumir documentos|noticias. - Marcador
last_fundamentals({data, fetched_at}) emconfig.json, com resoluçãomarcador → fallback last_date, escrito pela CLI e pela GUI ao carregar fundamentos. - Leitura consultiva da data de referência: nó
/fundamentos/data-referenciana árvore de conhecimento, operaçãodata_referenciano núcleo de navegação, tool MCPnav_data_referenciae comandoflowscope nav data-referencia. - Segurança de escrita concorrente: escrita atômica com temporário único, lock global de ação na CLI e participação da GUI no mesmo lock nas fases de escrita.
Changed
- Núcleo de composição neutro
montar_nucleo()reusado por GUI e CLI, e extração do núcleo do lote de resumos para a camada de aplicação.
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.4.1 — 2026-10-16
fundamentos-e-downloads-resilientes Fundamentos no host coberto pelo certificado, identidade/nome da B3 como fallback, resolução CVM API-only e downloads compartilhados com validação de conteúdo e orçamento por item
Added
- Nome de exibição do ativo obtido da identidade B3 já existente (
GetInitialCompanies:companyName/tradingName) como fallback para ações/BDR, mantendofundNamepara FII. - Helper único de download de arquivos (PDF/HTML) com validação de conteúdo (assinatura
%PDFou HTML esperado) e orçamento total por item, aplicado a documentos relevantes, informe mensal, proventos/informe e documentos vinculados de notícias.
Changed
- Modo degradado visível: registrar por ticker a fonte/URL que falhou, em vez de varrer silenciosamente toda a cadeia de fallback.
- Só cachear
Nonequando a API respondeu e não achou; falha de resolução (rede/HTTP) deixa de ser cacheada como ausência. - FNET: repetir em resposta
200não-PDF e tratar o403intermitente como repetível; opção de resolver viavisualizarDocumento→iframe exibirDocumento. - rad.cvm: renovar token/sessão antes de repetir o POST
ExibirPDF, com backoff e validação%PDF. - Ausência de dados de negociação em dia não útil (feriado) tratada como ausência, sem requisição nem erro.
fundamental_jobidentificável no log do watchdog com o ticker em processamento.- Desfecho da aquisição distingue falha de "nada novo" em Documentos e, de forma consistente, em Notícias e Fundamentos.
Fixed
- Host do Fundamentus corrigido para o apex coberto pelo certificado (
fundamentus.com.br) nos três endpoints (detalhes,proventos,fii_proventos) e norobots.txt.
Removed
- Fallback
empresas-listadas.csvremovido, tornando a resoluçãoticker → codeCVMAPI-only. BREAKING (interno).
renomear-flowscopebr Nome exibido "FlowScope" renomeado para "FlowScopeBR" em título, aba "Sobre", chat/system prompts, CLI, atalho e documentação, preservando identificadores e caminhos internos
Changed
- Renomear "FlowScope" para "FlowScopeBR" em todos os textos visíveis: título da janela, aba "Sobre", textos e system prompts do chat de I.A., saída/ajuda da CLI, campo
Name=do atalho e documentação (README.md,docs/PRD.md,docs/misc/*.md). - Formato de nome+versão na aba "Sobre" passa de
FlowScope vX.Y.ZparaFlowScopeBR vX.Y.Z. - Saída de
--versionda CLI passa aFlowScopeBR vX.Y.Z. - Preservados deliberadamente
USER_AGENT, o nó/flowscope, nomes de classes/módulos, docstrings internas,~/.flowscope, o nome do pacote/binário e os registros históricosdocs/rfcs/,docs/adrs/eCHANGELOG-ARCHIVE.md.
titulo-watchlist-arquivo Título da janela com o nome-base do arquivo de watchlist e asterisco de alteração não salva, com persistência do caminho do último arquivo
Added
- Persistência em
~/.flowscope/config.jsonda nova chavelast_ticker_filecom o caminho completo do último arquivo de watchlist carregado ou salvo.
Changed
- Título da janela passa ao formato
FlowScopeBR v{versão} — <arquivo>[*], com<arquivo>= nome-base do arquivo e[*]quando o conteúdo foi editado e ainda não salvo; sem arquivo, exibeNova lista.txt. - Carregar um arquivo atualiza o título e guarda o caminho completo; Salvar atualiza o nome/caminho e remove o asterisco.
- Editar o conteúdo do watchlist (adicionar/remover tickers) marca alteração não salva; mudar seleção/filtro não marca.
- Clicar em IBOV/IDIV/IFIX exibe
<ÍNDICE>.txtsem asterisco e não persiste o nome. - Aposentado o requisito "Título dinâmico da janela" (data + N ativos, nunca implementado) e registrado o novo formato na spec
ui-polish.
See CHANGELOG Archive for older releases.
v1.4.0
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
cli-acoes-atualizacao Subcomandos CLI de ação para agendamento externo (carregar watchlist, atualizar fundamentos/documentos/notícias e resumir pendentes), marcador de data de referência dos fundamentos e escrita concorrente segura
Added
- Novo grupo de subcomandos CLI de ação (
carregar,atualizar,resumir) para agendamento externo:flowscope carregar watchlist,flowscope atualizar fundamentos|documentos|noticiaseflowscope resumir documentos|noticias. - Marcador
last_fundamentals({data, fetched_at}) emconfig.json, com resoluçãomarcador → fallback last_date, escrito pela CLI e pela GUI ao carregar fundamentos. - Leitura consultiva da data de referência: nó
/fundamentos/data-referenciana árvore de conhecimento, operaçãodata_referenciano núcleo de navegação, tool MCPnav_data_referenciae comandoflowscope nav data-referencia. - Segurança de escrita concorrente: escrita atômica com temporário único, lock global de ação na CLI e participação da GUI no mesmo lock nas fases de escrita.
Changed
- Núcleo de composição neutro
montar_nucleo()reusado por GUI e CLI, e extração do núcleo do lote de resumos para a camada de aplicação.
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.4.0 — 2026-10-14
navegacao-mcp Núcleo de navegação compartilhado, servidor MCP embutido (flowscope --mcp) e subcomandos flowscope nav ...
Added
NavegacaoCoreemapplication/navegacao/, com operações canônicas, limites centralizados, paginação por cursor opaco, erros estruturados e confinamento de leitura; reusado pelo chat, pela CLI e pelo MCP.- Servidor MCP stdio embutido iniciado por
flowscope --mcp, alvo da revisão2026-07-28, comserver/discover,tools/list(sete toolsnav_*) etools/call, sem dependência nova. - Subcomandos
flowscope nav listar|obter|contar|existe|buscar|buscar-semantico|manifesto, com saída JSON e--pretty. - Guia docs/misc/mcp.md e link no
README.md.
Changed
ProtocoloNavegacaopassa a ser um adaptador fino sobre oNavegacaoCore, mantendo[RESULTADO_NAVEGACAO],focoe o limite de 8 operações por turno; o reset permanece no loop do chat.- Listagens passam a ser ordenadas deterministicamente por caminho canônico.
orientacao-chat-arvore Orientação da aba "Chat AI" atualizada para descrever a árvore de conhecimento navegável, as origens de contexto como ramos, o protocolo de navegação da LLM e a leitura somente de cache
Changed
- O texto de orientação da aba "Chat AI" em
TAB_CONTENTpassa a descrever a árvore de conhecimento navegável (ramos de origem do contexto), o protocolo de navegação da LLM, os orçamentos e a leitura somente de cache. - Mantida a estrutura do
bodydoTAB_CONTENT(título e seções Objetivo, Responde a pergunta, Como usar, Contexto enviado, Como interpretar) e o enquadramento dos ramos disponíveis.
reposicao-datas-uteis-b3 Datas substitutas de amostragem restritas a dias úteis da B3, com o predicado de feriados centralizado no domínio e reusado pelo calendário
Added
- Predicado de dia útil da B3 centralizado no domínio (
domain/b3/calendario.py, com a lista de feriados nacionais eis_business_day), respeitandolayer-boundaries.
Changed
infrastructure/b3/calendar.pyeinfrastructure/b3/holidays.pypassam a consumir/reexportar a definição do domínio, eliminando a duplicação.- Testes unitários cobrindo a candidata em feriado pulada, a continuidade da busca e o resolvedor do calendário usando a mesma definição.
Fixed
_find_replacement_datepassa a usaris_business_dayem vez decandidate.weekday() >= 5, de modo que feriados nacionais nunca sejam consultados como data substituta.
resumo-guidance-system-prompt Instruções estáveis de resumo de documentos/notícias e de avaliação de guidance em system_prompt, com orçamento de caracteres compatível com a fórmula XYZ
Changed
ResumirDocumentoUseCasepassa a enviar as instruções em umsystem_promptconstante e o texto do documento como única mensagemuser, cobrindo as sub-abas "Documentos" e "Notícias".AvaliarGuidanceUseCaseaplica o mesmo padrão: instruções emsystem_promptconstante e o trecho como mensagemuser.- Ajustes pontuais de prompt incorporam à versão enxuta regras da versão detalhada (sem markdown/listas, nada antes de
CURTO:/LONGO:, fidelidade ao conteúdo, guidance vazio ⇒ saída vazia, valor único ⇒ mínimo = máximo, ponto decimal semR$, dúvida em guidance ⇒NAO). - Orçamento de caracteres compatível com o XYZ: tetos de salvaguarda do resumo elevados (curto 280 → 450, longo 1500 → 2000) e orçamento declarado no prompt (400 / 1800), sem cortar a conclusão.
docs/misc/llm-payloads.md(§1.1 e §1.5) atualizado com o payload separado emsystem/user.
See CHANGELOG Archive for older releases.
v1.3.7
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.3.7 — 2026-10-13
convencao-paths-relativos Standard de engenharia exigindo referências a arquivos do projeto por caminhos relativos à raiz, proibindo caminhos absolutos específicos da máquina
Added
- Adicionar um standard de engenharia exigindo que referências a arquivos do projeto usem caminhos relativos à raiz (ou resolvidos a partir de
__file__/configuração).
Changed
- Proibir caminhos absolutos específicos da máquina em código, testes, scripts e documentação.
- Estender a mesma regra a ferramentas de desenvolvimento e agentes que acessam arquivos do projeto.
finalizar-extracao-definitiva Confirmação ao término do lote para reprocessar ou marcar como definitivos os itens de extração não conclusiva (parcial, falha e PDF protegido), persistindo o texto definitivo com nota e gerando o resumo correspondente
Changed
- Ao término do lote, quando restarem itens não conclusivos (parcial + falha + protegido), o sistema informa a quantidade e pergunta se o usuário quer tentá-los novamente; em caso negativo, pergunta se quer marcá-los como definitivos.
- "Tentar novamente" reprocessa apenas os itens da lista; para os protegidos, a senha é pré-coletada (rota manual) antes do reprocessamento, e sem senha informada o item permanece pendente.
- "Marcar como definitivo" persiste o texto definitivo do item —
PARCIAL: o texto parcial acrescido de uma nota;FALHA/PROTEGIDO: apenas a nota — e gera o resumo citando a limitação: via LLM no parcial e determinístico (sem LLM) na falha e no protegido. A partir daí o item sai dos pendentes e não é mais reextraído no lote. - A nota de extração é embutida no próprio texto persistido, de modo que resumos futuros a citem (modifica o invariante do cache de texto, com exceção de finalização explícita).
- Escopo: extração parcial, falha crítica e PDF protegido. Ausência definitiva de texto (
SEM_TEXTO) e apontador de notícia "Geral" não resolvido ficam fora.
identificar-item-timeout-noticias Watchdog nomeia a notícia em processamento no encerramento por inatividade e a resolução do documento vinculado passa a respeitar o orçamento de extração por item
Added
- A extração de PDF passa a oferecer o caminho orçado a partir de bytes, para que o PDF baixado de um vínculo também respeite o orçamento.
Changed
- O watchdog de inatividade/liveness passa a registrar, no aviso de encerramento involuntário, a descrição do item em processamento, exposta pelo worker por um novo gancho (
JobContext.descrever) que não afeta a detecção de travamento. - O lote de resumos (e a finalização de extração) marcam o item corrente antes de cada extração/resumo, de modo que o aviso do watchdog identifique a notícia.
- A resolução do documento vinculado de notícias "Geral" passa a ser limitada pelo mesmo orçamento de extração por item (90s, escalável em retry), cobrindo as requisições de rede e o parse do PDF baixado; ao esgotar o orçamento, a notícia permanece pendente e o evento é registrado no log nomeando o item.
- Efeito: a duração de cada notícia fica abaixo do limite de inatividade e qualquer encerramento anormal (ou estouro de orçamento) nomeia o item.
logs-diarios-e-housekeeping Log diário datado com rolagem de arquivo obsoleto, housekeeping com retenção configurável, botão que abre a pasta de logs e warnings de extração parcial/sem texto
Changed
- Log diário: o arquivo ativo permanece
~/.flowscope/logs/flowscope.log; à meia-noite ele é rotacionado paraflowscope-YYYY-MM-DD.loge um novo arquivo ativo é aberto, de modo que cada dia corresponda a um arquivo datado. - Rolagem de arquivo obsoleto: na inicialização, se o
flowscope.logativo for de um dia anterior (app ficou fechado na virada), ele é renomeado paraflowscope-YYYY-MM-DD.logantes de abrir o handler diário, evitando misturar dias. - Housekeeping com retenção configurável: na inicialização da GUI, backups datados com mais de
Ndias são apagados (N= dias anteriores a hoje, padrão7, ou seja, mantém hoje + 7 anteriores);Né lido de~/.flowscope/config.json(log_retention_days), ajustável sem recompilar. - Botão de log abre a pasta: o botão "Abrir log da aplicação" passa a abrir o diretório
~/.flowscope/logsno aplicativo padrão, em vez de um arquivo específico; a mensagem de erro técnico do apresentador aponta para a pasta. - Warnings de extração: documentos das sub-abas "Documentos" e "Notícias" processados parcialmente (extração de texto) ou sem texto passam a registrar uma linha curta de
WARNING, identificando o documento por ticker e nome e, no caso parcial, a quantidade de páginas com falha.
See CHANGELOG Archive for older releases.
v1.3.6
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
1.3.6 — 2026-10-11
limite-tempo-extracao-pdf Orçamento de tempo de 90 s por documento na extração de PDF em subprocesso, preservando o texto parcial e sem bloquear o lote nem a pré-visualização
Added
- A extração de texto de cada PDF passa a rodar em processo separado com orçamento de 90 segundos por documento (abaixo do limite de inatividade do job de background).
- Ao estourar o orçamento, o resultado é o texto parcial já extraído, classificado como
PARCIALsem propagar exceção; o documento permanece pendente e o lote prossegue para o próximo.
Changed
- Tolerância explícita a
LimitReachedErrorpor página: a página é contabilizada como falha, as seguintes continuam sendo extraídas e o resultado éPARCIAL. - Documentos sem texto continuam sendo ausência definitiva (
SEM_TEXTO); estouro de orçamento e erro de limite classificam comoPARCIAL/FALHA, nuncaSEM_TEXTO. - O mesmo caminho limitado atende a pré-visualização sob demanda e a fase de preparação do lote de resumos em Documentos e Notícias; a extração de HTML permanece imediata, sem subprocesso.
- O ponto de entrada passa a chamar
multiprocessing.freeze_support()para o subprocesso funcionar no executável empacotado.
log-pypdf-controlado Controle do log da biblioteca pypdf na extração: WARNING/INFO/DEBUG suprimidos e ERROR ou acima gravado no flowscope.log, sem poluir o terminal
Added
- No processo filho da extração, registros de
ERRORou acima dopypdfpassam a ser gravados noflowscope.log(mesmo formato do app), permanecendo auditáveis e sem cair nostderr/console.
Changed
- O logger
pypdf(e filhos, comopypdf._readerepypdf._cmap) passa a ter nívelERROR, suprimindoWARNING/INFO/DEBUG, tanto em_configure_loggingquanto no processo filho da extração. - O módulo de caminhos de log sai de
presentationparaflowscope/log_paths.py, permitindo que a camada de aplicação referencie o arquivo de log do app sem violar as fronteiras de camadas.
politica-erros-http Política central de erros HTTP por status e motor de retry uniforme aplicado a todos os acessos de leitura/download
Added
- Classificador puro por código de status com quatro categorias (
PERMANENTE,THROTTLE,TRANSITORIO,GATEWAY) e regra de default para4xx/5xx. - Motor de retry central evoluído para honrar
Retry-After(com teto), aplicar backoff com jitter e oferecer gancho de cancelamento, repetindo apenas métodos idempotentes e POSTs read-only.
Changed
- Adoção do motor nos acessos de aquisição/download:
funds_client(JSON B3), fontes regulatórias, documento vinculado de notícias, PDF da CVM, corpo de notícias, BDR/B3Client, short interest e releases. - Exceções explícitas: probes de cache condicional e o provedor de LLM ficam fora da política comum; o endpoint de programas mantém o retry de 404 por override documentado.
- 403 passa a ser permanente (não repetido), inclusive onde antes era tratado como transitório.
resiliencia-cota-llm Interrupção do lote de resumo ao esgotar a cota do provedor de IA, com desfecho único na barra de status e registro conciso
Added
- Interrupção imediata do lote (inclusive o contínuo de Notícias) ao encontrar
LLMRateLimitError, preservando os resumos já gravados e mantendo os demais itens pendentes para nova tentativa.
Changed
- A falha de cota é reportada uma única vez na barra de status, distinguindo-a de falhas isoladas por item e orientando aguardar a renovação ou reconfigurar o provedor.
- A cota esgotada é registrada uma única vez em nível de aviso, sem traceback por item; as demais falhas transitórias mantêm o comportamento atual.
resumos-pendentes-e-downloads Pendência de resumo alinhada a ausência definitiva de texto, guidance e resumos truncados, com reuso de URL e data de referência interpretada
Added
- Registro por escopo (ticker para documentos; global para notícias) das URLs baixadas com sucesso, consultado antes do download para impedir nova tentativa.
Changed
- Documentos e notícias com texto conclusivamente vazio deixam de contar como pendentes; apontadores de notícia ainda não resolvidos continuam pendentes.
- Um Relatório Gerencial já resumido que permanece
deterministicopor falha da IA não mantém o botão habilitado indefinidamente e volta a ser elegível quando a IA estiver funcional. dateReferenceno formatoDD/MM/AAAA HH:MMpassa a ser interpretado (hora descartada), estabilizando o caminho de cache e evitando re-download.- A lista de pendentes de Notícias passa a regenerar resumos que não terminam em pontuação final, alinhando-se ao comportamento já existente em Documentos.
reuso-url-efetivo Registro da URL no descarte por duplicidade e reuso do arquivo canônico por essa URL, em documentos e notícias
Changed
- Quando o download tem sucesso mas o conteúdo é descartado por duplicidade exata, a URL passa a ser registrada apontando para o caminho relativo canônico.
- Uma URL já registrada (inclusive no descarte por duplicidade) reutiliza o arquivo canônico sem nova requisição, ainda que o caminho derivado (data/categoria/slug) seja diferente.
- O serviço de deduplicação passa a expor o caminho relativo canônico do conteúdo no descarte por duplicidade.
- O registro global de URLs de Notícias passa a ser populado também no descarte por duplicidade.
See CHANGELOG Archive for older releases.
v1.3.5
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
[1.3.5] — 2026-10-09
chat-navegacao-granular Granularidade por documento e foco de referência na árvore do Chat AI, com índices em /documentos e /guidance, playbook de intenção e manifesto com abas/sub-abas
Added
/documentos/<ticker>passa a expor/documentos/<ticker>/indice(uma linha por documento, mais recente primeiro) e um nó interno por documento (/documentos/<ticker>/<chave>) com folhascurto,longoetextodo próprio documento, além de metadados estruturados e pesquisáveis (categoria, período, nome)./guidance/<ticker>passa a expor/guidance/<ticker>/indice, agregando os guidances por mês com o rótulo do Relatório Gerencial associado.- O bloco de resultado da navegação passa a devolver um
foco(último caminho obtido) para resolver referências como "nesse RG"/"esse último". - O protocolo/manifesto ganham um playbook de intenção→ramo e a regra de preferir o
textointegral do documento-alvo a resumos agregados quando a pergunta pede detalhe.
Changed
- O manifesto passa a anunciar
/flowscope/abas/<aba>e a lista de sub-abas, e deixa de incluir metadados longos (teto por metadado).
chat-navegacao-robusta Ramos internos vazios omitidos da árvore do Chat AI, manifesto anunciando apenas ramos existentes e fallback para busca determinística por regex
Changed
- Ramos internos sem itens são omitidos da árvore de conhecimento em vez de existirem como folhas vazias:
/flowscope/abas,/flowscope/indicadores,/fundamentos/tickers,/fundamentos/campose/fundamentos/valores. - O mapa canônico e a descrição do manifesto passam a anunciar apenas os ramos existentes na árvore corrente (deixa de citar caminhos inexistentes).
- O protocolo/manifesto e o prompt de sistema passam a orientar a LLM a usar a busca determinística
buscar(caminho, regex, em=[...])sempre quebuscar_semanticoresponderindice_indisponivel, e a preferir o nóindice/buscara listar grupos grandes inteiros.
corrigir-assinatura-vinculo-noticias Corrige o TypeError na resolução de documento vinculado de notícias, alinhando a chamada do painel à assinatura de baixar_conteudo_vinculado
Added
- Testes que exercitam a assinatura real do resolvedor usado em produção (
baixar_conteudo_vinculado), impedindo que dublês com assinatura divergente escondam a regressão.
Fixed
- Alinhamento do contrato de chamada do resolvedor de documento vinculado injetado no
NoticiasPanelcom a assinatura debaixar_conteudo_vinculado, de modo que a senha opcional seja aceita semTypeError. - Uma falha do resolvedor (assinatura, rede ou formato) passa a degradar para o corpo original, sem propagar exceção para a pré-visualização nem para o lote.
documentos-arvore-ramos Árvore de documentos com ramos Guidance e Direitos e obrigações, navegação de guidance no chat e remontagem após o lote de resumos
Added
- Ramo Guidance (somente FII, com base nos documentos
Relatorio): sub-ramos ano e mês, com uma folha por guidance que possui valor em cache; clicar exibe o texto do guidance e o rótulo curado do RG, e duplo-clique salta para a folha do RG na ramificação Documentos. - Ramo Direitos e obrigações com os sub-ramos "Direitos" (ativos) e "Obrigações" (passivos), vazios por enquanto, preenchidos por changes futuras.
- Ao entrar na sub-aba pela primeira vez na sessão (ou ao mudar o ticker), a árvore fica expandida apenas até o primeiro nível.
- A árvore de conhecimento da aba "Chat AI" ganha navegação para o guidance e para "Direitos e obrigações", com os caminhos canônicos refletidos no manifesto e na assinatura de estado.
- Após "Resumir pendentes", a árvore é remontada (sub-abas "Documentos" e "Notícias"), preservando o arquivo selecionado.
Changed
- A árvore da sub-aba "Documentos" passa a ter, sob o nome do ticker, três ramos: Guidance, Documentos e Direitos e obrigações.
documentos-conteudo-completo Resumos de documentos cortados em fronteira de frase/palavra, regeneração de resumos truncados e leitura paginada do texto integral
Added
- Resumos já em cache que terminam no meio da palavra passam a ser regenerados pelo lote "Resumir pendentes", sem exigir limpeza manual.
- A operação
obterpassa a aceitaroffset/limite(leitura paginada) para o texto integral, e o manifesto/playbook orientam a leitura em partes quando o texto for longo.
Changed
- O resumo de documento passa a cortar em fronteira de frase/palavra (nunca no meio da palavra) e o prompt pede os resumos por frases/parágrafos, mantendo os tetos como salvaguarda.
guidance-preview-rg Guidance do próprio Relatório Gerencial exibido na pré-visualização de documentos e avaliação de RGs já resumidos pendentes de guidance no lote
Added
- A pré-visualização de um RG com guidance passa a exibir o texto do guidance entre o resumo e o separador
---, com uma linha em branco antes e depois. - O botão "Resumir pendentes" passa a ser habilitado, com a IA ativa, também quando houver Relatórios Gerenciais já resumidos cuja avaliação de guidance esteja pendente, mesmo sem documento sem
long_summary. - O lote passa a avaliar o guidance desses RGs pendentes, pulando a geração de resumo dos que já o possuem e reaproveitando resumos e texto em cache.
Changed
- O texto exibido é o guidance do RG específico (entrada do ledger daquele documento), formatado exatamente como na coluna
Informações adicionaisda sub-aba "Fundamentos". - A formatação do item de guidance é extraída para uma função compartilhada, reusada pela coluna e pela pré-visualização.
- A verificação de pendências de guidance consulta o ledger fora da thread do Tk, no mesmo worker que lê o catálogo.
logging-falhas-comunicacao Falhas de comunicação toleradas registradas em uma linha de WARNING sem traceback
Changed
- Convenção: em falha de comunicação tolerada, registrar uma linha de
WARNINGcom o tipo e a mensagem da exceção, sem traceback; exceções não relacionadas a comunicação continuam com traceback. - A convenção é implementada de forma central no formatter de logging da aplicação, cobrindo todos os pontos de aquisição sem alterar os 60+ call sites.
- Os registros em memória (
record.exc_info) são preservados para testes e depuração; apenas a renderização passa a omitir o traceback de comunicação. - O tratamento explícito já existente em
noticias_vinculo.pyé mantido.
testes-ui-headless Costuras testáveis na apresentação e conversão de testes gated para headless, reduzindo o orçamento de testes de UI
Added
- Costuras testáveis na apresentação para verificar sem
DISPLAYa lógica hoje presa ao widget: construção deFigure/Axesseparada do invólucro Tk, decisões de mixins expostas como valores/funções puras e modelo de formulário separado dosStringVarno diálogo de configuração de LLM.
Changed
- As declarações gated correspondentes passam a rodar headless, preservando a asserção de comportamento observável (paridade de textos, números e ordem).
- A lógica pura hoje coberta sob gate de display migra para
tests/test_application/tests/test_presentationheadless. - O baseline
tests/architecture/ui_test_budget.txté baixado após cada incremento (o ratchet exige atualização explícita). - Fica sob teste de UI apenas o que só existe com Tk: layout/geometria, eventos de ponteiro,
Treeview/notebooks reais,ReadonlyText/clipboard, overlay/modal e o binding fio-a-fio do estado aos widgets.
tooltip-robusto Tooltips deixam de ficar presos na te...
v1.3.4
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
diagnosis-panel Painel "Diagnóstico" substitui o placeholder "Resumo Geral" com classificação qualitativa por eixos independentes e novos classificadores de liquidez e institucional
eficiencia-do-movimento Painel "Eficiência do Movimento" com gauge horizontal, card qualitativo e timeline de barras para os últimos 15 pregões
llm-chat-rag Recuperação vetorial como evolução da llm-chat, com VectorStore SQLite, embeddings e indexação de documentos consultada pela aba "Chat AI"
Added
- VectorStore em SQLite puro, com busca top-k por cosine similarity e filtro opcional por ticker.
- Módulo de embeddings com dois provedores:
fastembed(local, default) e liteLLM (API). - Porta
DocumentoIndexavel/DocumentSourcee fontes concretas, com extração de texto (HTML e PDF). - Pipeline de indexação (
IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a portaLLMPortdallm-core. - Integração da consulta RAG à aba "Chat AI" como fonte adicional de contexto, pelo ponto de extensão da
llm-chat. - Chunker de texto em Python puro.
- Configuração de embedding persistida em
llm.embeddinge presets de provedores de embedding. - Dependência opcional
fastembedno grupo[llm]. - CLI
--index <TICKER>com--data-inicioe--data-fim.
participation-negociacoes Painel "Participação nas Negociações" renomeado, com gauge de concentração, card informativo e timeline AFT
[1.3.4] — 2026-10-08
deduplicacao-por-hash Deduplicação por SHA-256 do conteúdo bruto de documentos e notícias, mantendo apenas o registro mais antigo e podando os derivados do item descartado
Added
- Cálculo de SHA-256 do conteúdo bruto de cada documento/notícia baixado e verificação contra um registro de hashes antes de persistir.
- Regra "primeiro hash registrado vence": em colisão exata de conteúdo, o arquivo recém-baixado e o seu registro são descartados; o existente permanece.
- Escopo do registro por ticker para documentos (compartilhado entre as três raízes —
bdr/,informe-mensal/,documentos-relevantes/) e único global para notícias (NOTICIAS), deduplicando inclusive entre seções. - Poda dos derivados do item descartado: resumo, texto e, para notícias, a entrada do
index.json. - Housekeeping no "Atualizar": varredura cronológica dos arquivos em cache sem hash, aplicando a mesma regra para eliminar duplicatas legadas.
- Guarda de conteúdo: corpos vazios, apenas espaços ou abaixo de um piso mínimo não entram no registro.
- Validação do canônico: se o arquivo canônico de um hash não existe mais, a entrada é descartada e o novo arquivo passa a ser registrado.
Changed
- Hook de download em todas as vias (documentos relevantes, informe mensal, avisos de BDR e notícias) passa a verificar o hash antes de persistir.
documentos-ticker-panelenoticias-panel: o botão "Atualizar" passa a executar, além da aquisição, o housekeeping de deduplicação por conteúdo.
desfecho-termino-status Desfecho terminal explícito no ciclo de vida dos jobs (SUCESSO/FALHA/CANCELADO/ABORTADO), com rede de segurança de status e mensagens de conclusão honestas
Added
- Desfecho terminal explícito no ciclo de vida do job:
SUCESSO,FALHA,CANCELADOeABORTADO, carregado pelo evento de término. - O desfecho é declarado pelo worker (que sabe se recuperou falhas) e tem default por exceção que escapa; exceção não tratada e
BaseExceptionresultam emFALHA. - Rede de segurança de status: falha fatal que não teve callback de erro consumidor produz mensagem genérica de falha, em vez de "Pronto.".
- Fallback de falha na pré-visualização de documento/notícia, que não fica mais presa em "Carregando…".
Changed
- Separação entre cancelamento do usuário (
CANCELADO) e encerramento involuntário pelo watchdog (ABORTADO), que antes terminavam ambos comcancelado=True. - BREAKING (interno): removida a dependência do token global
presenter._cancel_token; o desfecho passa a ser a única autoridade sobre a mensagem.
Fixed
- A mensagem de conclusão de aquisição de documentos/notícias não afirma mais atualização quando nada foi adquirido.
extracao-pdf-resiliente Extração de texto de PDF resiliente com status tipado, tolerância por página, senha vazia automática e senha interativa opcional
Added
- Extrator de PDF único e resiliente na camada de aplicação, com resultado tipado (
OK,PARCIAL,SEM_TEXTO,FALHA,PROTEGIDO) e tolerância por página. - Tentativa automática de
decrypt("")para PDFs criptografados antes de marcá-los como protegidos. - Extração autenticada opcional por senha, para o fluxo interativo.
- Diálogo de senha no preview interativo de Documentos e do documento vinculado das Notícias, com limite de 3 tentativas por documento/seleção; o texto obtido é cacheado e a senha nunca é persistida, e o fluxo em lote nunca abre diálogo.
- Anotação do texto parcial e retentativa automática da extração ao re-selecionar o documento ou ao processar "Resumir pendentes".
Changed
- Semântica de cache: apenas resultados definitivos (
OKcompleto eSEM_TEXTO) são persistidos;PARCIAL,FALHAePROTEGIDOnão são gravados, permitindo nova tentativa. - Extração duplicada unificada:
infrastructure/b3/bdr/text.extrair_textopassa a delegar ao extrator único, mantendo a assinaturabytes -> str. - Marcador de ausência (
SEM_TEXTO/tem_texto) unificado emdomain/documents/texto.py, com re-export para os importadores atuais.
filtros-evolucao-fundamentos Evolução dos Fundamentos passa a montar as séries conforme o período (30/60/90 dias) e o método de amostragem selecionados na barra superior
Changed
- A Evolução dos Fundamentos passa a montar as séries a partir do período (30/60/90 dias) e do método de amostragem selecionados nos comboboxes da barra superior.
- A janela é ancorada na data de referência atual; sem observações nela, a âncora recua para a observação mais recente do cache, sem aquisição de rede.
- Cada método (Fibonacci, Fibonacci reverso, Fibonacci duplo, Monte Carlo, Monte Carlo duplo, Todos os dias) seleciona um subconjunto das observações da janela, preservando extremos,
≤2observações, ordem crescente e sem duplicatas. - BREAKING (spec-level): o requisito "Amostragem Fibonacci das datas" deixa de ser fixo e passa a depender da configuração selecionada; novo requisito de janela de período.
- Monte Carlo passa a ter amostra determinística por
(ticker, janela, método, n), para o gráfico não "pular" a cada render. - Mudar qualquer um dos comboboxes re-renderiza o painel mesmo sem dados B3 carregados, e o título do painel passa a informar as datas exibidas em relação ao total do período.
fundamentus-erros-e-bdr Classificação correta de erros do Fundamentus (TickerNotFound × LayoutChanged) e consulta ao portal pulada para BDRs
Changed
- Quando a página do Fundamentus não traz conteúdo utilizável (tabela/linhas vazias), o parser passa a sinalizar
TickerNotFoundem vez deLayoutChanged;LayoutChangedfica reservado ao caso em que a página tem conteúdo parseável mas faltam os rótulos obrigatórios. - O
CompositeFundamentalProviderregistraTickerNotFoundemINFO, sem traceback, e mantémWARNINGcom traceback apenas paraLayoutChangedeNetworkErrorreais. - Ativos classificados como
TipoAtivo.BDRsão pulados pela fonte Fundamentus nos compostos de campos fundamentalistas e de FFO, sem chamada de rede; dividendos permanecem inalterados.
guidance-avaliacao-por-rg Avaliação de guidance por Relatório Gerencial em ledger por hash, com IA prevalecente, cascata de fontes e fim do portão de data
Changed
- O cache de guidance por FII passa a ser um ledger por RG (chave = hash SHA-256 do PDF), registrando o método (
ia/deterministico) e o resultado (guidance ou ausência avaliada). - A avaliação deixa de ter portão de data: todo RG processado é avaliado uma vez por método, exceto em falha na interação com a IA, que não grava
iae mantém o RG elegível a nova tentativa. - A IA prevalece sobre o determinístico por RG; um resultado de IA sobrescreve a entrada determinística do mesmo RG.
- A avaliação segue a cascata resumo curto → resumo longo → texto extraído, parando na primeira fonte com guidance; sem nenhuma delas, registra ausência para aquele RG.
- A disponibilidade da IA passa a ser "provedor de chat configurado".
- O campo
Informações adicionaispassa a exibir o guidance da entrada com maiordata_relatorioentre as avaliadas com resultado. - Migração do cache v1 (guidance único, sem origem) para uma entrada
deterministico.
Removed
- O flag
llm.guidance.enablede a exposiçãoguidance_llm_disponivel.
llm-retry-transitorio Retry com backoff exponencial e jitter no adaptador liteLLM, repetindo apenas erros transitórios e contando as tentativas no rate limiter
Added
- Retry com backoff exponencial e jitter no
LiteLLMChatAdapter.complete, repetindo apenas erros transitórios (LLMServiceUnavailableError,LLMRateLimitError,LLMCommunicationError). - Propagação imedi...