Skip to content

Review técnica e de produto: arquitetura, UX, riscos operacionais e prioridades de evolução #3

@joaompfp

Description

@joaompfp

Sumário executivo

O Prumo já apresenta uma proposta de valor clara e diferenciada: um dashboard socioeconómico com dados oficiais, exploração quantitativa, comparativos internacionais e uma camada explícita de análise editorial assistida por LLM. No estado atual, o projeto está acima do nível de protótipo casual e já evidencia uma arquitetura conscientemente desenhada para simplicidade operacional e clareza conceptual. O repositório documenta uma stack baseada em FastAPI + DuckDB + ECharts, com separação entre aplicação, coletores, serviços, templates, frontend JS e testes.

A aplicação publicada comunica bem a proposta: "9 fontes oficiais", "368 indicadores" e "análise IA com enquadramento editorial transparente", incluindo explicação metodológica sobre o uso de lentes editoriais e a composição de fontes em indicadores comparativos.

A avaliação global é positiva, mas há uma assimetria importante: a força conceptual da app está ligeiramente à frente da sua maturidade de produto. Em particular, a experiência inicial depende muito da carga assíncrona por JavaScript, o que se traduz em múltiplos estados "A carregar…" na shell pública, e o próprio site declara que requer JavaScript para carregar dados e gráficos. Isso não invalida a arquitetura; apenas indica que a robustez percebida pelo utilizador ainda depende demasiado da qualidade dos estados intermédios, da tolerância a falhas e da comunicação contextual da interface.

Em síntese:

  • Conceito / posicionamento: forte
  • Arquitetura atual: adequada e sensata para a fase presente
  • UX pública: promissora, mas ainda com sinais de shell-first / content-later
  • Escalabilidade operacional: suficiente para a fase atual, limitada por opção de desenho
  • Risco principal: ambiguidade entre dado, transformação e interpretação editorial

Pontos fortes

1. Proposta editorial e epistemológica clara

O produto não tenta simular neutralidade artificial. Pelo contrário: declara explicitamente que a análise IA parte de dados oficiais e de um enquadramento editorial explícito, com possibilidade de escolher a lente política. Essa transparência é uma vantagem competitiva real e reduz um problema frequente em produtos com LLM: a opacidade da camada interpretativa.

2. Stack tecnicamente adequada ao problema

O README descreve uma arquitetura simples e bem alinhada com o caso de uso: FastAPI para serving HTTP, DuckDB para consulta analítica local, Jinja2 para shell inicial e ECharts no frontend. A estrutura do repositório sugere uma decomposição lógica saudável entre app/, collectors/, static/, templates/, tests/ e documentação de suporte.

3. Separação razoável de responsabilidades

A árvore documentada distingue:

  • rotas (app/routes/),
  • lógica de negócio por secção (app/services/),
  • constantes e mappings,
  • coletores por fonte,
  • frontend modular por secção (static/js/sections/).

Isto indica um projeto que já foi pensado para manutenção incremental e não apenas para entrega rápida.

4. Cobertura de fontes e densidade do catálogo

A app publicada anuncia 9 fontes oficiais e 368 indicadores, enquanto a metodologia refere mais de 350 indicadores cobrindo 54 países, com séries desde 1960. Esta amplitude é relevante porque transforma o produto num verdadeiro data layer reutilizável, não apenas numa visualização estática.

5. Honestidade metodológica nos indicadores compostos

A documentação pública da metodologia explica claramente como são fundidas fontes para maximizar cobertura geográfica, explicitando que para UE-27 se usa Eurostat e para fora da UE se usa Banco Mundial, sem interpolação nem mistura de frequências dentro do mesmo país. Isto é metodologicamente saudável e muito importante para a confiança do utilizador.


Principais fragilidades

1. Excesso de dependência de carregamento assíncrono no estado inicial

Na página publicada, vários blocos aparecem inicialmente como "A carregar indicadores…", "A carregar comparação…", "A carregar catálogo…" e "A carregar ficha técnica…". Mesmo que isto seja tecnicamente normal numa SPA, a consequência de produto é clara: a aplicação pode parecer lenta, frágil ou incompleta antes de provar o seu valor.

Impacto:

  • pior primeira impressão,
  • menor confiança em contexto mobile ou redes lentas,
  • dificuldade em distinguir entre "está a carregar" e "algo falhou".

2. Separação insuficientemente operacional entre dado, transformação e interpretação

A metodologia explica bem a existência destas camadas, mas a interface ainda não parece fazer essa distinção de forma suficientemente explícita no fluxo principal. O utilizador devia conseguir identificar de imediato:

  • o que é dado oficial,
  • o que é tratamento/composição/harmonização,
  • o que é interpretação gerada.

Hoje, essa distinção existe mais como texto explicativo do que como gramática de produto.

3. Modelo operacional orientado a simplicidade, mas com teto de crescimento

O README descreve explicitamente peças como api.js com cache de 5 minutos e app.js com lazy loading por secção. Isto é aceitável e até desejável na fase atual. Mas também indica uma arquitetura ainda muito centrada em:

  • frontend como principal amortecedor de performance,
  • backend simples e provavelmente pouco instrumentado,
  • runtime adequado a tráfego moderado e casos previsíveis.

4. Risco de leitura pública equivocada do posicionamento

O produto vive numa intersecção rara: dashboard factual + camada editorial assumida. Isso é intelectualmente interessante, mas também vulnerável a más leituras. Sem reforço semântico e visual, parte dos utilizadores pode interpretar a plataforma como opinativa demais para ser "ferramenta de dados", enquanto outros a verão como técnica demais para ser media/editorial.


Observações por área

Arquitetura

O que está bem

A árvore do projeto é limpa e autoexplicativa. O README documenta com suficiente granularidade o papel de cada módulo principal, o que acelera onboarding e reduz ambiguidade para contribuidores externos.

O que merece atenção

À medida que o produto crescer, o risco principal não será "tecnologia errada", mas sim acumulação de lógica transversal dispersa entre frontend, serviços e camada de conteúdo. Em especial, qualquer lógica de:

  • normalização de unidades,
  • composição de séries,
  • construção de payloads para análise,
  • regras de fallback,
  • política de cache,

precisa de permanecer nitidamente separada para evitar que a app se torne difícil de testar e evoluir.

Recomendação

Formalizar melhor as fronteiras de domínio:

  • data retrieval
  • series transformation
  • presentation shaping
  • analysis generation

Mesmo que a implementação atual já siga parte desta estrutura, vale a pena reforçá-la documentalmente e nos testes.


Frontend / UX

O que está bem

A navegação principal do site é simples e clara: Painel, Comparativos, Análise, Metodologia e Ajuda. A proposta editorial surge logo no hero e o utilizador percebe rapidamente o tema da plataforma.

O que merece atenção

Os estados de loading são demasiado genéricos e numerosos. A aplicação publicada evidencia placeholders textuais repetidos em várias secções. Isto transmite uma sensação de shell incompleta em vez de sistema controlado.

Recomendações

  1. Trocar placeholders genéricos por skeleton states específicos por secção.
  2. Incluir timestamp do último refresh perto de cada bloco relevante.
  3. Separar claramente os estados:
    • loading,
    • empty,
    • partial,
    • stale,
    • failed.
  4. Em caso de falha, devolver mensagem operacional explícita: fonte, endpoint, retry e fallback.
  5. Garantir que a secção de ficha técnica não se apresente ao utilizador como "vazia a carregar" por demasiado tempo.

Backend / serviços

O que está bem

O uso de serviços por domínio (resumo.py, macro.py, energia.py, series.py, analysis.py, briefing.py, etc.) é uma opção boa. A existência de módulos especializados reduz o risco de um único backend monolítico e favorece testes direcionados.

O que merece atenção

Os serviços ligados à análise e ao briefing são, por natureza, os mais sensíveis do sistema. São também aqueles onde a fronteira entre "facto calculado" e "copy gerada" precisa de estar melhor auditada.

Recomendações

  1. Introduzir uma noção explícita de artefacto de análise com metadados:
    • fontes usadas,
    • séries usadas,
    • timestamp,
    • lente aplicada,
    • versão do prompt/template,
    • versão do modelo.
  2. Separar mais nitidamente:
    • cálculo factual,
    • seleção de evidência,
    • geração de narrativa.
  3. Adicionar testes que assegurem que a geração textual nunca mascara ausência de dado, baixa cobertura ou defasagem temporal.

Dados / metodologia

O que está bem

A secção metodológica pública é um dos grandes ativos do projeto. Explica:

  • origem dos dados,
  • papel da lente editorial,
  • composição de indicadores,
  • diferenças de frequência entre fontes.

O que merece atenção

Quanto mais o projeto crescer, menos bastará uma boa página de metodologia. Será necessário que a própria interface trate esses metadados como entidades de primeira classe.

Recomendações

  1. Cada gráfico e cada insight relevante devem expor, de forma simples:
    • fonte,
    • período,
    • frequência,
    • cobertura,
    • se é indicador composto,
    • se há atraso conhecido da série.
  2. Tornar os indicadores compostos visualmente distintos dos indicadores de fonte única.
  3. Nos comparativos, indicar claramente quando países não são diretamente comparáveis no mesmo timestamp devido à defasagem das fontes.

Conteúdo / camada LLM

O que está bem

A decisão de tornar a lente editorial explícita é, na minha leitura, correta. Isso transforma um potencial passivo de confiança num elemento de diferenciação.

O que merece atenção

Esta camada é também a mais exigente do ponto de vista de governança. Não basta dizer que a lente existe; é necessário garantir que o produto nunca deixa dúvidas sobre onde termina o dado e onde começa a interpretação.

Recomendações

  1. Introduzir badges ou labels persistentes do tipo:
    • Dado oficial
    • Indicador composto
    • Análise editorial IA
  2. Permitir ver facilmente o "modo factual" e o "modo interpretativo".
  3. Documentar melhor as salvaguardas contra:
    • extrapolação indevida,
    • narrativa com cobertura insuficiente,
    • linguagem excessivamente assertiva quando os dados são ambíguos.

Performance / operação

O que está bem

A opção por DuckDB e frontend com cache faz sentido para uma aplicação pública de leitura analítica e baixo overhead operacional. O projeto não parece sobre-engenhado.

O que merece atenção

O principal risco aqui não é throughput absoluto, mas sim observabilidade insuficiente. Sem métricas, o produto pode degradar-se de forma silenciosa.

Recomendações

  1. Adicionar métricas por endpoint:
    • latência,
    • taxa de erro,
    • volume de requests,
    • taxa de cache hit/miss.
  2. Registar falhas por secção do frontend.
  3. Medir tempo até conteúdo útil por secção, não apenas tempo total da página.
  4. Ter pelo menos um health/report que valide:
    • frescura das fontes,
    • integridade mínima do catálogo,
    • consistência de unidades e períodos.

Segurança / exposição pública

Observação

Pelo desenho documentado, a app é uma plataforma pública de dados, o que reduz a superfície clássica de risco de autenticação. Ainda assim, a camada LLM e os coletores tornam importante proteger:

  • segredos de APIs,
  • rate limits,
  • sanitização de inputs de exploração,
  • controlo de payloads anómalos.

Recomendações

  1. Rever cuidadosamente limites de input no explorador e endpoints comparativos.
  2. Garantir que prompts/templates nunca recebem campos arbitrários sem validação.
  3. Formalizar uma checklist mínima de hardening operacional no README ou docs.

Prioridades recomendadas

P0 — Alta prioridade

1. Melhorar estados de loading / erro / vazio

Razão: impacto direto na credibilidade da app publicada.

2. Tornar a separação entre dado, transformação e análise visível na UI

Razão: é a principal condição para confiança e para evitar leituras erradas do produto.

3. Instrumentar métricas mínimas de operação

Razão: sem observabilidade, qualquer discussão de performance ou estabilidade é especulativa.

P1 — Importante

4. Formalizar metadados do artefacto de análise

Razão: reforça auditabilidade editorial e reproducibilidade.

5. Distinguir melhor indicadores compostos na experiência normal

Razão: a metodologia já é boa; falta expressá-la diretamente na interface.

6. Reforçar testes de fronteira entre factual e gerado

Razão: esta fronteira é onde o produto ganha ou perde legitimidade.

P2 — Evolução estruturante

7. Consolidar modelo de estado do frontend

À medida que crescerem filtros, comparativos, exportações e interações entre secções, convém evitar deriva para um frontend cada vez mais difícil de prever e depurar.

8. Preparar caminho para cache server-side / pré-cálculo de vistas pesadas

Não é urgente agora, mas vale a pena desenhar cedo as opções para a fase seguinte.


Backlog acionável

UX

  • Substituir placeholders textuais por skeletons específicos por secção
  • Adicionar estados explícitos de erro e retry
  • Mostrar "última atualização" por bloco e por série
  • Introduzir badges para "Dado oficial", "Indicador composto" e "Análise editorial IA"

Data / metodologia

  • Expor metadados de frequência, período e cobertura junto aos gráficos
  • Assinalar séries compostas diretamente no comparativo
  • Mostrar alertas quando comparações usam timestamps estruturalmente diferentes

Backend

  • Introduzir metadados persistentes do artefacto de análise
  • Garantir logging estruturado de geração e falhas
  • Criar healthcheck de frescura e integridade de dados

Observabilidade

  • Medir latência por endpoint
  • Medir taxa de erro por secção do frontend
  • Medir cache hit/miss
  • Medir tempo até primeiro conteúdo útil

Testes

  • Testes de cobertura mínima de metadados por indicador
  • Testes para impedir análise textual sem base factual suficiente
  • Testes de coerência entre fonte, frequência e período em indicadores compostos

Conclusão

O Prumo é um projeto forte, com identidade própria, boa escolha de stack e uma proposta rara no panorama dos dashboards públicos: combina exploração de dados, comparação internacional e interpretação editorial explicitamente enquadrada. O repositório transmite intenção arquitetural séria, e a página publicada mostra já um produto com tese e direção.

A principal oportunidade neste momento não é reinventar a stack. É fechar a distância entre a qualidade conceptual do projeto e a maturidade da experiência entregue ao utilizador. Isso passa por três movimentos: melhorar estados de UI, reforçar observabilidade e tornar absolutamente inequívoca a separação entre dado, transformação e interpretação.

Se isso for bem feito, o projeto passa com relativa facilidade de "bom projeto independente" para "produto público credível, distinto e tecnicamente respeitável".

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationenhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions