Skip to content

Releases: amaurycarvalho/flowscope

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 20:43

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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 Feriados na GUI: árvore ano/mês/dia construída apenas do cache, textbox somente leitura, botão de atualização com view-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_pre para flowscope, 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) e atualizar feriados; MCP com tools calendario_* 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 maxdate do 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

Choose a tag to compare

@github-actions github-actions released this 25 Oct 02:42

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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_resumo estiver ligada, houver LLM configurada e a cobertura oficial do ticker estiver vazia ou parcial.
  • Estender flowscope resumir documentos para 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-fonte explícitos quando não houver fonte pública.
  • Adicionar AquisicaoTitulos como 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 FRE da CVM (outro_valor_mobiliario), tratando CRI/CRA pelo devedor econômico do lastro.
  • Complementar CRI/CRA com o INF_MENSAL_CRI/INF_MENSAL_CRA da 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/ativo para os direitos por título (CRI/CRA, LCI/LCA) e do INF_MENSAL/ativo_passivo para 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: InstrumentRegistration do 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

Choose a tag to compare

@github-actions github-actions released this 18 Oct 17:04

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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 documentos e flowscope atualizar noticias passam a usar a data de hoje quando --data não for informado, em vez da data de referência resolvida. --data continua tendo precedência.
  • flowscope resumir documentos passa a aceitar o ticker como argumento opcional: sem ticker, processa os pendentes de todos os tickers de last_tickers em uma única execução, com checagem única de LLM e sem abortar o lote quando um ticker falha.
  • O resultado de resumir documentos sem ticker passa a ser {"resultados": {<ticker>: <desfecho>}, "falha": <bool>}, com falha por ticker em {"erro": {"motivo": "falha_resumo", "detalhe": "..."}}, falha sempre 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 documentos sem ticker, sem percorrer a watchlist em shell; FLOWSCOPE_REFERENCE_DATE torna-se override opcional e, quando ausente, as atualizações usam a data de hoje no fuso do container.
  • Documentação de docs/misc/mcp.md e README.md atualizada 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

Choose a tag to compare

@github-actions github-actions released this 16 Oct 22:17

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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|noticias e flowscope resumir documentos|noticias.
  • Marcador last_fundamentals ({data, fetched_at}) em config.json, com resolução marcador → fallback last_date, escrito pela CLI e pela GUI ao carregar fundamentos.
  • Leitura consultiva da data de referência: nó /fundamentos/data-referencia na árvore de conhecimento, operação data_referencia no núcleo de navegação, tool MCP nav_data_referencia e comando flowscope 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 vwap e flowscope consultar proventos|fatos|noticias|regulacao, com saída em stdout ou em arquivo via --saida.

Changed

  • --output renomeado para --saida, disponível nos subcomandos de leitura; exportar vwap mantém o arquivo padrão vwap_<AAAA-MM-DD>.csv e aceita sobrescrita do nome.
  • Parâmetros escopados ao subcomando correto (--categoria só em consultar fatos, --palavra só em consultar noticias, datas apenas onde aplicáveis).
  • README.md, docs/misc/mcp.md e specs atualizadas para a nova superfície.

Removed

  • Flags planas de leitura --vwap, --structured-earnings, --fatos-relevantes, --noticias, --regulacao, --data-inicio, --data-fim, --output, --categoria e --palavra, sem aliases de compatibilidade.
  • Caminho standalone flowscope --tickers ARQUIVO.
  • Alias legado flowscope --mcp.

See CHANGELOG Archive for older releases.

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 16 Oct 18:34

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|noticias e flowscope resumir documentos|noticias.
  • Marcador last_fundamentals ({data, fetched_at}) em config.json, com resolução marcador → fallback last_date, escrito pela CLI e pela GUI ao carregar fundamentos.
  • Leitura consultiva da data de referência: nó /fundamentos/data-referencia na árvore de conhecimento, operação data_referencia no núcleo de navegação, tool MCP nav_data_referencia e comando flowscope 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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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, mantendo fundName para FII.
  • Helper único de download de arquivos (PDF/HTML) com validação de conteúdo (assinatura %PDF ou 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 None quando a API respondeu e não achou; falha de resolução (rede/HTTP) deixa de ser cacheada como ausência.
  • FNET: repetir em resposta 200 não-PDF e tratar o 403 intermitente como repetível; opção de resolver via visualizarDocumento → 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_job identificá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 no robots.txt.

Removed

  • Fallback empresas-listadas.csv removido, tornando a resolução ticker → codeCVM API-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.Z para FlowScopeBR vX.Y.Z.
  • Saída de --version da CLI passa a FlowScopeBR 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óricos docs/rfcs/, docs/adrs/ e CHANGELOG-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.json da nova chave last_ticker_file com 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, exibe Nova 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>.txt sem 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

Choose a tag to compare

@github-actions github-actions released this 14 Oct 18:21

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|noticias e flowscope resumir documentos|noticias.
  • Marcador last_fundamentals ({data, fetched_at}) em config.json, com resolução marcador → fallback last_date, escrito pela CLI e pela GUI ao carregar fundamentos.
  • Leitura consultiva da data de referência: nó /fundamentos/data-referencia na árvore de conhecimento, operação data_referencia no núcleo de navegação, tool MCP nav_data_referencia e comando flowscope 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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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

  • NavegacaoCore em application/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ão 2026-07-28, com server/discover, tools/list (sete tools nav_*) e tools/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

  • ProtocoloNavegacao passa a ser um adaptador fino sobre o NavegacaoCore, mantendo [RESULTADO_NAVEGACAO], foco e 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_CONTENT passa 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 body do TAB_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 e is_business_day), respeitando layer-boundaries.

Changed

  • infrastructure/b3/calendar.py e infrastructure/b3/holidays.py passam 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_date passa a usar is_business_day em vez de candidate.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

  • ResumirDocumentoUseCase passa a enviar as instruções em um system_prompt constante e o texto do documento como única mensagem user, cobrindo as sub-abas "Documentos" e "Notícias".
  • AvaliarGuidanceUseCase aplica o mesmo padrão: instruções em system_prompt constante e o trecho como mensagem user.
  • 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 sem R$, 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 em system/user.

See CHANGELOG Archive for older releases.

v1.3.7

Choose a tag to compare

@github-actions github-actions released this 13 Oct 18:52

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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 para flowscope-YYYY-MM-DD.log e 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.log ativo for de um dia anterior (app ficou fechado na virada), ele é renomeado para flowscope-YYYY-MM-DD.log antes 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 N dias são apagados (N = dias anteriores a hoje, padrão 7, 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/logs no 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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:45

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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 PARCIAL sem propagar exceção; o documento permanece pendente e o lote prossegue para o próximo.

Changed

  • Tolerância explícita a LimitReachedError por 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 como PARCIAL/FALHA, nunca SEM_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 ERROR ou acima do pypdf passam a ser gravados no flowscope.log (mesmo formato do app), permanecendo auditáveis e sem cair no stderr/console.

Changed

  • O logger pypdf (e filhos, como pypdf._reader e pypdf._cmap) passa a ter nível ERROR, suprimindo WARNING/INFO/DEBUG, tanto em _configure_logging quanto no processo filho da extração.
  • O módulo de caminhos de log sai de presentation para flowscope/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 para 4xx/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 deterministico por falha da IA não mantém o botão habilitado indefinidamente e volta a ser elegível quando a IA estiver funcional.
  • dateReference no formato DD/MM/AAAA HH:MM passa 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 21:22

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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 folhas curto, longo e texto do 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 texto integral 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/campos e /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 que buscar_semantico responder indice_indisponivel, e a preferir o nó indice/buscar a 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 NoticiasPanel com a assinatura de baixar_conteudo_vinculado, de modo que a senha opcional seja aceita sem TypeError.
  • 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 obter passa a aceitar offset/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 adicionais da 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 WARNING com 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 DISPLAY a lógica hoje presa ao widget: construção de Figure/Axes separada do invólucro Tk, decisões de mixins expostas como valores/funções puras e modelo de formulário separado dos StringVar no 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_presentation headless.
  • 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...

Read more

v1.3.4

Choose a tag to compare

@github-actions github-actions released this 08 Oct 23:05

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/DocumentSource e fontes concretas, com extração de texto (HTML e PDF).
  • Pipeline de indexação (IndexarDocumentosUseCase) e consulta RAG (ConsultarDocumentosUseCase) consumindo a porta LLMPort da llm-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.embedding e presets de provedores de embedding.
  • Dependência opcional fastembed no grupo [llm].
  • CLI --index <TICKER> com --data-inicio e --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-panel e noticias-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, CANCELADO e ABORTADO, 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 BaseException resultam em FALHA.
  • 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 com cancelado=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 (OK completo e SEM_TEXTO) são persistidos; PARCIAL, FALHA e PROTEGIDO não são gravados, permitindo nova tentativa.
  • Extração duplicada unificada: infrastructure/b3/bdr/text.extrair_texto passa a delegar ao extrator único, mantendo a assinatura bytes -> str.
  • Marcador de ausência (SEM_TEXTO/tem_texto) unificado em domain/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, ≤2 observaçõ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 TickerNotFound em vez de LayoutChanged; LayoutChanged fica reservado ao caso em que a página tem conteúdo parseável mas faltam os rótulos obrigatórios.
  • O CompositeFundamentalProvider registra TickerNotFound em INFO, sem traceback, e mantém WARNING com traceback apenas para LayoutChanged e NetworkError reais.
  • Ativos classificados como TipoAtivo.BDR sã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 ia e 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 adicionais passa a exibir o guidance da entrada com maior data_relatorio entre as avaliadas com resultado.
  • Migração do cache v1 (guidance único, sem origem) para uma entrada deterministico.

Removed

  • O flag llm.guidance.enabled e a exposição guidance_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...
Read more