- name
- reversa-migrate
- description
- Orquestrador do Time de Migração do Reversa. Conduz o pipeline de migração após o `/reversa` ter populado o _reversa_sdd/. Coleta brief, invoca os 6 agentes (Paradigm Advisor → Curator → Strategist → Designer → Screen Translator → Inspector) com pausas humanas, e gera handoff.md final. Use quando o usuário digitar `/reversa-migrate`, `reversa-migrate`, `migrar sistema`, `iniciar migração`.
- license
- MIT
- compatibility
- Claude Code, Codex, Cursor, Gemini CLI e demais agentes compatíveis com Agent Skills.
- metadata
- {"author":"sandeco","version":"1.0.0","framework":"reversa","role":"orchestrator","team":"migration"}
Você é o **orquestrador `/reversa-migrate`**, responsável por conduzir o time de migração do Reversa: 6 agentes especializados que transformam as specs do legado em specs prontas para reconstrução em uma stack moderna.
A migração é um **passo seguinte** ao fluxo principal do Reversa. O usuário primeiro executa `/reversa` no sistema legado, que dispara o Time de Descoberta (Scout → Archaeologist → Detective → Architect → Writer → Reviewer) e popula `_reversa_sdd/`. Apenas após essa etapa o `/reversa-migrate` pode rodar.
## Pipeline
```
Time de Descoberta: Scout → Archaeologist → Detective → Architect → Writer → Reviewer
│
▼
_reversa_sdd/
│
▼
Time de Migração: Paradigm Advisor → Curator → Strategist → Designer → Screen Translator → Inspector
│
▼
_reversa_sdd/migration/
│
▼
Agente de codificação do usuário escreve código
```
O orquestrador **não** toca em código legado, **não** faz parsing de schemas, **não** faz arqueologia. Opera 100% no nível das specs já produzidas.
## Comportamento ao ser ativado
Execute estritamente nesta ordem:
### Passo 1: Pré-condições
1. Verifique que `_reversa_sdd/` existe.
- Se não: encerre com a mensagem:
> "Não encontrei `_reversa_sdd/`. Execute `/reversa` primeiro para gerar as specs do sistema legado."
2. Carregue a lista de artefatos esperados em `references/expected_legacy_artifacts.yaml` (cópia local da skill).
3. Para cada artefato `required: true`, verifique presença em `_reversa_sdd/` (considere também aliases declarados).
- Se algum faltar: liste todos os faltantes, informe que o pipeline está bloqueado, peça ao usuário rodar `/reversa` novamente, e encerre.
### Passo 2: Estado e modo
1. Se `_reversa_sdd/migration/.state.json` **não existir**: este é primeiro run; siga para o passo 3.
2. Se existir: leia. Identifique `currentAgent.agent`, `currentAgent.phase`, `currentAgent.status`, `completedAgents`.
- **Caso especial: pausa intra-agente pendente.** Se `currentAgent.status == "awaiting_user_approval"` (típico após Designer Fase 1, sessão fechada antes da aprovação): releia o artefato em pausa (`topology_decision.md` quando `phase == "topology"`), reconstrua o resumo de 3 a 8 linhas usando o template do passo correspondente do agente, e re-execute a pausa humana antes de prosseguir. Não ofereça menu de opções até resolver a pausa.
- **Caso normal**, pergunte ao usuário:
> "Encontrei uma migração em andamento. Concluído: <agentes>. Pendente: <agentes>.
> 1. Continuar de onde parou (`--resume`)
> 2. Recriar tudo (`--regenerate=paradigm_advisor`)
> 3. Recriar a partir de um agente específico
> 4. Cancelar"
3. **Modo `--auto`**: se o usuário invocou explicitamente `--auto`, exiba aviso listando todos os defaults que serão aplicados (ver `references/auto-defaults.md`) e peça confirmação antes de prosseguir.
### Passo 3: Coleta do brief (entrevista)
Se `_reversa_sdd/migration/migration_brief.md` **não existir**, conduza a entrevista; caso contrário, ofereça `revisar / manter / recriar`.
Perguntas mínimas (uma por vez ou agrupadas, conforme a engine):
1. **Objetivo da migração**: por que estamos migrando?
2. **Métricas de sucesso**: como saberemos que deu certo?
3. **Restrições**: prazo, orçamento, técnicas, regulatórias.
4. **Fatores de risco conhecidos**.
5. **Stakeholders**: quem precisa ser ouvido / informado?
6. **Stack alvo**: linguagem, framework, banco, infra, mensageria, observabilidade.
7. **Escopo**: módulos incluídos e excluídos.
**Não pergunte paradigma. Não pergunte apetite.** Esses são responsabilidade do Paradigm Advisor.
Renderize `_reversa_sdd/migration/migration_brief.md` usando o template em `references/templates/migration_brief.md`.
### Passo 4: Inicializar `.state.json`
Crie `_reversa_sdd/migration/.state.json` a partir do template `references/state.json`. Preencha `startedAt`, `engine`, `reversaVersion`. Marque `currentAgent.agent = "paradigm_advisor"`, `currentAgent.phase = null`, `currentAgent.status = "running"`, `currentAgent.topologyApproved = false`.
**Contrato do `currentAgent`** (objeto, não string):
- `agent`: id do agente atualmente ativo (`paradigm_advisor` | `curator` | `strategist` | `designer` | `screen_translator` | `inspector` | `null` quando ocioso).
- `phase`: nome da sub-fase (apenas quando o agente declara fases; ex: `"topology"` ou `"architecture"` para o Designer; `"mode"` ou `"generation"` para o Screen Translator; `null` para os demais).
- `status`: `running` | `awaiting_user_approval` | `complete` | `failed` | `skipped`.
- `topologyApproved`: `true` somente após o usuário aprovar `topology_decision.md`. Persiste durante toda a vida da migração; é fonte única de verdade.
- `screenModeApproved`: `true` somente após o usuário aprovar `screen_modernization_decision.md`. Persiste durante toda a vida da migração. Ausência ou `false` significa não aprovado.
Ao transicionar para o próximo agente, **reescreva o objeto inteiro**, não atribua uma string. Ao mover um agente para `completedAgents`, defina `currentAgent.agent` para o próximo da fila (ou `null` ao final), reset `phase` e `status`, e **preserve** `topologyApproved` e `screenModeApproved` (eles não pertencem à transição de agente).
`status: skipped` é usado quando um agente conclui sem produzir artefatos por falta de aplicabilidade (ex: Screen Translator em legado sem UI). O agente é movido para `completedAgents` normalmente, com a justificativa registrada em `ambiguity_log.md`.
### Passo 5: Executar os 6 agentes em sequência
Para cada agente, faça:
1. Anuncie ao usuário: `"Iniciando o **<Agente>**, <responsabilidade curta>."`.
2. Ative a skill do agente (`reversa-paradigm-advisor`, `reversa-curator`, `reversa-strategist`, `reversa-designer`, `reversa-screen-translator`, `reversa-inspector`). Se a engine não suportar ativação direta por nome, instrua a leitura de `.agents/skills/<id>/SKILL.md` no contexto atual.
3. Aguarde a conclusão **ou** um checkpoint intra-agente (ver passo 5b). Se for conclusão, valide os artefatos previstos.
4. Atualize `.state.json`: mover agente de `pendingAgents` → `completedAgents`, atualizar `lastCheckpoint`, registrar artefatos com hash SHA-256.
5. **Pausa humana** (ver passo 6) antes de prosseguir, conforme tabela abaixo.
#### Passo 5b: Checkpoint intra-agente
Alguns agentes operam em fases com pausa humana entre elas. Hoje, **Designer** e **Screen Translator** se comportam assim. Cada um declara as próprias fases na seção "Detecção de fase ao iniciar" do SKILL.md, e usa um campo `<artifact>Approved` no `currentAgent` como fonte única de verdade da aprovação.
| Agente | Fase 1 (decide, pausa) | Artefato | Campo de aprovação | Fase 2 (gera) |
|---|---|---|---|---|
| Designer | `topology` | `topology_decision.md` | `topologyApproved` | `architecture` (Designer Fase 2) |
| Screen Translator | `mode` | `screen_modernization_decision.md` | `screenModeApproved` | `generation` (target_screens, deviations, golden) |
Fluxo genérico:
1. Agente roda Fase 1, escreve o artefato de decisão e devolve controle com sinal `phase: <nome-da-fase-1>, status: awaiting_user_approval`.
2. Orquestrador grava em `.state.json` o campo `currentAgent.phase` e `currentAgent.status`. **Não** move o agente para `completedAgents`.
3. Orquestrador executa a pausa humana descrita no passo 6 (linha correspondente da tabela).
4. Após aprovação, orquestrador registra `currentAgent.<artifact>Approved = true`. Essa é a fonte única de verdade; **não** duplicar no front-matter do artefato.
5. Orquestrador **re-ativa o mesmo agente**. O agente detecta que o artefato existe e está aprovado, e pula direto para a Fase 2.
6. Ao concluir a Fase 2, o agente devolve controle com `status: complete` (ou `skipped` se for o caso do Screen Translator em legado sem UI). O orquestrador roda a pausa correspondente na tabela.
7. Se o usuário pedir ajustes em qualquer das duas fases, orquestrador re-ativa o agente apontando explicitamente qual fase deve ser refeita:
- Designer: `--regenerate-phase=topology` ou `--regenerate-phase=architecture`.
- Screen Translator: `--regenerate-phase=mode` ou `--regenerate-phase=generation`.
O agente respeita e descarta artefatos da fase em diante.
Esse mecanismo é genérico: novos agentes podem adotá-lo declarando seus checkpoints na seção "Detecção de fase ao iniciar" do próprio SKILL.md e adicionando um campo `<artifact>Approved` ao contrato do `currentAgent`.
| Após o agente | Pausa para |
|---|---|
| Paradigm Advisor | Confirmar paradigma e gap |
| Curator | Revisar itens DECISÃO HUMANA |
| Strategist | Escolher estratégia |
| Designer (Fase 1) | Aprovar `topology_decision.md` (preservar / modernizar / híbrido) antes de detalhar arquitetura |
| Designer (Fase 2) | Aprovar arquitetura (se ajustes, Designer roda novamente) |
| Screen Translator (Fase 1) | Aprovar `screen_modernization_decision.md` (literal / modernizado / híbrido). Em modo híbrido, listas explícitas de telas por modo são obrigatórias. Em legado sem UI, agente pula sem pausa. |
| Screen Translator (Fase 2) | Aprovar deviations pendentes em `screen_deviation_log.md` (se houver) antes de seguir ao Inspector |
| Inspector | (sem pausa; segue para handoff) |
### Passo 6: Pausa humana (`human_decision_gate`)
Em cada pausa:
1. Apresente um resumo claro do que o agente anterior produziu (3 a 8 linhas).
2. Liste explicitamente o que precisa de decisão.
3. Aguarde resposta do usuário.
Comportamento por engine:
- **Engines com chat interativo (Claude Code, Cursor, Codex, etc.)**: pergunte direto no chat e aguarde.
- **Engines sem TTY interativo**: escreva `_reversa_sdd/migration/pending_decisions.md` com as decisões abertas, instrua o usuário a editar e sinalizar conclusão; releia o arquivo após sinalização.
- **Modo `--auto`**: aplique os defaults documentados em `references/auto-defaults.md`. Marque cada decisão auto-aplicada em `ambiguity_log.md` para revisão posterior.
### Passo 7: Consolidar `ambiguity_log.md`
Após cada agente, integre itens ⚠️ e pendências em `_reversa_sdd/migration/ambiguity_log.md`. Ao final, organize em três grupos:
- PENDENTES (não pode haver após Inspector concluir)
- RESOLVIDOS COM DECISÃO HUMANA
- REFERIDOS À CODIFICAÇÃO
### Passo 8: Gerar `handoff.md`
Após Inspector concluir e `ambiguity_log` consolidado:
1. Renderize `_reversa_sdd/migration/handoff.md` usando o template em `references/templates/handoff.md`.
2. Liste todos os artefatos produzidos.
3. **Destaque `paradigm_decision.md` e `topology_decision.md` como leitura obrigatória primeiro** (paradigma decide o "como pensar"; topologia decide o "como organizar a árvore").
4. Liste itens REFERIDOS À CODIFICAÇÃO em seção dedicada.
5. Adicione próximos passos específicos para o agente de codificação (configurar repositório novo, implementar bottom-up, validar paridade, executar cutover).
6. Em modo `--auto`: liste itens auto-decididos para revisão posterior.
### Passo 9: Resumo final e logs
Apresente no chat:
> "Migração concluída.
> - Agentes executados: 6 (Screen Translator pode ter rodado em modo `skipped` se o legado não tem UI)
> - Artefatos criados: <N>
> - Itens em `ambiguity_log.md`: <N> pendentes (esperado 0), <N> resolvidos, <N> referidos à codificação
> - Tempo total: <minutos>
>
> Próximo passo: abra `_reversa_sdd/migration/handoff.md` no agente de codificação que vai implementar o sistema novo."
Grave log completo em `_reversa_sdd/migration/.logs/<timestamp>-migrate.log` com timestamp por entrada e identificação do agente. Se a engine expor contagem de tokens ou custo, registre; se não, deixe campos vazios sem invalidar o log.
## Modos especiais
### `--resume`
1. Leia `.state.json`.
2. Identifique `currentAgent.agent`, `currentAgent.phase` e `currentAgent.status`.
3. Se `currentAgent.status == "awaiting_user_approval"`, siga o caso especial do passo 2 (re-executa a pausa pendente). Caso contrário, confirme com o usuário antes de retomar.
4. Continue do agente seguinte (ou do próprio se ele estava `failed`, ou da próxima fase se ele estava `awaiting_user_approval` e foi resolvido).
### `--regenerate=<agent>`, `--regenerate=designer:<phase>` ou `--regenerate=screen_translator:<phase>`
1. Confirme com o usuário (operação destrutiva no escopo de `_reversa_sdd/migration/` e `_reversa_sdd/screens/`).
2. Faça backup em `_reversa_sdd/migration/.backup-<timestamp>/` e, se aplicável ao Screen Translator, em `_reversa_sdd/screens/.backup-<timestamp>/`.
3. Apague artefatos:
- `--regenerate=<agent>`: artefatos do agente especificado **e de todos os agentes posteriores** na ordem do pipeline. Para o Designer, inclui `topology_decision.md` e reseta `currentAgent.topologyApproved = false`. Para o Screen Translator, inclui `screen_modernization_decision.md`, `target_screens.md`, `screen_deviation_log.md`, `_reversa_sdd/screens/inventory.json` e `_reversa_sdd/screens/golden/`, e reseta `currentAgent.screenModeApproved = false`.
- `--regenerate=designer:topology`: apaga todos os artefatos do Designer (incluindo `topology_decision.md`) e reseta `topologyApproved`. Equivalente a `--regenerate=designer` mas explícito sobre voltar à Fase 1.
- `--regenerate=designer:architecture`: apaga apenas artefatos da Fase 2 do Designer (`target_architecture.md`, `target_domain_model.md`, `target_data_model.md`, `data_migration_plan.md`). Preserva `topology_decision.md` e `topologyApproved`.
- `--regenerate=screen_translator:mode`: apaga todos os artefatos do Screen Translator (incluindo `screen_modernization_decision.md`) e reseta `screenModeApproved`. Equivalente a `--regenerate=screen_translator` mas explícito sobre voltar à Fase 1.
- `--regenerate=screen_translator:generation`: apaga apenas artefatos da Fase 2 (`target_screens.md`, `screen_deviation_log.md`, `_reversa_sdd/screens/inventory.json`, `_reversa_sdd/screens/golden/`). Preserva `screen_modernization_decision.md` e `screenModeApproved`.
4. Atualize `.state.json` removendo agentes do `completedAgents` (quando aplicável) e ajustando `currentAgent`.
5. Re-ative o agente com a flag de fase, se aplicável.
### `--auto`
Aplica defaults sem pausas humanas. Ver `references/auto-defaults.md`.
Sempre exibir aviso explícito antes de iniciar listando todos os defaults aplicados.
## Casos de borda
- **`_reversa_sdd/` incompleto**: lista artefatos faltantes e aborta.
- **Brief presente mas mudanças no sistema legado**: ofereça revisar / recriar antes de prosseguir.
- **Modificação manual de artefato gerado** (hash em `.state.json` divergente): pause, apresente diff resumido e ofereça (a) preservar versão modificada e abortar regeneração, (b) sobrescrever com backup, (c) abortar pipeline. `--auto` adota (a) por default.
- **Falha de LLM no meio do agente**: estado preservado, agente marcado como `failed`. `--resume` reexecuta esse agente.
- **Agente Designer pediu ajustes** após revisão da arquitetura: rerodar Designer no mesmo passo, sem avançar para Inspector.
## Layout de saída (transversal)
Este agente faz parte do Time de Migração e escreve exclusivamente em `_reversa_sdd/migration/`. Essa pasta é transversal à organização escolhida em `[specs]` do `config.toml`, fora das pastas de unit (feature folders) do Time de Descoberta. Não aplicar aqui a estrutura `<unit>/requirements.md|design.md|tasks.md`, ela pertence ao Writer.
## Regras absolutas
- **Não modificar nada fora de `_reversa_sdd/migration/`.**
- Artefatos pré-existentes em `_reversa_sdd/` são **lidos**, nunca modificados.
- Backup automático antes de qualquer operação destrutiva.
- Modo padrão é interativo. `--auto` é explícito e exibe os defaults antes de aplicar.
- Cada pausa apresenta resumo + decisões pendentes; nunca prossegue silenciosamente.
## Política de edição do legado
Este orquestrador escreve só em `_reversa_sdd/migration/`, mas se qualquer passo exigir escrita fora das pastas próprias do Reversa, leia antes `.reversa/reversa-config.json` e obedeça (releia a cada ativação):
- Ausente, inválido ou `allowLegacyEdits: false`: recuse a escrita informando o caminho recusado, o estado atual da config e o que o usuário deve editar para liberar.
Voir sur GitHub