feat(community): retrospectiva multi-fonte — contrato + GitHub/Discord (Fase 1)#438
Merged
Clintonrocha98 merged 2 commits intoJul 22, 2026
Conversation
… (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.
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
merged commit Jul 22, 2026
9651efa
into
feature/retrospective-multi-source
8 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 oportal.Aponta para a branch de integração
feature/retrospective-multi-source.O que entra
community(domínio) — o contratoRetrospectiveSource:key()+collect(Period, SourceFilters): SourceResult.Period,SourceFilters(hideBots + exclusions),Metric,HeadlineMetrics,SourceResult, e a interfaceSlide(kind()+toArray()).integration-github—GithubSourceCommunityRetrospectivedo portal preservando o cálculo 1:1 (bots, PRs merged/unmerged, repos só com PR no recorte, destaques por linhas).github.panorama,github.repos,github.highlights,github.core,github.community).activity—DiscordSource(mora aqui porque o dado —Voice,Message,Reaction,MembershipEvent— é doactivity)discord.voice_board,discord.messages,discord.new_members,discord.reactions,discord.top_message.messages~2GB). Filtra porsent_at/occurred_at(tempo do evento), nuncacreated_at.hideBotsviasource_kind. Nome de exibição resolvido só para o topo de cada ranking.portal— orquestraçãoRetrospectiveDeckresolve as fontes por tagged service (retrospective.source), ordena (github → discord) e descarta as sem dado.kind→ componente Blade por convenção) → closing.Fora de escopo (fica pra depois)
Notas
GithubSource(golden 1:1, herdado do read model antigo),DiscordSource(agregações + escopo temporal + hideBots),RetrospectiveDeck(ordem/descarte) e página multi-fonte.BackfillRepositoryTest(timezone,+00:00vs-03:00) e alguns erros deout of shared memorynoDROPsob paralelismo. Ambos são pré-existentes/ambientais (confirmado: o backfill falha igual na base, e os testes deactivitypassam isolados) — não têm relação com esta mudança.