feat(squads): bounded contexts + ADRs for onboarding & squads governance#332
feat(squads): bounded contexts + ADRs for onboarding & squads governance#332danielhe4rt wants to merge 12 commits into
Conversation
stherzada
left a comment
There was a problem hiding this comment.
Avalie as considerações, e me dê um toque.
There was a problem hiding this comment.
No geral não entendi quais decisões ele viu de problema, necessito de mais contexto para atuar nesse review.
|
up! |
1 similar comment
|
up! |
Co-authored-by: Sther <72408918+stherzada@users.noreply.github.com> Signed-off-by: Daniel Reis <danielhe4rt@gmail.com>
|
Comentário do Elves:
|
R: Faz sentido capturar qualquer evento de uma squad. Por mais simples que seja, é o que precisamos no momento.
R: Ambos serão o mesmo payload, no final, o meio não importa desde que tenha a Action fazendo essa fronteira entre o |
stherzada
left a comment
There was a problem hiding this comment.
Só não esquece de mandar o a doc lá!
There was a problem hiding this comment.
Pendente composer update para ajustar o composer.lock
> composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update <package name>`.
- Required package "he4rt/onboarding" is not present in the lock file.
- Required package "he4rt/squads" is not present in the lock file.
This usually happens when composer files are incorrectly merged or the composer.json file is manually edited.
Read more about correctly resolving merge conflicts https://getcomposer.org/doc/articles/resolving-merge-conflicts.md
and prefer using the "require" command over editing the composer.json file directly https://getcomposer.org/doc/03-cli.md#require-r| | `completed_at` | timestamptz? | | | ||
| | timestamps | tz | | | ||
| | UNIQUE | `(onboarding_id, step_key)` | | | ||
|
|
There was a problem hiding this comment.
pra fins de auditoria de transicionamento e checks mais rapidos, nao valeria armazenar a transição de steps com uma coluna de previously_at? traria ganho pra disciplina de transition mencionada na linha 102
ou eles foram desenhados pra serem "ever-forward" (flow nao é um grafo direcionado, apenas guarda estados)?
| PR do candidato** num repo de desafio. A plataforma precisa reagir a essa aprovação. | ||
|
|
||
| O `integration-github` já é o **único** ponto que fala com o GitHub: `GithubWebhookController` recebe | ||
| todos os webhooks, grava no `GithubEventLog` (lake, dedup por `delivery_id`), e o `ProjectGithubEvent` |
There was a problem hiding this comment.
estamos distinguindo repositório de projeto ou ambas palavras se referem à mesma coisa? um evento emitido por um repositorio deveria RepoGithubEvent ou ProjectGithubEvent como é agora?
There was a problem hiding this comment.
por que os CONTEXT.md estão em inglês e os ADRs não? pra fins de linguagem ubiqua, não deveria serem todos no mesmo idioma?
| consulta interna do `integration-github`) e furaria o encapsulamento do lake. Descartado. | ||
| - **Config de repo de desafio dentro do `onboarding`** (em vez do `purpose` na allowlist): manteria o | ||
| `integration-github` sem nenhuma categoria nova, mas duplicaria o cadastro de repos e perderia o | ||
| benefício de excluir o repo de desafio da projeção de contribuições num lugar só. Trade-off aceito |
There was a problem hiding this comment.
com o purpose acoplamos a entidade do GithubRepository no dominio de onboarding. cada type nao poderia ter um repo (unique key) como repo challenge apenas apontando pro repo (1:1)*? isso ainda permitiria excluir os repos de challenge das contribuições
*1 type aponta para 1 repo de challenge
| | **OnboardingFlow** | The per-type handler (a class behind the `OnboardingFlow` contract). Declares `steps()`, `prerequisites()`, `advance()`, `isComplete()`. All type-specific rules live here. | The model — the Flow is stateless behaviour; the Onboarding is the state | | ||
| | **OnboardingStep** | One auditable stage of a flow, one row in `onboarding_steps`. Carries its own `status` + `data` (jsonb) + `completed_at`. Enables pause/resume and history. | A prerequisite (another _type_ that must be complete first) | | ||
| | **Prerequisite** | Another `OnboardingType` that must be **completed** before this one can start (e.g. `Squads` requires `Welcome`). Declared by the flow, enforced on start. | A step (intra-type) — a prerequisite is inter-type | | ||
| | **APTO** | Domain shorthand for "completed the `Squads` onboarding". The condition that unlocks squad candidacy and squad creation. It is _not_ a global flag — it is `Squads` completion. | A generic "active member" — APTO is specifically squad-eligible | |
There was a problem hiding this comment.
APTO ta amarrado ao contexto do onboarding de Squads ou pretendemos reutilizar esse shorthand pra futuros onboarding types? se pretendemos reutilizar acho bom ja desamarrarmos os conceitos
| ### Modelo | ||
|
|
||
| - `squads` (`status`: `draft`/`active`/`inactive`/`archived`, `objective`, `slug`, tenant-scoped). | ||
| - `squad_members` (pivot): `role` (`Captain`/`SubCaptain`/`Member`/`ExMember`), `joined_at`, `left_at`. |
There was a problem hiding this comment.
Sailor (marujo) ao inves de Member se quiserem que o schema esteja bem aderido ao tema de piratas, xd
| ### `squads` | ||
|
|
||
| `name`, `slug`, `objective` (text, nullable — `draft` pode não ter), `status` (`SquadStatus` | ||
| `draft`/`active`/`inactive`/`archived`, default `draft`), timestamps. |
There was a problem hiding this comment.
created_by pra auxiliar a encontrar o autor do squad no futuro (utilidade)
Artefato de fluxo de tasks
O quê
Estabelece dois novos bounded contexts —
onboarding(camada de Entrada) esquads(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-docssobre 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 doIdentityProvider::getClient). Modeloonboarding+ tabelaonboarding_steps(auditoria por etapa). Cadeia de pré-requisitos entre tipos (Welcomeé pré-req deSquads). "APTO" =Squadsonboarding concluído.ADR-0002— Sinal de "PR aprovado" via novo evento de domínioGithubPullRequestApproveddointegration-github(transporte continua centralizado; HMAC/dedup reusados). Repo de desafio viaGithubRepository.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 (semcaptain_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ênciaapp-modules/onboarding/— scaffold +CONTEXT.md+ 2 ADRsapp-modules/squads/— scaffold +CONTEXT.md+ 2 ADRsFollow-ups (não neste PR)
GithubPullRequestApproved, campoGithubRepository.purpose*ServiceProviderdesrc/Providers/→src/(guideline.ai/02-module-architecture)