Skip to content

feat(community): retrospectiva multi-fonte — contrato + GitHub/Discord (Fase 1)#438

Merged
Clintonrocha98 merged 2 commits into
feature/retrospective-multi-sourcefrom
feature/retro-contract
Jul 22, 2026
Merged

feat(community): retrospectiva multi-fonte — contrato + GitHub/Discord (Fase 1)#438
Clintonrocha98 merged 2 commits into
feature/retrospective-multi-sourcefrom
feature/retro-contract

Conversation

@Clintonrocha98

Copy link
Copy Markdown
Member

Fase 1 — Juntar as fontes

Primeira fatia da retrospectiva multi-fonte. Transforma a retrospectiva (hoje só GitHub, read model ao vivo no portal) numa peça plugável por fonte: adicionar uma plataforma passa a ser 1 classe + 1 tag no módulo dono do dado, sem tocar o portal.

Aponta para a branch de integração feature/retrospective-multi-source.

O que entra

community (domínio) — o contrato

  • RetrospectiveSource: key() + collect(Period, SourceFilters): SourceResult.
  • DTOs tipados: Period, SourceFilters (hideBots + exclusions), Metric, HeadlineMetrics, SourceResult, e a interface Slide (kind() + toArray()).
  • Nenhum import de Integration: o contrato mora no domínio, as fontes o implementam.

integration-githubGithubSource

  • Refatora o antigo CommunityRetrospective do portal preservando o cálculo 1:1 (bots, PRs merged/unmerged, repos só com PR no recorte, destaques por linhas).
  • Empacota a saída em slides tipados (github.panorama, github.repos, github.highlights, github.core, github.community).

activityDiscordSource (mora aqui porque o dado — Voice, Message, Reaction, MembershipEvent — é do activity)

  • 5 slides: discord.voice_board, discord.messages, discord.new_members, discord.reactions, discord.top_message.
  • Agrega tudo em SQL escopado pela janela (as tabelas são grandes em prod; messages ~2GB). Filtra por sent_at/occurred_at (tempo do evento), nunca created_at. hideBots via source_kind. Nome de exibição resolvido só para o topo de cada ranking.

portal — orquestração

  • RetrospectiveDeck resolve as fontes por tagged service (retrospective.source), ordena (github → discord) e descarta as sem dado.
  • A página compõe: cover (chips por fonte, sem soma cruzada) → bloco de cada fonte (kind → componente Blade por convenção) → closing.
  • Os filtros ricos do visitante (repos/tipos/desfecho/pessoa/ordenação) foram aposentados: viram configuração editorial na Fase 2. Restam recorte de período e ocultar bots.

Fora de escopo (fica pra depois)

  • Persistência/snapshot da edição e curadoria (Fase 2).
  • Deck Builder visual (Fase 3).
  • WhatsApp (PR aditivo).

Notas

  • Sem migrations nesta fase (nenhuma tabela nova).
  • Testes: GithubSource (golden 1:1, herdado do read model antigo), DiscordSource (agregações + escopo temporal + hideBots), RetrospectiveDeck (ordem/descarte) e página multi-fonte.
  • Na suíte completa local há 3 falhas em BackfillRepositoryTest (timezone, +00:00 vs -03:00) e alguns erros de out of shared memory no DROP sob paralelismo. Ambos são pré-existentes/ambientais (confirmado: o backfill falha igual na base, e os testes de activity passam isolados) — não têm relação com esta mudança.

… (phase 1)

Fase 1 da retrospectiva multi-fonte: transforma a retrô (antes só GitHub,
read model ao vivo no portal) numa peça plugável por fonte.

- community: contrato RetrospectiveSource (key + collect(Period, SourceFilters):
  SourceResult) e DTOs tipados (Period, SourceFilters, Metric, HeadlineMetrics,
  SourceResult) + interface Slide. Módulo de domínio, dono do contrato.
- integration-github: GithubSource refatora o antigo CommunityRetrospective
  preservando o cálculo 1:1 (bots, PRs merged/unmerged, repos com PR, destaques),
  empacotado em slides tipados.
- activity: DiscordSource (dono do dado) com 5 slides — voz, mensagens, novos
  membros, reações e mensagem mais reagida. Agrega tudo em SQL escopado por
  sent_at/occurred_at, hideBots via source_kind, nome via metadata do Discord.
- portal: RetrospectiveDeck resolve as fontes por tagged service
  (retrospective.source), ordena e descarta vazias; página compõe cover (chips
  por fonte) + blocos por fonte (kind -> Blade por convenção) + closing.
  Filtros ricos do visitante aposentados (viram config editorial na Fase 2);
  restam recorte de período e ocultar bots.

Sem tabelas novas nesta fase. Testes: GithubSource (golden 1:1), DiscordSource
(agregações), RetrospectiveDeck (ordem/descartes) e página multi-fonte.

@henrique-leme henrique-leme left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Remove as declarações he4rt/* que eu havia adicionado em activity, portal e
integration-github. Embora o guia .ai/02-module-architecture peça declarar as
deps intra-repo como ^1.0.0, nenhum dos 17 outros módulos faz isso: todos usam
require {} e dependem do autoload global do internachi/modular. Manter os três
consistentes com os vizinhos. Sem efeito em runtime (autoload é dir-based).
@Clintonrocha98
Clintonrocha98 merged commit 9651efa into feature/retrospective-multi-source Jul 22, 2026
8 checks passed
@Clintonrocha98
Clintonrocha98 deleted the feature/retro-contract branch July 22, 2026 01:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants