Funcionalidade fluxo agrupador - BrunodosSantosVaz/big-bang GitHub Wiki
Fluxo agrupador e entrega da v3
Funcionalidade BB-F-052 · requisito RF-BB-052 · versão documentada 2.0.1 · código 94155836a981e9912a59f2c826afcff7baa4f073.
Finalidade
Executar o modelo de trabalho B (ADR-0022): o épico agrupa tarefas que nascem da develop e fecham no merge; a release é cortada da develop e o que mudou o artefato sem homologação vai para produção com a feature flag desligada; a publicação promove os mesmos bytes da candidata.
Atores
Dono (decisões registradas: seleção, homologação, aprovação do ambiente de produção), IAs com posse confirmada, o controlador e os botões Start sprint, Create branches, Merge PR, Cut release, Candidate, Publish, Publish maintenance, QA reject e Cleanup.
Pré-condições
Projeto com workflow.model = grouping, quadro único, branch develop, decisão de flag do épico quando ele muda o artefato e o mecanismo de flags declarado pela stack; token do projeto com permissão de escrita.
Fluxo principal
bb sprint start cria teste, tarefas e documentação como sub-issues com dependências nativas e a branch de teste da develop; bb branches cria as desbloqueadas; bb merge mescla PR aprovado com o gate verde no SHA exato; bb release cut corta release/x.y.z com trava de versão e milestone; a candidata leva os épicos para QA; bb release publish confere o portão, mescla na main, promove a candidata, conclui os épicos entregues, fecha o milestone e devolve a main para a develop.
Validações
Merge nunca na main; aprovação nos dois idiomas; o portão da release lê flags.toml e os testes pendentes do conteúdo da própria release (lido como dado, sem seguir links para fora) e exige cada épico com o QA cumprido (estado Releasing, ou QA que as regras já deixam avançar: decisão do dono ou veredito de um agente independente) ou no escuro com todas as suas flags desligadas em produção; flag vencida bloqueia a release até ser renovada ou removida; testes de aceite pendentes só de épicos no escuro; nenhuma issue que bloqueie produção; candidata igual à ponta da release e ao head do PR da release, verde no SHA exato; manutenção só sem mudança de artefato. Os botões que mudam estado (Publish, QA reject, Publish maintenance) simulam por padrão, e nenhum valor digitado entra num script sem passar por variável de ambiente e validação.
Alternativas e erros
Reprovação na homologação — decisão registrada do dono (qa:rejected) ou, no QA delegado, veredito rejected de um agente independente para a candidata atual — cria uma tarefa de correção a partir da release e uma nova candidata; o botão sozinho nunca reprova; conflito ao devolver a main abre um PR de sync com conflict; um épico que perde a homologação entre o portão e a conclusão (decisão retirada) é relatado como pendente, nunca como no escuro; sem candidata publicada, o portão explica o motivo; promoção que falha não conclui nenhum épico; publicar de novo não duplica nada. No QA delegado (qa:agent, risco que o modo permite delegar), um agente sem posse no épico nem nas tarefas registra o veredito com bb qa verdict; com qa:human a homologação é sempre do dono.
Permissões
Publicação só depois da aprovação do ambiente production; correções e reprovações exigem a decisão registrada do dono (qa:rejected) ou, no QA delegado, o veredito rejected de um agente independente para a candidata atual; quem entrega nunca homologa (limite conhecido: com o token compartilhado de uma conta pessoal, o nome do agente em bb qa verdict é declarado por quem roda o comando; a separação forte exige uma conta-bot por agente); a faxina nunca apaga main, develop, releases, tags nem refs de trava (só relata posses vencidas há mais de uma semana) e só remove branches mescladas de issues fechadas sem PR aberto.
Resultados
Entregas com escopo controlado por flag, tarefas concluídas no merge, homologação sobre a candidata exata, produção com o artefato homologado e o repositório limpo depois de cada ciclo.
Referência da implementação
Os símbolos abaixo compõem o inventário real do módulo, incluindo auxiliares internos; não representam APIs públicas independentes.
flags.py
| Símbolo | Linha |
|---|---|
_field |
16 |
parse |
20 |
switch |
58 |
_by_epic |
80 |
release_problems |
87 |
pending_problems |
106 |
flows.py
| Símbolo | Linha |
|---|---|
_trusted |
17 |
_sprint_option |
21 |
_children_by_role |
32 |
_legacy_view |
41 |
start_sprint |
45 |
_block |
108 |
create_branches |
115 |
_has |
143 |
_owner_decided |
147 |
merge_pr |
159 |
current_version |
198 |
release_items |
203 |
cut_release |
214 |
read_content |
252 |
release_gate |
262 |
child |
73 |
delivery.py
| Símbolo | Linha |
|---|---|
_now |
19 |
_trusted |
23 |
_milestone |
27 |
_epics |
34 |
_has |
38 |
candidate_ready |
42 |
_flags |
73 |
_green |
82 |
_return_main |
88 |
_latest_candidate |
100 |
publish |
109 |
publish_maintenance |
190 |
correction_task |
209 |
cleanup |
240 |
Cenários e rastreabilidade
.bigbang/tests/test_grouping_v3.py:test_both_languages_read_the_same.bigbang/tests/test_grouping_v3.py:test_invalid_entries_are_refused.bigbang/tests/test_grouping_v3.py:test_switch_keeps_the_file_and_its_language.bigbang/tests/test_grouping_v3.py:test_release_gate.bigbang/tests/test_grouping_v3.py:test_pending_acceptance_only_for_dark_epics.bigbang/tests/test_grouping_v3.py:test_v3_targets.bigbang/tests/test_grouping_v3.py:test_start_sprint_creates_children_dependencies_and_test_branch.bigbang/tests/test_grouping_v3.py:test_start_sprint_is_idempotent.bigbang/tests/test_grouping_v3.py:test_epic_without_readiness_is_refused_with_reasons.bigbang/tests/test_grouping_v3.py:test_create_branches_from_develop_when_unblocked.bigbang/tests/test_grouping_v3.py:test_docs_branch_only_after_every_task.bigbang/tests/test_grouping_v3.py:test_merge_needs_approval_and_a_green_gate_on_the_exact_head.bigbang/tests/test_grouping_v3.py:test_legacy_spelling_of_the_approval_counts.bigbang/tests/test_grouping_v3.py:test_never_into_main_and_never_outside_the_branch_model.bigbang/tests/test_grouping_v3.py:test_human_test_review_needs_the_owner_decision.bigbang/tests/test_grouping_v3.py:test_cut_release_from_develop_with_version_lock_and_milestone.bigbang/tests/test_grouping_v3.py:test_release_items_for_the_changelog.bigbang/tests/test_grouping_v3.py:test_nothing_to_release.bigbang/tests/test_grouping_v3.py:test_release_gate_reads_flags_and_pending_marks.bigbang/tests/test_grouping_v3.py:test_flash_delegates_sensitive_review_unless_human_was_asked.bigbang/tests/test_grouping_v3.py:test_no_release_epic_cannot_change_the_artifact.bigbang/tests/test_grouping_v3.py:test_release_pr_skips_the_acceptance_lock.bigbang/tests/test_grouping_v3.py:test_clean_task_pr.bigbang/tests/test_grouping_v3.py:test_branch_title_and_refs.bigbang/tests/test_grouping_v3.py:test_artifact_code_needs_the_epic_flag_decision.bigbang/tests/test_grouping_v3.py:test_no_release_follows_the_artifact_paths.bigbang/tests/test_grouping_v3.py:test_sensitive_paths_ask_for_the_owner_unless_he_said_otherwise.bigbang/tests/test_grouping_v3.py:test_acceptance_lock.bigbang/tests/test_grouping_v3.py:test_v3_tree_is_generated_and_verified.bigbang/tests/test_delivery_v3.py:test_epics_go_to_qa_or_releasing_and_the_release_pr_opens_once.bigbang/tests/test_delivery_v3.py:test_an_epic_with_open_tasks_does_not_enter_qa.bigbang/tests/test_delivery_v3.py:test_the_same_candidate_is_promoted_after_the_merge.bigbang/tests/test_delivery_v3.py:test_failed_promotion_concludes_nothing.bigbang/tests/test_delivery_v3.py:test_open_blocking_issue_refuses.bigbang/tests/test_delivery_v3.py:test_release_changed_after_the_candidate_refuses.bigbang/tests/test_delivery_v3.py:test_dark_epic_ships_but_stays_in_qa_until_approved.bigbang/tests/test_delivery_v3.py:test_approved_epic_with_flag_on_is_done.bigbang/tests/test_delivery_v3.py:test_gate_refuses_flag_on_without_approval.bigbang/tests/test_delivery_v3.py:test_gate_refuses_a_red_release_pr.bigbang/tests/test_delivery_v3.py:test_conflict_returning_main_opens_a_sync_pr.bigbang/tests/test_delivery_v3.py:test_publishing_twice_is_harmless.bigbang/tests/test_delivery_v3.py:test_unfinished_epic_without_a_flag_cannot_ship.bigbang/tests/test_delivery_v3.py:test_any_flag_of_the_epic_on_in_production_counts.bigbang/tests/test_delivery_v3.py:test_expired_flag_blocks_the_release.bigbang/tests/test_delivery_v3.py:test_release_pr_head_must_be_the_candidate.bigbang/tests/test_delivery_v3.py:test_without_a_candidate_the_gate_explains_instead_of_crashing.bigbang/tests/test_delivery_v3.py:test_epic_that_lost_its_qa_after_the_gate_is_reported_pending_not_dark.bigbang/tests/test_delivery_v3.py:test_gate_reads_flags_and_pending_from_the_release_content.bigbang/tests/test_delivery_v3.py:test_no_expression_is_interpolated_into_a_shell_script.bigbang/tests/test_delivery_v3.py:test_publish_reads_the_release_content_and_buttons_simulate_first.bigbang/tests/test_delivery_v3.py:test_qa_reject_dry_run_checks_and_changes_nothing.bigbang/tests/test_delivery_v3.py:test_maintenance_dry_run_merges_nothing.bigbang/tests/test_delivery_v3.py:test_maintenance_merges_into_main_without_artifact_changes.bigbang/tests/test_delivery_v3.py:test_artifact_change_needs_a_release.bigbang/tests/test_delivery_v3.py:test_qa_rejection_creates_a_correction_task_on_the_release_branch.bigbang/tests/test_delivery_v3.py:test_deletes_only_merged_branches_of_closed_issues_and_reports_old_claims.bigbang/tests/test_delivery_v3.py:test_dry_run_changes_nothing.bigbang/tests/test_delivery_v3.py:test_independent_agent_records_the_verdict_of_a_candidate.bigbang/tests/test_delivery_v3.py:test_unknown_agent_cannot_record_a_verdict.bigbang/tests/test_delivery_v3.py:test_links_leaving_the_pr_content_are_refused_before_any_read.bigbang/tests/test_delivery_v3.py:test_pending_epics_are_warned_by_the_publish_command.bigbang/tests/test_delivery_v3.py:test_maintenance_dry_run_says_nothing_was_merged.bigbang/tests/test_delivery_v3.py:test_pending_warnings_are_written_before_the_milestone_closes.bigbang/tests/test_delivery_v3.py:test_publish_workflow_picks_only_numbered_candidates
Requisitos · Matriz de rastreabilidade · Referência CLI