Funcionalidade migracao v3 - BrunodosSantosVaz/big-bang GitHub Wiki
Funcionalidade BB-F-057 · requisito RF-BB-057 · versão documentada 3.0.0 · código bff42ded9b4d83b4327f4064cc352f49c7659dfa.
Adotar a v3 opcionalmente, sem que bb update mude o fluxo do cliente. Cada parte produz seu próprio PR revisado: config → board → workflow → labels. A esteira legada continua lendo labels em português até a troca final.
Dono e IA implementadora; revisor independente de cada PR; conta autorizada do GitHub para Project e labels. Decisões e segredos permanecem com o dono.
Framework atualizado; cópia protegida da configuração e do AGENTS.md; acesso de leitura aos três painéis. Antes de aplicar, rever o plano e escolher um arquivo novo de snapshot. Não migrar no meio de QA/publicação ou de uma sprint ativa. A troca de workflow exige branches epico/* sem commits à frente da develop.
-
bb migrate config --dry-run: traduz os nomes preservando três painéis, epic-branch e labels legacy; remove o trecho do próprio framework herdado em AGENTS.md, incluindo todas as linhas consecutivas da citação; preserva a seção Projeto, suas subseções seguintes e notas independentes do projeto. Aplicar com--snapshot config.json, gerar, revisar e mesclar o PR. -
bb migrate board --dry-run: lê os três painéis e mapeia os cartões por evidência. Consulta a listagem paginada de PRs uma vez por execução, normaliza e indexa as branches por issue e reutiliza esse índice nos cartões; o número de consultas de PR não cresce com o número de cartões. Aplicar com--snapshot board.json --yes; cria um Project, confere as automações embutidas e bloqueia se alguma workflow estiver ativa. O dono desativa as workflows na interface do Project e retoma com--project <número> --snapshot board.json --yes. Cada cartão é incluído e recebe diretamente o Status calculado, além do recibo. Ao final, o migrador relê todos os Status, corrige divergências e faz uma segunda leitura de confirmação antes de apontarboard.modelparasingle. Revisar e mesclar o PR. -
bb migrate workflow --dry-run: confere branches epico/* e lista as mudanças de controles. Aplicar com--snapshot workflow.json, gerar e revisar o PR. O dono confirma gate, ambiente production restrito e PROJECT_*. -
bb migrate labels --dry-run: planeja renomes e cópias quando as duas labels existem. Aplicar com--snapshot labels.json --yes, preservando associações antigas quando copiadas; completa o catálogo e grava board.labels=v3. Revisar e mesclar o PR. Conferir um ciclo completo antes de o dono arquivar painéis antigos.
A ordem é conferida pelo dialeto da configuração, pelo quadro single e pelo workflow grouping. Escritas no GitHub exigem --yes na CLI e todo apply/rollback exige --snapshot. Snapshots existentes não são sobrescritos; depois da criação, o snapshot registra o número do Project para permitir retomada. Workflows ativas bloqueiam a inclusão dos cartões, com orientação para desligá-las em Project → Workflows. A migração só muda bigbang.toml para single depois que uma releitura confirma todos os Status; se a confirmação falhar, a configuração segue apontando para os três quadros. A limpeza de AGENTS.md cobre a citação real de três linhas e a variante de uma linha; termina antes de uma subseção seguinte, inclusive sem linha em branco. O snapshot permite restaurar exatamente a configuração e o AGENTS.md originais. A restauração recusa outra parte ou outro repositório. A migração do quadro usa aprovação de refinamento/protótipo, posse com lease vigente (lock ou comentário confiável com data do servidor), PR aberto/mesclado, workflow agrupador, fechamento, candidata e publicação estável como evidências; não infere aprovação a partir da execução da IA.
--dry-run não grava arquivos, labels, cartões ou recibos. Sem --yes, board/labels mostram apenas o plano. Ao bloquear por workflows ativas, a retomada exige o mesmo snapshot e o número do Project recém-criado; mapa ou quadros divergentes desde o snapshot impedem a retomada. Execução repetida concluída não duplica recibos nem troca o snapshot original. Se a segunda leitura ainda divergir após o reparo, a migração falha sem alterar bigbang.toml; o snapshot, o Project e os recibos ficam disponíveis para diagnóstico e rollback. Para voltar, use --rollback com o snapshot correspondente, em ordem inversa labels → workflow → board → config, por PR revisado. Após rollback, uma nova tentativa calcula evidências atuais e grava recibos com outro identificador; o snapshot anterior permanece protegido. Bugs sem posse ficam Selected, estado permitido pelo núcleo, pois Todo é exclusivo de tarefas. O rollback de labels tolera aplicação parcial e repetição; as associações copiadas incluem issues e PRs. Painéis antigos não são apagados; o Project novo e os recibos de migração permanecem como histórico.
A CLI só usa o repositório e o dono configurados. Não aplica rulesets, ambiente ou segredos automaticamente: owner_steps prepara instruções para preservar revisores, políticas e checks. Valores de segredo nunca aparecem no snapshot ou na saída. Nenhuma publicação, aprovação de produção ou decisão humana é concedida pela migração.
Configuração v3 em inglês, quadro único com recibos, agrupador com checks e ambiente conferidos pelo dono, e labels v3 com histórico preservado. Cada etapa possui simulação, snapshot e volta. Projetos que não adotarem a migração mantêm o comportamento legado.
Os símbolos abaixo compõem o inventário real do módulo, incluindo auxiliares internos; não representam APIs públicas independentes.
| Símbolo | Linha |
|---|---|
_iso |
25 |
_config_text |
29 |
_write_config |
33 |
_section_bounds |
41 |
set_key |
49 |
drop_key |
62 |
_require |
68 |
_save |
74 |
_load_snapshot |
83 |
_save_project_number |
96 |
clean_agents |
111 |
_rollback_order |
116 |
config_part |
128 |
_labels_of |
164 |
labels_part |
168 |
_has |
230 |
_claimed |
234 |
map_card |
262 |
_pull_evidence |
304 |
_facts |
319 |
board_part |
341 |
owner_steps |
434 |
workflow_part |
450 |
| Símbolo | Linha |
|---|---|
ensure_labels |
96 |
ensure_fields |
101 |
_iso |
109 |
_trusted |
113 |
history |
117 |
current_state |
122 |
_label_value |
131 |
facts |
137 |
attempts |
162 |
record_qa |
178 |
_independent_qa |
196 |
_born |
214 |
_gate |
221 |
_epic_paths |
227 |
_gate_decision |
252 |
_approval_problems |
269 |
move |
294 |
_effects |
363 |
reconcile |
384 |
create_project |
409 |
ProjectGraphQL |
441 |
__init__ |
444 |
_project |
448 |
_load_fields |
461 |
fields |
472 |
workflows |
476 |
ensure_field |
482 |
_load_items |
506 |
items |
533 |
add |
538 |
set |
549 |
get |
564 |
| Símbolo | Linha |
|---|---|
register |
9 |
_migrate |
127 |
_load |
159 |
_context |
165 |
_labels |
177 |
_create |
184 |
_refuse_autonomy |
199 |
_autonomy_check |
208 |
_reconcile |
216 |
_show |
225 |
_move |
235 |
_today |
244 |
_sprint_start |
249 |
_branches |
260 |
_merge |
268 |
_release_cut |
276 |
_release_items |
289 |
_release_gate |
298 |
_flag_path |
311 |
_flag_list |
316 |
_flag_switch |
327 |
_flags_by_agent |
339 |
_pr_rules |
345 |
_escaping_links |
382 |
_content_problems |
397 |
_actor |
416 |
_candidate_ready |
420 |
_release_publish |
429 |
_release_maintenance |
461 |
_qa_reject |
476 |
_qa_verdict |
488 |
_cleanup |
499 |
_controller |
514 |
promote |
442 |
open_project |
142 |
create_project |
144 |
| Símbolo | Linha |
|---|---|
_labels |
14 |
normalize_issue |
18 |
_milestone |
26 |
_normalize_pull |
32 |
graphql |
39 |
GitHub |
57 |
__init__ |
58 |
call |
62 |
paginate |
69 |
repository_info |
82 |
user |
86 |
branch_rules |
90 |
ruleset |
93 |
environment |
97 |
environment_branch_policies |
101 |
issue |
107 |
issues |
111 |
create_issue |
115 |
update_issue |
119 |
add_labels |
122 |
remove_label |
126 |
ensure_label |
129 |
comments |
134 |
comment |
137 |
sub_issues |
143 |
parent |
146 |
add_sub_issue |
150 |
blocked_by |
154 |
add_blocked_by |
157 |
branches |
163 |
branch_sha |
167 |
create_branch |
171 |
pull |
177 |
merge_pull |
183 |
pull_files |
192 |
add_pr_labels |
195 |
check_runs |
198 |
compare_messages |
202 |
tags |
206 |
ensure_milestone |
210 |
milestone_number |
217 |
close_milestone |
223 |
milestone_issues |
226 |
pulls |
230 |
create_pull |
235 |
merge_branches |
245 |
ahead_by |
251 |
delete_ref |
255 |
all_branches |
258 |
locks |
262 |
.bigbang/tests/test_migrate_v3.py:test_real_three_line_framework_quote_is_removed_and_rollback_is_exact.bigbang/tests/test_migrate_v3.py:test_single_line_framework_quote_preserves_following_project_subsection.bigbang/tests/test_migrate_v3.py:test_framework_quote_preserves_later_subsections_and_unrelated_quote.bigbang/tests/test_migrate_v3.py:test_existing_snapshot_is_never_overwritten.bigbang/tests/test_migrate_v3.py:test_snapshot_restores_config_and_agents_exactly.bigbang/tests/test_migrate_v3.py:test_dry_run_changes_nothing.bigbang/tests/test_migrate_v3.py:test_rewrites_in_english_keeping_the_behavior.bigbang/tests/test_migrate_v3.py:test_removes_the_inherited_framework_section_and_keeps_the_project_part.bigbang/tests/test_migrate_v3.py:test_second_run_is_a_no_op.bigbang/tests/test_migrate_v3.py:test_rollback_after_a_partial_rename_is_idempotent.bigbang/tests/test_migrate_v3.py:test_copying_existing_labels_includes_pull_requests.bigbang/tests/test_migrate_v3.py:test_foreign_snapshot_refuses_before_any_write.bigbang/tests/test_migrate_v3.py:test_needs_the_workflow_part_first.bigbang/tests/test_migrate_v3.py:test_renames_keeping_the_issues_copies_when_both_exist_and_creates_the_catalog.bigbang/tests/test_migrate_v3.py:test_rollback_restores_the_names.bigbang/tests/test_migrate_v3.py:test_dry_run_changes_nothing.bigbang/tests/test_migrate_v3.py:test_remigration_after_rollback_uses_current_legacy_evidence.bigbang/tests/test_migrate_v3.py:test_closed_epic_without_release_does_not_advance_to_done.bigbang/tests/test_migrate_v3.py:test_closed_epic_with_its_stable_tag_is_done.bigbang/tests/test_migrate_v3.py:test_bug_without_candidate_does_not_advance_to_qa.bigbang/tests/test_migrate_v3.py:test_stale_or_unverified_claim_does_not_advance_to_coding.bigbang/tests/test_migrate_v3.py:test_ready_task_waits_for_workflow_migration_even_with_merged_pr.bigbang/tests/test_migrate_v3.py:test_bug_without_claim_uses_a_state_allowed_by_the_runtime.bigbang/tests/test_migrate_v3.py:test_initial_cards_also_receive_a_migration_receipt.bigbang/tests/test_migrate_v3.py:test_legacy_labels_are_mapped_before_the_label_migration.bigbang/tests/test_migrate_v3.py:test_needs_the_config_part_first.bigbang/tests/test_migrate_v3.py:test_maps_every_card_by_evidence_with_a_migration_receipt.bigbang/tests/test_migrate_v3.py:test_active_project_workflows_block_before_receipts_or_card_adds.bigbang/tests/test_migrate_v3.py:test_status_is_written_from_the_calculated_mapping_and_verified.bigbang/tests/test_migrate_v3.py:test_status_readback_is_repaired_before_config_switch.bigbang/tests/test_migrate_v3.py:test_unconfirmed_status_keeps_old_config_model.bigbang/tests/test_migrate_v3.py:test_snapshot_keeps_the_old_boards_and_rollback_restores_them.bigbang/tests/test_migrate_v3.py:test_dry_run_writes_nothing.bigbang/tests/test_migrate_v3.py:test_second_run_does_not_duplicate_receipts.bigbang/tests/test_migrate_v3.py:test_snapshot_rollback_restores_the_original_configuration.bigbang/tests/test_migrate_v3.py:test_needs_the_board_part_first.bigbang/tests/test_migrate_v3.py:test_refuses_while_epic_branches_carry_unmerged_work.bigbang/tests/test_migrate_v3.py:test_switches_to_grouping_and_lists_the_owner_steps.bigbang/tests/test_migrate_v3.py:test_config_alias_dry_run_never_writes_or_contacts_github.bigbang/tests/test_migrate_v3.py:test_github_parts_default_to_the_plan_without_yes.bigbang/tests/test_migrate_v3.py:test_real_run_without_snapshot_refuses_before_mutation.bigbang/tests/test_migrate_v3.py:test_config_roundtrip_from_cli.bigbang/tests/test_migrate_v3.py:test_config_and_board_rollbacks_are_refused_while_the_workflow_is_applied.bigbang/tests/test_migrate_v3.py:test_workflow_rollback_is_refused_while_the_labels_are_migrated.bigbang/tests/test_migrate_v3.py:test_rolling_back_in_reverse_order_works.bigbang/tests/test_board_v3.py:test_catalog_covers_every_v3_label_the_rules_read.bigbang/tests/test_board_v3.py:test_labels_command_is_idempotent.bigbang/tests/test_board_v3.py:test_project_fields_and_fifteen_states.bigbang/tests/test_board_v3.py:test_initial_state_by_kind.bigbang/tests/test_board_v3.py:test_owner_moves_epic_through_planning_with_receipts_and_board.bigbang/tests/test_board_v3.py:test_agent_cannot_pass_an_owner_gate_in_normal_mode.bigbang/tests/test_board_v3.py:test_claiming_to_be_the_owner_is_not_an_approval.bigbang/tests/test_board_v3.py:test_flash_sensitive_refinement_goes_to_the_owner.bigbang/tests/test_board_v3.py:test_qa_rejection_and_epic_cancellation_need_the_owner_decision.bigbang/tests/test_board_v3.py:test_a_rejection_withdraws_the_decisions_from_the_return_stage_on.bigbang/tests/test_board_v3.py:test_qa_and_publish_risk_come_from_the_changed_paths.bigbang/tests/test_board_v3.py:test_flash_qa_human_stays_with_the_owner_at_any_risk.bigbang/tests/test_board_v3.py:test_flash_delegated_qa_needs_an_independent_qa_receipt.bigbang/tests/test_board_v3.py:test_qa_verdict_needs_a_declared_agent_and_the_current_candidate.bigbang/tests/test_board_v3.py:test_delegated_qa_rejection_needs_evidence_and_a_candidate.bigbang/tests/test_board_v3.py:test_without_a_current_candidate_no_verdict_counts.bigbang/tests/test_board_v3.py:test_going_back_without_rejection_also_withdraws_the_decisions.bigbang/tests/test_board_v3.py:test_delivery_paths_read_only_prs_updated_since_the_children_exist.bigbang/tests/test_board_v3.py:test_a_child_attached_late_still_counts_its_older_prs.bigbang/tests/test_board_v3.py:test_prs_of_the_epic_itself_count_even_before_its_children.bigbang/tests/test_board_v3.py:test_effects_happen_before_the_receipt.bigbang/tests/test_board_v3.py:test_attempts_come_from_receipts_and_the_limit_blocks.bigbang/tests/test_board_v3.py:test_agent_passes_common_gates_in_flash.bigbang/tests/test_board_v3.py:test_decision_label_is_the_owner_approval.bigbang/tests/test_board_v3.py:test_task_done_closes_the_issue_and_cancelled_is_not_planned.bigbang/tests/test_board_v3.py:test_rejection_records_reason_label_and_return.bigbang/tests/test_board_v3.py:test_replayed_event_writes_nothing_new.bigbang/tests/test_board_v3.py:test_blocked_task_cannot_start.bigbang/tests/test_board_v3.py:test_facts_from_github.bigbang/tests/test_board_v3.py:test_new_issue_enters_the_board_in_its_initial_state.bigbang/tests/test_board_v3.py:test_epic_form_answers_become_v3_labels_and_native_dependencies.bigbang/tests/test_board_v3.py:test_pr_lifecycle_moves_the_task_and_closes_it_on_merge.bigbang/tests/test_board_v3.py:test_pr_closed_without_merge_goes_back_to_coding.bigbang/tests/test_board_v3.py:test_foreign_branches_and_events_are_ignored.bigbang/tests/test_board_v3.py:test_backlog_and_selection_decisions_advance_the_epic.bigbang/tests/test_board_v3.py:test_merge_refused_keeps_the_claim.bigbang/tests/test_board_v3.py:test_retried_merge_event_releases_a_claim_left_behind.bigbang/tests/test_board_v3.py:test_retried_merge_event_keeps_a_claim_taken_after_the_merge.bigbang/tests/test_board_v3.py:test_bugfix_branches_are_read_by_the_controller.bigbang/tests/test_board_v3.py:test_late_closed_event_of_a_reopened_pr_is_ignored.bigbang/tests/test_board_v3.py:test_decision_label_advances_the_epic.bigbang/tests/test_board_v3.py:test_schedule_reconciles_the_board_and_marks_stale_claims.bigbang/tests/test_board_v3.py:test_reads_project_workflow_enabled_state.bigbang/tests/test_board_v3.py:test_fields_are_created_and_status_options_replaced_keeping_ids.bigbang/tests/test_board_v3.py:test_set_values_by_type.bigbang/tests/test_board_v3.py:test_items_of_other_repositories_are_ignored.bigbang/tests/test_migrate_v3.py:test_pr_evidence_api_calls_do_not_scale_with_board_cards
Requisitos · Matriz de rastreabilidade · Referência CLI
O piloto snake-3310 detectou em #292 uma remoção parcial da citação herdada: a primeira linha saía e duas continuações permaneciam. O teste de regressão reproduz a entrada real antes da correção, incluindo dry-run sem escrita, preservação das subseções e volta exata. A correção fica na develop; não é uma release publicada nem atualiza automaticamente consumidores. A retomada de #259 depende da instrução do dono e de distribuição oficial ou ensaio isolado com a develop.