Skip to content

feat(squads): bounded contexts + ADRs for onboarding & squads governance#332

Draft
danielhe4rt wants to merge 10 commits into
4.xfrom
feat/onboarding-squads
Draft

feat(squads): bounded contexts + ADRs for onboarding & squads governance#332
danielhe4rt wants to merge 10 commits into
4.xfrom
feat/onboarding-squads

Conversation

@danielhe4rt

Copy link
Copy Markdown
Contributor

O quê

Estabelece dois novos bounded contextsonboarding (camada de Entrada) e squads (Governança) — via scaffold dos módulos + documentação de domínio (CONTEXT.md + ADRs). Sem código de runtime ainda — é a fundação de design que destrava a implementação.

Resultado de uma sessão /grill-with-docs sobre o Mapa de Fluxos dos Squads (camadas Entrada + Governança; o Núcleo do jogo fica de fora por enquanto).

Decisões principais (ver ADRs)

Onboarding (Entrada)

  • ADR-0001 — Onboarding polimórfico por tipo (OnboardingType → handler(), mesmo idioma do IdentityProvider::getClient). Modelo onboarding + tabela onboarding_steps (auditoria por etapa). Cadeia de pré-requisitos entre tipos (Welcome é pré-req de Squads). "APTO" = Squads onboarding concluído.
  • ADR-0002 — Sinal de "PR aprovado" via novo evento de domínio GithubPullRequestApproved do integration-github (transporte continua centralizado; HMAC/dedup reusados). Repo de desafio via GithubRepository.purpose = challenge. Vínculo do GitHub é gate → sem reconciliação (diverge do BDD original da P.O.).

Squads (Governança)

  • ADR-0001 — Governança como record-keeping, não workflow engine. Eleição/remoção/saída/realocação rodam off-system; o módulo registra o resultado. Candidatura é o único fluxo conduzido. Autoridade = super-admins (config('he4rt.admins')) + capitão gere o próprio squad.
  • ADR-0002 — Modelo de dados: squads, squad_members (pivot com role), squad_membership_events (append-only), squad_applications. Capitão derivado do pivot (sem captain_id). Capitão único + exclusividade "1 squad ativo" garantidos no banco (partial unique) + validação na Action.

Fora de escopo (regras humanas, aplicadas off-system)

Elegibilidade "≥1 entrega", desempate pelo Head, candidatura única, mínimo de votos proporcional, "sem reeleição direta". Só o resultado é registrado — por isso o ponto aberto "definição de entrega" não bloqueia.

Arquivos

  • CONTEXT-MAP.md — registra os dois contextos + regras de dependência
  • app-modules/onboarding/ — scaffold + CONTEXT.md + 2 ADRs
  • app-modules/squads/ — scaffold + CONTEXT.md + 2 ADRs

Follow-ups (não neste PR)

  • Implementação: migrations, models (com PHPDoc), enums, Actions, Policy, listener do GithubPullRequestApproved, campo GithubRepository.purpose
  • Mover *ServiceProvider de src/Providers/src/ (guideline .ai/02-module-architecture)
  • Atualizar o documento da P.O. (cenário de reconciliação removido)

@stherzada stherzada 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.

Avalie as considerações, e me dê um toque.

Comment on lines +17 to +19
1. **Onde mora?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa
pesado o `identity` (vínculo GitHub via `ExternalIdentity`). Colocá-la dentro de `squads`
amarraria um conceito universal a um consumidor específico.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
1. **Onde mora?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa
pesado o `identity` (vínculo GitHub via `ExternalIdentity`). Colocá-la dentro de `squads`
amarraria um conceito universal a um consumidor específico.
1. **Esse onboarding é específico de um squad ou global da comunidade?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa
pesado o `identity` (vínculo GitHub via `ExternalIdentity`). Colocá-la dentro de `squads`
amarraria um conceito universal a um consumidor específico.

Recomendo trocar a pergunta, pois confesso que após a leitura fiquei confusa sobre o que se tratava.

Comment on lines +86 to +87
- **STI / modelo por tipo**: Laravel não tem STI nativo (exige pacote/boilerplate), foge do idioma
`enum→resolve` do repo e incha o schema com colunas nuláveis por tipo. Descartado.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
- **STI / modelo por tipo**: Laravel não tem STI nativo (exige pacote/boilerplate), foge do idioma
`enum→resolve` do repo e incha o schema com colunas nuláveis por tipo. Descartado.

Se foi descartado não faz sentido ter dentro desse contexto.

Comment on lines +23 to +24
2. Como distinguir um "repo de desafio" de um repo de contribuições — sem que o `git_challenge` vire
XP de gamification.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nesse caso aqui acho que pode ser validado até por nome mesmo, ele não precisa entrar muito afundo nessa lógica pois acredito que até o momento não visamos tantos repos desafios por hora.

acoplamento mínimo e consciente, mitigado por ser categoria de projeção, não lógica de onboarding.
- O repo de desafio precisa ter o webhook do GitHub instalado apontando pro endpoint do
`integration-github` (setup de infra, não de código).
- Diverge do BDD original (reconciliação removida) — o documento da P.O. precisa ser atualizado.

@stherzada stherzada Jun 16, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Gera essa doc que foi citada aqui, por favor

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Trago o questionamento, acha válido deixar o context.md em inglês?
Pois seguindo essa lógica acho justo seguir todo processo em apenas uma língua, mas vale saber se isso pode ser uma limitação no futuro.

| Term | Definition | Not to be confused with |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| **Onboarding** | One person's journey through one typed flow, scoped to a tenant. One row per `(tenant, user, type)`. Holds lifecycle `status`, not the per-step detail. | The UI wizard (presentation) — the Onboarding is the persisted state machine |
| **OnboardingType** | The discriminator enum (`Welcome`, `Squads`, …). Resolves the polymorphic behaviour via `handler(): OnboardingFlow` — same idiom as `IdentityProvider::getClient`. | A step — a type _has_ steps |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Fiquei curiosa, qual diferença dessa para o OnboardingStep?

a condução. Risco de o estado lançado divergir do que aconteceu de fato (mitigado pela trilha + por
o lançamento ser feito por super-admin/capitão).
- Regras como "sem reeleição direta" não são impedidas pelo sistema — dependem de disciplina humana.
- Vários cenários BDD do documento da P.O. não viram testes de software nesta fase.

@stherzada stherzada Jun 17, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Qual nesse caso, se poder gerar esse cenários, ficaria grata

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No geral não entendi quais decisões ele viu de problema, necessito de mais contexto para atuar nesse review.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Trago o questionamento, acha válido deixar o context.md em inglês?
Pois seguindo essa lógica acho justo seguir todo processo em apenas uma língua, mas vale saber se isso pode ser uma limitação no futuro.

@Clintonrocha98

Copy link
Copy Markdown
Member

up!

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.

3 participants