up-cc 0.16.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -577
- package/package.json +5 -3
- package/up/CHANGELOG.md +110 -0
- package/up/agents/up-arquiteto.md +95 -39
- package/up/agents/up-auditor.md +218 -0
- package/up/agents/up-executor.md +94 -31
- package/up/agents/up-mapeador-codigo.md +63 -10
- package/up/agents/up-pesquisador.md +278 -0
- package/up/agents/up-revisor.md +249 -0
- package/up/agents/up-sintetizador.md +156 -179
- package/up/agents/up-tester.md +280 -0
- package/up/agents/up-verificador.md +95 -11
- package/up/bin/install.js +182 -19
- package/up/bin/lib/core.cjs +17 -43
- package/up/bin/lib/github.cjs +495 -0
- package/up/bin/lib/multica.cjs +424 -0
- package/up/bin/up-tools.cjs +167 -46
- package/up/commands/auditar.md +66 -0
- package/up/commands/build.md +54 -43
- package/up/commands/depurar.md +1 -1
- package/up/commands/plan.md +52 -38
- package/up/commands/rapido.md +15 -9
- package/up/commands/testar.md +81 -122
- package/up/commands/up.md +106 -0
- package/up/hooks/up-session-start.js +107 -0
- package/up/references/engineering-principles.md +1 -1
- package/up/references/governance-rules.md +5 -5
- package/up/references/production-requirements.md +1 -1
- package/up/references/severity-levels.md +2 -2
- package/up/references/tdd-evidence-types.md +81 -0
- package/up/skills/up-brainstorm/SKILL.md +54 -0
- package/up/skills/up-brainstorm/visual-companion.md +33 -0
- package/up/skills/up-tdd/SKILL.md +39 -0
- package/up/skills/up-verificar-antes-de-concluir/SKILL.md +49 -0
- package/up/skills/usando-up/SKILL.md +26 -0
- package/up/templates/audit-plan.md +3 -3
- package/up/templates/audit-report.md +2 -2
- package/up/templates/design-tokens.md +2 -2
- package/up/workflows/auditar.md +255 -0
- package/up/workflows/build.md +600 -386
- package/up/workflows/dcrv.md +183 -99
- package/up/workflows/governance.md +112 -220
- package/up/workflows/plan.md +169 -399
- package/up/workflows/rapido.md +7 -1
- package/up/workflows/up.md +447 -0
- package/up/agents/up-analista-codigo.md +0 -446
- package/up/agents/up-api-tester.md +0 -405
- package/up/agents/up-architecture-supervisor.md +0 -126
- package/up/agents/up-audit-supervisor.md +0 -83
- package/up/agents/up-auditor-modernidade.md +0 -378
- package/up/agents/up-auditor-performance.md +0 -426
- package/up/agents/up-auditor-ux.md +0 -396
- package/up/agents/up-backend-specialist.md +0 -175
- package/up/agents/up-blind-validator.md +0 -259
- package/up/agents/up-chief-architect.md +0 -184
- package/up/agents/up-chief-engineer.md +0 -202
- package/up/agents/up-chief-operations.md +0 -123
- package/up/agents/up-chief-product.md +0 -103
- package/up/agents/up-chief-quality.md +0 -211
- package/up/agents/up-clone-crawler.md +0 -234
- package/up/agents/up-clone-design-extractor.md +0 -227
- package/up/agents/up-clone-feature-mapper.md +0 -225
- package/up/agents/up-clone-prd-writer.md +0 -169
- package/up/agents/up-clone-verifier.md +0 -227
- package/up/agents/up-code-reviewer.md +0 -229
- package/up/agents/up-consolidador-ideias.md +0 -493
- package/up/agents/up-database-specialist.md +0 -169
- package/up/agents/up-delivery-auditor.md +0 -247
- package/up/agents/up-devops-agent.md +0 -203
- package/up/agents/up-execution-supervisor.md +0 -315
- package/up/agents/up-exhaustive-tester.md +0 -348
- package/up/agents/up-frontend-specialist.md +0 -152
- package/up/agents/up-operations-supervisor.md +0 -94
- package/up/agents/up-pesquisador-mercado.md +0 -350
- package/up/agents/up-pesquisador-projeto.md +0 -358
- package/up/agents/up-planning-auditor.md +0 -284
- package/up/agents/up-planning-supervisor.md +0 -260
- package/up/agents/up-product-analyst.md +0 -192
- package/up/agents/up-product-supervisor.md +0 -83
- package/up/agents/up-project-ceo.md +0 -352
- package/up/agents/up-qa-agent.md +0 -171
- package/up/agents/up-quality-supervisor.md +0 -178
- package/up/agents/up-requirements-validator.md +0 -230
- package/up/agents/up-security-reviewer.md +0 -137
- package/up/agents/up-sintetizador-melhorias.md +0 -407
- package/up/agents/up-system-designer.md +0 -332
- package/up/agents/up-technical-writer.md +0 -188
- package/up/agents/up-verification-supervisor.md +0 -111
- package/up/agents/up-visual-critic.md +0 -358
- package/up/commands/adicionar-fase.md +0 -47
- package/up/commands/adicionar-testes.md +0 -145
- package/up/commands/ajuda.md +0 -176
- package/up/commands/atualizar.md +0 -103
- package/up/commands/clone-builder.md +0 -67
- package/up/commands/configurar.md +0 -219
- package/up/commands/custos.md +0 -67
- package/up/commands/dashboard.md +0 -48
- package/up/commands/discutir-fase.md +0 -35
- package/up/commands/executar-fase.md +0 -40
- package/up/commands/ideias.md +0 -49
- package/up/commands/iniciar.md +0 -31
- package/up/commands/mapear-codigo.md +0 -63
- package/up/commands/melhorias.md +0 -45
- package/up/commands/mobile-first.md +0 -71
- package/up/commands/modo-builder.md +0 -186
- package/up/commands/novo-projeto.md +0 -40
- package/up/commands/onboard.md +0 -69
- package/up/commands/pausar.md +0 -33
- package/up/commands/planejar-fase.md +0 -45
- package/up/commands/progresso.md +0 -33
- package/up/commands/remover-fase.md +0 -34
- package/up/commands/resetar.md +0 -27
- package/up/commands/retomar.md +0 -35
- package/up/commands/saude.md +0 -103
- package/up/commands/ux-tester.md +0 -63
- package/up/commands/verificar-trabalho.md +0 -35
- package/up/workflows/adicionar-fase.md +0 -112
- package/up/workflows/builder-e2e.md +0 -501
- package/up/workflows/builder.md +0 -3419
- package/up/workflows/ceo-intake.md +0 -305
- package/up/workflows/ceo-updates.md +0 -183
- package/up/workflows/clone-builder.md +0 -320
- package/up/workflows/discutir-fase.md +0 -336
- package/up/workflows/executar-fase.md +0 -358
- package/up/workflows/executar-plano.md +0 -659
- package/up/workflows/ideias.md +0 -381
- package/up/workflows/iniciar.md +0 -235
- package/up/workflows/melhorias.md +0 -409
- package/up/workflows/mobile-first.md +0 -692
- package/up/workflows/novo-projeto.md +0 -778
- package/up/workflows/planejar-fase.md +0 -293
- package/up/workflows/progresso.md +0 -226
- package/up/workflows/retomar.md +0 -231
- package/up/workflows/ux-tester.md +0 -526
- package/up/workflows/verificar-trabalho.md +0 -308
package/up/workflows/build.md
CHANGED
|
@@ -1,19 +1,40 @@
|
|
|
1
1
|
<purpose>
|
|
2
2
|
Workflow `/up:build` — Execucao de projeto previamente planejado.
|
|
3
3
|
|
|
4
|
-
Requer `.plano/PLAN-READY.md` (gerado por `/up:plan`).
|
|
4
|
+
Requer `.plano/PLAN-READY.md` (gerado por `/up:plan`). Conduz Build (loop por fase) + Quality Gate
|
|
5
|
+
global + Delivery. Pode executar projeto planejado em outro runtime — confia no PLAN-READY.md.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Pode executar projeto planejado em outro runtime — confia no PLAN-READY.md.
|
|
7
|
+
Este e o MOTOR UNICO de execucao do redesign v2. Absorveu executar-fase.md, executar-plano.md e a
|
|
8
|
+
parte de execucao do modo-builder (builder.md, que foi deletado).
|
|
9
9
|
</purpose>
|
|
10
10
|
|
|
11
|
+
<migrado_de_builder>
|
|
12
|
+
O antigo builder.md (3416 linhas) foi deletado. Capacidades reais migradas para ca (ou pro up.md/plan.md),
|
|
13
|
+
SEM trazer governanca hierarquica/supervisores/CEO:
|
|
14
|
+
|
|
15
|
+
- **Intake autonomo de projeto + pesquisa inline de stack:** migrado para `workflows/up.md` (Passo 2,
|
|
16
|
+
classify-task escala o brainstorm; greenfield spawna 4x up-pesquisador; modo light = mini-scan inline).
|
|
17
|
+
`/up:build` assume que isso ja rodou e que existe PLAN-READY.md.
|
|
18
|
+
- **Crash recovery via LOCK.md:** preservado aqui (Estagio 0.3).
|
|
19
|
+
- **Routing por tipo de plano (frontend/backend/database/misto):** preservado (Estagio 3.2), AGORA via
|
|
20
|
+
CONTEXTO no `up-executor` (carrega skill/ref de dominio sob demanda), sem agentes specialist separados.
|
|
21
|
+
- **Pre-inline de contexto via `up-tools.cjs context`:** preservado (Estagio 3.3), economiza tokens por spawn.
|
|
22
|
+
- **Verification ladder deterministica (verify-static antes do verificador-LLM):** preservada (Estagio 3.6).
|
|
23
|
+
- **E2E + DCRV por fase:** delega a `@~/.claude/up/workflows/dcrv.md` (que absorveu builder-e2e.md).
|
|
24
|
+
- **Modo light (pipeline enxuto):** o conceito de "feature pequena = menos cerimonia" agora e decidido
|
|
25
|
+
upstream pelo classify-task (em up.md). Aqui o pipeline e o mesmo; o cap de rework e 1 round.
|
|
26
|
+
|
|
27
|
+
NAO migrado (morto de proposito): CEO/chiefs/supervisores, governanca hierarquica, re-plans com 2 niveis
|
|
28
|
+
de aprovacao LLM, updates periodicos ao dono.
|
|
29
|
+
</migrado_de_builder>
|
|
30
|
+
|
|
11
31
|
<core_principle>
|
|
12
|
-
|
|
32
|
+
Pipeline final por fase (redesign v2):
|
|
13
33
|
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
34
|
+
```
|
|
35
|
+
[up-planejador (replan LOCAL, so se preciso)] -> up-executor (roteia por contexto) -> up-verificador
|
|
36
|
+
-> [GATE approvals.log] -> up-revisor -> marcar completa
|
|
37
|
+
```
|
|
17
38
|
|
|
18
39
|
**Model routing configuravel (v0.9.0+):**
|
|
19
40
|
Antes de spawnar qualquer agente, resolver o modelo:
|
|
@@ -21,41 +42,41 @@ Antes de spawnar qualquer agente, resolver o modelo:
|
|
|
21
42
|
MODEL=$(node "$HOME/.claude/up/bin/up-tools.cjs" config resolve-model {agent-name} --raw)
|
|
22
43
|
```
|
|
23
44
|
Se `default`: nao passar `model=`. Se `opus/sonnet/haiku`: passar `model="{MODEL}"` no spawn.
|
|
24
|
-
Isso permite que o usuario configure via `/up:configurar` quais agentes usam qual modelo.
|
|
25
|
-
Sem configuracao, todos usam o modelo do runtime (comportamento v0.6.0).
|
|
26
45
|
|
|
27
46
|
**Re-plan local permitido (max 2):**
|
|
28
|
-
Se durante execucao
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
**
|
|
38
|
-
**
|
|
39
|
-
**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
Se durante a execucao ficar claro que um plano e inviavel, o orquestrador pode re-planejar a fase
|
|
48
|
+
LOCALMENTE via `up-planejador` (self-check). NUNCA volta pro runtime que planejou originalmente.
|
|
49
|
+
|
|
50
|
+
**SEPARACAO RIGIDA DE AGENTES:**
|
|
51
|
+
O LLM tende a colapsar passos (mesmo agente executa + verifica). Isso e PROIBIDO. Cada passo do Stage 3
|
|
52
|
+
e um `Agent()` SEPARADO. O enforcement e o GATE deterministico do `approvals.log`
|
|
53
|
+
(ver `@~/.claude/up/workflows/governance.md`), nao uma piramide de supervisores.
|
|
54
|
+
|
|
55
|
+
**GitHub-nativo e o DEFAULT (v2):**
|
|
56
|
+
- **PADRAO (sem flag):** cada fase abre uma worktree + branch `up/fase-NN-slug` e (se houver `gh` + remote)
|
|
57
|
+
uma issue do GitHub; no fim da fase, se a fase tem UI, **sobe o dev server e PEDE aprovacao visual antes de
|
|
58
|
+
mergear** (3.8.0), depois fecha (merge local / PR / deixa / descarta). Isto e o caminho quente.
|
|
59
|
+
Controlado por `config.github_native=true` (default).
|
|
60
|
+
- `--solo`: ESCAPE HATCH sem cerimonia. Forca `github_native=false` SO nesta execucao. Commit atomico na
|
|
61
|
+
branch ATUAL. Zero worktree, zero issue, zero PR, zero rede. (Mesmo comportamento de `/up:rapido`.)
|
|
62
|
+
- **Teste visual antes do merge (`require_visual_test`, default true):** fase de UI sobe dev server e exige
|
|
63
|
+
o dono aprovar na tela ANTES do merge (3.8.0). Projeto em PRODUCAO: deixe ligado (nada sobe sem voce ver).
|
|
64
|
+
- `--auto`: pula o MENU de fechamento. Apos o GATE aprovar, `finish-phase --mode auto` (PR -> merge squash ->
|
|
65
|
+
cleanup). MAS o teste visual (3.8.0) ainda roda se `require_visual_test=true` (so `false` deixa o --auto
|
|
66
|
+
mergear UI sem aprovacao). So faz sentido com github_native ligado.
|
|
67
|
+
- `--board`: espelha status no Multica (espelho de board OPT-IN, BATCHED no fim da onda/fase). NAO ha
|
|
68
|
+
stream ao vivo no fluxo local: o board mostra so o status (`todo -> in_progress -> in_review -> done /
|
|
69
|
+
blocked`), nunca cada tool_use. Chamadas via `up-tools.cjs multica {init|sync|board}` (que usa
|
|
70
|
+
`multica.cjs`, deteccao `uname -s` Mac->`ssh server-ecoup`, FAIL-OPEN: se `multica` indisponivel, avisa
|
|
71
|
+
e segue sem board, nunca crasha). So roda quando `--board` ligado.
|
|
72
|
+
|
|
73
|
+
**FAIL-OPEN universal:** `start-phase`/`finish-phase` detectam `gh` + remote. Faltando qualquer um, degradam
|
|
74
|
+
para git local (worktree local + merge local; issue/PR = null) com aviso, NUNCA crasham. `git worktree` e
|
|
75
|
+
sempre local e funciona offline. Com `--solo` nao ha nem worktree (commit direto na branch atual).
|
|
76
|
+
|
|
77
|
+
**Onde o estado vive:** `git-map.json` e canonico no working dir PRINCIPAL (`.plano/git-map.json`). O `.plano/`
|
|
78
|
+
de cada fase viaja na branch da fase (worktree) e volta pra main no merge. STATE.md permanece a fonte humana
|
|
79
|
+
de "onde estou"; git-map.json e o indice maquina de "onde esta cada fase no GitHub".
|
|
59
80
|
</core_principle>
|
|
60
81
|
|
|
61
82
|
<process>
|
|
@@ -66,21 +87,19 @@ Specialist → [GATE A] → EXECUTION-SUPERVISOR → [GATE B] → Verificador
|
|
|
66
87
|
|
|
67
88
|
```bash
|
|
68
89
|
if [ ! -f ~/.claude/up/owner-profile.md ]; then
|
|
69
|
-
echo "Owner profile nao existe NESTE runtime. Rodando
|
|
70
|
-
# Delegar pro workflow onboarding.md
|
|
90
|
+
echo "Owner profile nao existe NESTE runtime. Rodando onboarding..."
|
|
91
|
+
# Delegar pro workflow @~/.claude/up/workflows/onboarding.md
|
|
71
92
|
fi
|
|
72
93
|
```
|
|
73
94
|
|
|
74
|
-
|
|
95
|
+
O profile e do RUNTIME ATUAL, nao do runtime que planejou.
|
|
75
96
|
|
|
76
97
|
### 0.2 PLAN-READY.md Existe?
|
|
77
98
|
|
|
78
99
|
```bash
|
|
79
100
|
if [ ! -f .plano/PLAN-READY.md ]; then
|
|
80
101
|
echo "ERRO: Este projeto nao foi planejado."
|
|
81
|
-
echo ""
|
|
82
|
-
echo "Use /up:plan primeiro pra planejar o projeto."
|
|
83
|
-
echo "Ou /up:modo-builder pra planejar e executar de uma vez."
|
|
102
|
+
echo "Use /up:plan primeiro. Ou /up \"descricao\" -> /up:plan -> /up:build."
|
|
84
103
|
exit 1
|
|
85
104
|
fi
|
|
86
105
|
```
|
|
@@ -91,7 +110,8 @@ fi
|
|
|
91
110
|
ls .plano/LOCK.md 2>/dev/null
|
|
92
111
|
```
|
|
93
112
|
|
|
94
|
-
Se LOCK.md existe e `stage: build`: retomar.
|
|
113
|
+
Se LOCK.md existe e `stage: build`: retomar do passo/fase correto (pular o que ja tem SUMMARY/VERIFICATION).
|
|
114
|
+
Se `status: completed`: deletar LOCK.md e iniciar normalmente.
|
|
95
115
|
|
|
96
116
|
## Estagio V: VALIDACAO LIGHT
|
|
97
117
|
|
|
@@ -100,7 +120,6 @@ Se LOCK.md existe e `stage: build`: retomar.
|
|
|
100
120
|
### V.1 Parsear PLAN-READY.md
|
|
101
121
|
|
|
102
122
|
```bash
|
|
103
|
-
# Extrair frontmatter
|
|
104
123
|
PLANNED_RUNTIME=$(grep "runtime:" .plano/PLAN-READY.md | head -1 | awk '{print $2}')
|
|
105
124
|
INTENDED_RUNTIME=$(grep -A1 "intended_execution:" .plano/PLAN-READY.md | tail -1 | awk '{print $2}')
|
|
106
125
|
TOTAL_PHASES=$(grep "total_phases:" .plano/PLAN-READY.md | awk '{print $2}')
|
|
@@ -110,15 +129,13 @@ CONFIDENCE=$(grep "planning_confidence:" .plano/PLAN-READY.md | awk '{print $2}'
|
|
|
110
129
|
### V.2 Validacao de Compatibilidade
|
|
111
130
|
|
|
112
131
|
```bash
|
|
113
|
-
CURRENT_RUNTIME="claude-code"
|
|
132
|
+
CURRENT_RUNTIME="claude-code"
|
|
114
133
|
[ -d ~/.config/opencode ] && CURRENT_RUNTIME="opencode"
|
|
115
134
|
[ -d ~/.gemini ] && CURRENT_RUNTIME="gemini-cli"
|
|
116
135
|
|
|
117
|
-
# Se intended_execution especifica um runtime e nao e o atual, alertar
|
|
118
136
|
if [ "$INTENDED_RUNTIME" != "same" ] && [ "$INTENDED_RUNTIME" != "any" ] && [ "$INTENDED_RUNTIME" != "$CURRENT_RUNTIME" ]; then
|
|
119
|
-
echo "AVISO: Plano gerado pra $INTENDED_RUNTIME, voce esta em $CURRENT_RUNTIME"
|
|
120
|
-
|
|
121
|
-
# AskUserQuestion sim/nao
|
|
137
|
+
echo "AVISO: Plano gerado pra $INTENDED_RUNTIME, voce esta em $CURRENT_RUNTIME. Continuar?"
|
|
138
|
+
# AskUserQuestion sim/nao (output direto, sem CEO)
|
|
122
139
|
fi
|
|
123
140
|
```
|
|
124
141
|
|
|
@@ -133,141 +150,229 @@ fi
|
|
|
133
150
|
|
|
134
151
|
### V.4 Validar Planos Listados
|
|
135
152
|
|
|
136
|
-
Pra cada plano listado em PLAN-READY.md, checar se arquivo existe:
|
|
137
|
-
|
|
138
153
|
```bash
|
|
139
|
-
# Extrair lista de planos do PLAN-READY.md
|
|
140
154
|
PLANS=$(grep -oE "fases/[0-9]+-[a-z-]+/[0-9]+-[0-9]+-PLAN.md" .plano/PLAN-READY.md)
|
|
141
|
-
|
|
142
155
|
for plan in $PLANS; do
|
|
143
|
-
|
|
144
|
-
echo "FALTANDO: $plan"
|
|
145
|
-
FAIL=1
|
|
146
|
-
fi
|
|
156
|
+
[ ! -f ".plano/$plan" ] && echo "FALTANDO: $plan" && FAIL=1
|
|
147
157
|
done
|
|
148
158
|
```
|
|
149
159
|
|
|
150
160
|
### V.5 Decidir
|
|
151
161
|
|
|
152
|
-
**
|
|
162
|
+
**Tudo OK:** prosseguir. **Falta algo:** alertar o dono (AskUserQuestion), oferecer re-planejar
|
|
163
|
+
localmente (`/up:plan`) ou abortar.
|
|
153
164
|
|
|
154
|
-
|
|
155
|
-
- Alertar usuario
|
|
156
|
-
- Oferecer: "Posso planejar localmente?" (re-roda /up:plan)
|
|
157
|
-
- Ou abortar
|
|
165
|
+
## Estagio C: CONFIRMACAO DO DONO (orquestrador, sem CEO)
|
|
158
166
|
|
|
159
|
-
|
|
167
|
+
Output direto do orquestrador (le owner-profile pra tom):
|
|
160
168
|
|
|
161
|
-
|
|
169
|
+
```
|
|
170
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
171
|
+
UP > BUILD
|
|
172
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
162
173
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
174
|
+
Projeto planejado em {runtime}.
|
|
175
|
+
Resumo: {N} fases, {M} planos. Planning confidence: {X}/100.
|
|
176
|
+
Pendencias conhecidas: {de PENDING.md}.
|
|
177
|
+
|
|
178
|
+
Modo git: {GITHUB_MODE} (GitHub-nativo e o default; --solo desliga; --auto pula o menu)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Resolver `GITHUB_MODE` antes do banner:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# --solo forca github_native=false SO nesta execucao
|
|
185
|
+
if [ "$SOLO" = "true" ]; then
|
|
186
|
+
GITHUB_NATIVE=false
|
|
187
|
+
else
|
|
188
|
+
GITHUB_NATIVE=$(node "$HOME/.claude/up/bin/up-tools.cjs" config get github_native --raw 2>/dev/null)
|
|
189
|
+
[ -z "$GITHUB_NATIVE" ] && GITHUB_NATIVE=true # default TRUE
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
if [ "$GITHUB_NATIVE" = "true" ]; then
|
|
193
|
+
GITHUB_MODE="GitHub-nativo (worktree + issue + PR/menu por fase)"
|
|
194
|
+
[ "$AUTO" = "true" ] && GITHUB_MODE="GitHub-nativo --auto (PR + merge squash automatico)"
|
|
195
|
+
else
|
|
196
|
+
GITHUB_MODE="--solo (commit atomico na branch atual, sem worktree/issue/PR)"
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
# --board liga o espelho Multica (OPT-IN). So tem efeito se passado explicitamente.
|
|
200
|
+
BOARD=false
|
|
201
|
+
[ "$BOARD_FLAG" = "true" ] && BOARD=true
|
|
202
|
+
[ "$BOARD" = "true" ] && GITHUB_MODE="$GITHUB_MODE + Multica board (espelho de status, batched, fail-open)"
|
|
188
203
|
```
|
|
189
204
|
|
|
190
|
-
|
|
205
|
+
Confirmar via AskUserQuestion ("Iniciar execucao?"). Se recusar: abortar.
|
|
206
|
+
|
|
207
|
+
## Estagio 3: BUILD (loop por fase — com GATE deterministico)
|
|
191
208
|
|
|
192
|
-
**Inicializar governance
|
|
209
|
+
**Inicializar governance** (ver `@~/.claude/up/workflows/governance.md`):
|
|
193
210
|
```bash
|
|
194
211
|
mkdir -p .plano/governance
|
|
195
212
|
touch .plano/governance/approvals.log
|
|
196
|
-
|
|
213
|
+
[ -s .plano/governance/approvals.log ] || \
|
|
214
|
+
echo "# Build governance initialized at $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> .plano/governance/approvals.log
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Inicializar board no Multica (so se `--board`, UMA vez no inicio do projeto):**
|
|
218
|
+
`multica init` garante o `project` no Multica + a issue-pai (e as issues-filhas por fase, se `/up:plan`
|
|
219
|
+
ja as criou) e grava `metadata up_project=<repo>`. FAIL-OPEN: se `multica` indisponivel ou der erro,
|
|
220
|
+
avisa e segue sem board (nunca crasha o build). Deteccao `uname -s` fica dentro de `multica.cjs`.
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
if [ "$BOARD" = "true" ]; then
|
|
224
|
+
# init = ensureProject + issue-pai (idempotente; reconcilia via metadata up_project).
|
|
225
|
+
MULTICA_INIT=$(node "$HOME/.claude/up/bin/up-tools.cjs" multica init --raw 2>/dev/null) \
|
|
226
|
+
|| echo "AVISO: Multica indisponivel (init). Seguindo sem board."
|
|
227
|
+
fi
|
|
197
228
|
```
|
|
198
229
|
|
|
199
230
|
Para cada fase em ROADMAP.md (em ordem):
|
|
200
231
|
|
|
201
|
-
### 3.
|
|
232
|
+
### 3.0 Abrir a fase (GitHub-nativo - DEFAULT)
|
|
233
|
+
|
|
234
|
+
A menos que `--solo` (ou `github_native=false`), abrir worktree + branch + issue ANTES de executar a fase.
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
PHASE_SLUG=$(node "$HOME/.claude/up/bin/up-tools.cjs" slug "{phase_name}" --raw)
|
|
238
|
+
|
|
239
|
+
if [ "$GITHUB_NATIVE" = "true" ]; then
|
|
240
|
+
# Cria worktree + branch up/fase-NN-slug; se gh+remote, cria issue. Escreve .plano/git-map.json.
|
|
241
|
+
# Fail-open: sem gh/remote -> worktree local, issue=null, aviso (nunca crasha).
|
|
242
|
+
START=$(node "$HOME/.claude/up/bin/up-tools.cjs" github start-phase \
|
|
243
|
+
--phase {phase_number} --slug "$PHASE_SLUG" --raw)
|
|
244
|
+
if [[ "$START" == @file:* ]]; then START=$(cat "${START#@file:}"); fi
|
|
245
|
+
WORKTREE=$(echo "$START" | grep -oE '"worktree"[^,}]*' | sed 's/.*: *"//;s/"//')
|
|
246
|
+
BRANCH=$(echo "$START" | grep -oE '"branch"[^,}]*' | sed 's/.*: *"//;s/"//')
|
|
247
|
+
ISSUE=$(echo "$START" | grep -oE '"issue"[^,}]*' | sed 's/.*: *//')
|
|
248
|
+
echo "Fase {phase_number}: branch=$BRANCH worktree=$WORKTREE issue=${ISSUE:-null}"
|
|
249
|
+
else
|
|
250
|
+
# --solo: sem worktree/issue. Trabalho acontece na branch atual.
|
|
251
|
+
WORKTREE="$(pwd)"; BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"; ISSUE=""
|
|
252
|
+
fi
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Entrar na worktree (so se github_native):** o trabalho da fase (executor, commits) acontece
|
|
256
|
+
DENTRO de `$WORKTREE`. Preferir a tool nativa do harness **EnterWorktree** apontando para `$WORKTREE`; se
|
|
257
|
+
indisponivel, a worktree ja foi criada por `start-phase` (basta usar `--cwd "$WORKTREE"` nos comandos
|
|
258
|
+
`up-tools.cjs` e `cd "$WORKTREE"` antes de `git add/commit`). O `.plano/` da fase viaja na branch da fase;
|
|
259
|
+
`git-map.json` permanece canonico no working dir principal. Ao terminar a fase usar **ExitWorktree** (ou
|
|
260
|
+
voltar `cd` para o repo principal) antes de atualizar `git-map.json` na main.
|
|
261
|
+
|
|
262
|
+
> Em `--solo`, IGNORAR EnterWorktree/ExitWorktree: tudo na branch atual.
|
|
263
|
+
|
|
264
|
+
**Multica: marcar a fase em execucao (so se `--board`, 1 chamada na ENTRADA da fase).**
|
|
265
|
+
Uma transicao por fase (nao por microtransicao): status `in_progress` + metadata `gh_issue`/`branch`.
|
|
266
|
+
FAIL-OPEN: erro ou `multica` indisponivel -> avisa e segue.
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
if [ "$BOARD" = "true" ]; then
|
|
270
|
+
node "$HOME/.claude/up/bin/up-tools.cjs" multica sync \
|
|
271
|
+
--phase {phase_number} --status in_progress \
|
|
272
|
+
--gh-issue "${ISSUE:-}" --branch "${BRANCH:-}" --raw 2>/dev/null \
|
|
273
|
+
|| echo "AVISO: Multica indisponivel (sync in_progress fase {phase_number}). Seguindo."
|
|
274
|
+
fi
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 3.1 Descobrir planos + waves da fase (MULTI-PLANO)
|
|
278
|
+
|
|
279
|
+
Uma fase tem N planos agrupados em WAVES. O motor de waves vive em `up-tools.cjs`; aqui so o consumimos.
|
|
280
|
+
NAO existe mais "1 plano por fase" (era a regressao do `head -1`): descobrimos TODOS os planos e o
|
|
281
|
+
agrupamento por wave do disco.
|
|
282
|
+
|
|
283
|
+
Os planos vivem DENTRO de `$WORKTREE` (a `.plano/` da fase viaja na branch da fase). Por isso TODA chamada
|
|
284
|
+
de descoberta usa `--cwd "$WORKTREE"` (em `--solo`, `$WORKTREE` = repo principal, entao funciona igual).
|
|
202
285
|
|
|
203
286
|
```bash
|
|
204
|
-
|
|
205
|
-
|
|
287
|
+
# (a) Metadados da fase + flag de paralelizacao (config). Trata @file: (saida > 50KB).
|
|
288
|
+
INIT=$(node "$HOME/.claude/up/bin/up-tools.cjs" init executar-fase {phase_number} --cwd "$WORKTREE" --raw)
|
|
289
|
+
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
290
|
+
# init executar-fase retorna: phase_found, phase_dir, phase_number, phase_name, phase_slug,
|
|
291
|
+
# plans[] (nomes de arquivo), incomplete_plans[], plan_count, incomplete_count, paralelizacao, commit_docs.
|
|
292
|
+
PHASE_DIR="$WORKTREE/$(echo "$INIT" | grep -oE '"phase_dir"[^,}]*' | sed 's/.*: *"//;s/"//')"
|
|
293
|
+
PARALLELIZATION=$(echo "$INIT" | grep -oE '"paralelizacao"[^,}]*' | grep -oE '(true|false)')
|
|
294
|
+
PLAN_COUNT=$(echo "$INIT" | grep -oE '"plan_count"[^,}]*' | grep -oE '[0-9]+')
|
|
295
|
+
[ -z "$PARALLELIZATION" ] && PARALLELIZATION=true
|
|
296
|
+
[ "$PLAN_COUNT" = "0" ] && echo "GATE A FALHOU: sem planos na Fase {phase_number}." && exit 1
|
|
297
|
+
|
|
298
|
+
# (b) Inventario com agrupamento por WAVE (este e o motor de waves real).
|
|
299
|
+
PLAN_INDEX=$(node "$HOME/.claude/up/bin/up-tools.cjs" phase-plan-index {phase_number} --cwd "$WORKTREE" --raw)
|
|
300
|
+
if [[ "$PLAN_INDEX" == @file:* ]]; then PLAN_INDEX=$(cat "${PLAN_INDEX#@file:}"); fi
|
|
301
|
+
# phase-plan-index retorna: phase, plans[] (cada: id, wave [int], autonomous [bool], objective,
|
|
302
|
+
# files_modified[], task_count, has_summary [bool]), waves (map wave->[ids]), incomplete[], has_checkpoints.
|
|
206
303
|
```
|
|
207
304
|
|
|
208
|
-
|
|
305
|
+
Parsear de `$PLAN_INDEX`: a lista `plans[]` e o mapa `waves` (chave = numero da wave, valor = ids dos
|
|
306
|
+
planos daquela wave). Ordenar as waves por numero CRESCENTE. Para resolver o arquivo de um plano a partir
|
|
307
|
+
do id: `PLAN="$PHASE_DIR/${id}-PLAN.md"` (fallback `"$PHASE_DIR/PLAN.md"` se id vazio).
|
|
308
|
+
|
|
309
|
+
> Por que paralelizar dentro da wave e SEGURO: o agrupamento por wave ja garante que os planos da MESMA
|
|
310
|
+
> wave sao INDEPENDENTES entre si (arquivos disjuntos, sem dependencia mutua). Qualquer plano que dependa
|
|
311
|
+
> de outro cai numa wave POSTERIOR. Entao rodar todos os planos de uma wave em paralelo nunca causa
|
|
312
|
+
> conflito de escrita. Waves rodam SEMPRE em ordem (a wave N+1 so comeca quando a wave N inteira termina).
|
|
313
|
+
|
|
314
|
+
### 3.2 + 3.3 LOOP DE WAVES: detectar tipo (por plano) + spawnar executor(es)
|
|
209
315
|
|
|
210
|
-
|
|
211
|
-
- Frontend tasks → up-frontend-specialist
|
|
212
|
-
- Backend tasks → up-backend-specialist
|
|
213
|
-
- Database tasks → up-database-specialist
|
|
214
|
-
- Misto → up-executor
|
|
316
|
+
Iterar as waves em ordem crescente. Para CADA wave:
|
|
215
317
|
|
|
216
|
-
|
|
318
|
+
1. **Selecionar os planos da wave que ainda NAO tem SUMMARY** (resume): pular todo plano com
|
|
319
|
+
`has_summary: true` no `$PLAN_INDEX` (idempotencia/retomada). Se a wave inteira ja esta concluida,
|
|
320
|
+
anuncia e pula pra proxima wave.
|
|
217
321
|
|
|
218
|
-
**
|
|
219
|
-
ANTES do spawn, montar contexto via `up-tools.cjs context`. Isso injeta
|
|
220
|
-
PLAN, STATE, config, governance comprimida, engineering principles,
|
|
221
|
-
requirements-slice direto no prompt. O agente NAO refaz Read desses
|
|
222
|
-
arquivos. Economiza ~30k tokens por spawn.
|
|
322
|
+
2. **Para CADA plano selecionado da wave, montar contexto e detectar tipo (PRE-spawn, por plano):**
|
|
223
323
|
|
|
224
324
|
```bash
|
|
225
|
-
|
|
325
|
+
# Roda UMA VEZ por plano da wave (PLAN = $PHASE_DIR/<id>-PLAN.md).
|
|
326
|
+
EXECUTOR_AGENT="up-executor" # SEMPRE up-executor (Onda 2: sem specialists separados)
|
|
226
327
|
|
|
227
|
-
#
|
|
328
|
+
# 3.2 (por plano): tipo apenas informa o executor qual dominio carregar; o agente nao muda.
|
|
329
|
+
PLAN_TYPE=$(grep -oE '^type:[[:space:]]*[a-z-]+' "$PLAN" | head -1 | sed 's/type:[[:space:]]*//')
|
|
330
|
+
EXECUTOR_DOMAIN="$PLAN_TYPE" # frontend|backend|database|misto (vazio = misto)
|
|
331
|
+
|
|
332
|
+
# Pre-inline de contexto (economiza ~30k tokens/spawn), por plano:
|
|
228
333
|
CTX=$(node "$HOME/.claude/up/bin/up-tools.cjs" context \
|
|
229
334
|
--plan "${PLAN}" \
|
|
230
335
|
--state \
|
|
231
336
|
--config \
|
|
232
337
|
--requirements "${PHASE_NUMBER}" \
|
|
233
|
-
--manifest "${
|
|
234
|
-
--raw)
|
|
338
|
+
--manifest "${EXECUTOR_AGENT}" \
|
|
339
|
+
--cwd "$WORKTREE" --raw)
|
|
235
340
|
|
|
236
|
-
# Wave 5+ — complexity-aware model routing per plan
|
|
237
341
|
MODEL=$(node "$HOME/.claude/up/bin/up-tools.cjs" resolve-model-for-plan \
|
|
238
|
-
"${PLAN}" "${
|
|
239
|
-
CLASSIFY=$(node "$HOME/.claude/up/bin/up-tools.cjs" classify-task "${PLAN}" --raw)
|
|
240
|
-
COMPLEXITY=$(echo "$CLASSIFY" | grep -oE '"complexity"[^,]+' | grep -oE '"(simple|standard|complex)"' | tr -d '"')
|
|
241
|
-
SCORE=$(echo "$CLASSIFY" | grep -oE '"score"\s*:\s*[0-9]+' | grep -oE '[0-9]+')
|
|
242
|
-
|
|
243
|
-
# Wave 6+ — Iron rule: validar plan
|
|
244
|
-
VALIDATE=$(node "$HOME/.claude/up/bin/up-tools.cjs" validate-plan "${PLAN}" --raw)
|
|
245
|
-
VALIDATE_PASS=$(echo "$VALIDATE" | grep -oE '"pass"\s*:\s*(true|false)' | grep -oE '(true|false)')
|
|
246
|
-
if [ "$VALIDATE_PASS" = "false" ]; then
|
|
247
|
-
echo "IRON RULE FALHOU: Plan ${PLAN} excede limites. Voltando pro planejador."
|
|
248
|
-
echo "$VALIDATE" | grep -A 20 'suggestions'
|
|
249
|
-
exit 1
|
|
250
|
-
fi
|
|
251
|
-
|
|
252
|
-
node "$HOME/.claude/up/bin/up-tools.cjs" routing-log \
|
|
253
|
-
--plan "${PLAN}" --agent "${SPECIALIST_AGENT}" --model "${MODEL}" \
|
|
254
|
-
--complexity "${COMPLEXITY}" --score "${SCORE}" --outcome pending
|
|
342
|
+
"${PLAN}" "${EXECUTOR_AGENT}" --cwd "$WORKTREE" --raw)
|
|
255
343
|
```
|
|
256
344
|
|
|
345
|
+
3. **Spawnar o(s) executor(es) da wave:**
|
|
346
|
+
- **Se `PARALLELIZATION=true`:** spawnar TODOS os executores da wave EM PARALELO (multiplos `Agent()`
|
|
347
|
+
numa UNICA mensagem do orquestrador, um por plano selecionado da wave).
|
|
348
|
+
- **Se `PARALLELIZATION=false`:** spawnar os executores da wave um por vez (sequencial), esperando cada
|
|
349
|
+
um antes do proximo.
|
|
350
|
+
|
|
351
|
+
O prompt de cada `Agent` e o bloco abaixo, parametrizado POR PLANO (`{PLAN}`, `{EXECUTOR_DOMAIN}`,
|
|
352
|
+
`{CTX}` daquele plano). Um executor = um plano.
|
|
353
|
+
|
|
257
354
|
```python
|
|
258
355
|
Agent(
|
|
259
|
-
subagent_type="
|
|
356
|
+
subagent_type="up-executor",
|
|
260
357
|
prompt=f"""
|
|
261
|
-
Executar Plano
|
|
262
|
-
|
|
358
|
+
Executar o Plano {PLAN} (Fase {phase_number}, wave {wave}).
|
|
359
|
+
|
|
360
|
+
Tipo do plano (dominio a carregar por contexto): {EXECUTOR_DOMAIN}
|
|
361
|
+
Roteie POR CONTEXTO conforme o tipo: frontend -> carregar skill/ref de UI/CSS e DESIGN-TOKENS;
|
|
362
|
+
backend -> ref de API/server; database -> ref de schema/migrations; misto -> conforme cada tarefa.
|
|
363
|
+
NAO existem agentes specialist separados: voce e o unico executor e adapta ao dominio.
|
|
364
|
+
|
|
365
|
+
Escopo: SOMENTE este plano. Outros planos da mesma wave rodam em paralelo em arquivos disjuntos;
|
|
366
|
+
NAO toque em arquivos fora dos <files> das tarefas DESTE plano.
|
|
367
|
+
|
|
263
368
|
<prompt_context>
|
|
264
369
|
{CTX}
|
|
265
370
|
</prompt_context>
|
|
266
|
-
|
|
371
|
+
|
|
267
372
|
<production_requirements_compressed>
|
|
268
|
-
Categorias a respeitar (71 requisitos
|
|
269
|
-
- UIST
|
|
270
|
-
- ERR
|
|
373
|
+
Categorias a respeitar (71 requisitos):
|
|
374
|
+
- UIST: loading/error/empty/success em TODA operacao async
|
|
375
|
+
- ERR: boundaries, try/catch, sessao expirada, 404
|
|
271
376
|
- PERF: lazy loading, code split, debounce, pagination > 20 items, cache
|
|
272
377
|
- FORM: validacao inline, mensagens especificas, autofocus, mascaras
|
|
273
378
|
- RESP: 375px funcional, touch 44x44, hamburger mobile
|
|
@@ -275,175 +380,102 @@ Agent(
|
|
|
275
380
|
- SEC: rotas protegidas, CSRF, XSS, rate limit, env vars, RLS
|
|
276
381
|
- POLISH: hover, transicoes 150-300ms, design tokens
|
|
277
382
|
</production_requirements_compressed>
|
|
278
|
-
|
|
383
|
+
|
|
279
384
|
<files_to_read>
|
|
280
|
-
O contexto principal ja esta no <prompt_context
|
|
385
|
+
O contexto principal ja esta no <prompt_context>. Ler do disco APENAS:
|
|
281
386
|
- ./CLAUDE.md (se existir)
|
|
282
|
-
- .plano/fases/{phase_number}/PHASE.md (se existir
|
|
387
|
+
- .plano/fases/{phase_number}/PHASE.md (se existir)
|
|
283
388
|
- .plano/DESIGN-TOKENS.md (so se frontend e existir)
|
|
284
|
-
- Arquivos referenciados em <files> das tarefas (codigo a editar)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
- .plano/SYSTEM-DESIGN.md (so se decisao de arquitetura aparecer)
|
|
289
|
-
- .plano/REQUIREMENTS.md (so se a slice nao tiver info suficiente)
|
|
290
|
-
|
|
291
|
-
NAO refazer Read em PLAN, STATE.md, config.json, REQUIREMENTS-SLICE.md,
|
|
292
|
-
engineering-principles — ja estao inline em <prompt_context>.
|
|
389
|
+
- Arquivos referenciados em <files> das tarefas DESTE plano (codigo a editar)
|
|
390
|
+
|
|
391
|
+
Sob demanda apenas: .plano/PROJECT.md, .plano/SYSTEM-DESIGN.md, .plano/REQUIREMENTS.md
|
|
392
|
+
NAO refazer Read em PLAN/STATE/config/REQUIREMENTS-SLICE/engineering-principles (ja inline).
|
|
293
393
|
</files_to_read>
|
|
294
|
-
|
|
295
|
-
Implementar todas as tarefas.
|
|
296
|
-
|
|
394
|
+
|
|
395
|
+
Implementar todas as tarefas DESTE plano. Se o plano pedir, gerar tambem artefatos de
|
|
396
|
+
prod/docs/testes inline (papeis de devops/technical-writer/qa absorvidos pelo executor).
|
|
397
|
+
Commitar atomicamente. Gerar o SUMMARY.md DESTE plano.
|
|
297
398
|
"""
|
|
298
399
|
)
|
|
299
400
|
```
|
|
300
401
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
```bash
|
|
304
|
-
echo "=== GATE A: Verificando artefatos da execucao (Fase ${PHASE_NUMBER}) ==="
|
|
305
|
-
SUMMARY_COUNT=$(ls ${PHASE_DIR}/*-SUMMARY.md 2>/dev/null | wc -l)
|
|
306
|
-
[ "$SUMMARY_COUNT" -eq 0 ] && echo "GATE A FALHOU: Nenhum SUMMARY.md. Re-executar specialist." && exit 1
|
|
307
|
-
echo "GATE A OK: ${SUMMARY_COUNT} SUMMARY(s)"
|
|
308
|
-
```
|
|
402
|
+
4. **Esperar TODOS os executores da wave terminarem** antes de iniciar a proxima wave (`Agent`/`Task`
|
|
403
|
+
bloqueia ate retornar; a barreira da wave e o ponto onde se espera todos).
|
|
309
404
|
|
|
310
|
-
|
|
405
|
+
5. **--- GATE A (por wave): todos os planos da wave com SUMMARY ---**
|
|
311
406
|
|
|
312
407
|
```bash
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
node "$HOME/.claude/up/bin/up-tools.cjs" routing-log --update \
|
|
322
|
-
--plan "${PLAN}" --agent "${SPECIALIST_AGENT}" --model "${MODEL}" \
|
|
323
|
-
--complexity "${COMPLEXITY}" --score "${SCORE}" \
|
|
324
|
-
--outcome "${OUTCOME}" --rework-cycles "${REWORK_COUNT:-0}"
|
|
408
|
+
echo "=== GATE A: artefatos da wave ${wave} (Fase ${PHASE_NUMBER}) ==="
|
|
409
|
+
# Espera-se 1 SUMMARY por plano nao-pulado da wave. Conferir cada id da wave:
|
|
410
|
+
WAVE_MISSING=0
|
|
411
|
+
for PLAN_ID in $WAVE_PLAN_IDS; do # WAVE_PLAN_IDS = ids dos planos selecionados desta wave
|
|
412
|
+
[ -f "${PHASE_DIR}/${PLAN_ID}-SUMMARY.md" ] || { echo "GATE A: SUMMARY faltando para plano ${PLAN_ID}"; WAVE_MISSING=$((WAVE_MISSING+1)); }
|
|
413
|
+
done
|
|
414
|
+
[ "$WAVE_MISSING" -gt 0 ] && echo "GATE A FALHOU na wave ${wave}: ${WAVE_MISSING} SUMMARY(s) ausente(s). Re-executar o(s) plano(s) faltante(s)." && exit 1
|
|
415
|
+
echo "GATE A OK (wave ${wave})"
|
|
325
416
|
```
|
|
326
417
|
|
|
327
|
-
|
|
418
|
+
- Se algum SUMMARY da wave faltar: re-spawnar SO o(s) executor(es) do(s) plano(s) faltante(s) (mesmo
|
|
419
|
+
bloco `Agent`), depois reavaliar o GATE A da wave. Falha real e sistemica (toda a wave falhou) ->
|
|
420
|
+
parar e alertar o dono (AskUserQuestion).
|
|
328
421
|
|
|
329
|
-
|
|
330
|
-
Agent(
|
|
331
|
-
subagent_type="up-execution-supervisor",
|
|
332
|
-
prompt=f"""
|
|
333
|
-
Revisar execucao da Fase {phase_number}.
|
|
334
|
-
|
|
335
|
-
<governance_compressed>
|
|
336
|
-
DECISOES: APPROVE | REQUEST_CHANGES | REQUEST_REPLAN | ESCALATE
|
|
337
|
-
REWORK: max 3 ciclos antes de forcar approval com debito
|
|
338
|
-
NUNCA APROVAR: trabalho nao verificado, evidencia ambigua, claim sem backing,
|
|
339
|
-
stub/placeholder, falta de wiring
|
|
340
|
-
</governance_compressed>
|
|
341
|
-
|
|
342
|
-
<engineering_principles_compressed>
|
|
343
|
-
1. Implementacao real (zero placeholder)
|
|
344
|
-
2. Correto, nao rapido
|
|
345
|
-
3. Conectado ponta a ponta
|
|
346
|
-
4. Consistencia (seguir patterns existentes)
|
|
347
|
-
5. Dados reais
|
|
348
|
-
6. Custo futuro
|
|
349
|
-
</engineering_principles_compressed>
|
|
350
|
-
|
|
351
|
-
<files_to_read>
|
|
352
|
-
- {PLAN}
|
|
353
|
-
- {PHASE_DIR}/*-SUMMARY.md
|
|
354
|
-
- git diff (use Bash)
|
|
355
|
-
- .plano/fases/{phase_number}/REQUIREMENTS-SLICE.md (se existir)
|
|
356
|
-
|
|
357
|
-
Sob demanda apenas:
|
|
358
|
-
- $HOME/.claude/up/references/engineering-principles-compressed.md (exemplos)
|
|
359
|
-
- $HOME/.claude/up/references/governance-rules-compressed.md (hierarquia)
|
|
360
|
-
- $HOME/.claude/up/references/rework-limits-compressed.md (fluxos)
|
|
361
|
-
- $HOME/.claude/up/references/production-requirements-compressed.md (IDs especificos)
|
|
362
|
-
</files_to_read>
|
|
363
|
-
|
|
364
|
-
Decisao: APPROVE | REQUEST_CHANGES | REQUEST_REPLAN | ESCALATE
|
|
365
|
-
|
|
366
|
-
REQUEST_REPLAN: Se descobrir que o plano e fundamentalmente errado/inviavel.
|
|
367
|
-
Max 2 re-plans por projeto.
|
|
368
|
-
|
|
369
|
-
**OUTPUT OBRIGATORIO (fazer ANTES de retornar):**
|
|
370
|
-
```bash
|
|
371
|
-
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | phase-{phase_number} | execution-supervisor | {{DECISAO}} | {{motivo}}" >> .plano/governance/approvals.log
|
|
372
|
-
```
|
|
373
|
-
Sem este log, o GATE B vai bloquear o avanço.
|
|
374
|
-
"""
|
|
375
|
-
)
|
|
376
|
-
```
|
|
422
|
+
6. **Prosseguir para a proxima wave.** Repetir 1-5 ate a ultima wave.
|
|
377
423
|
|
|
378
|
-
|
|
424
|
+
**Fim do loop de waves:** ao sair do loop, TODOS os planos da fase tem SUMMARY. GATE A consolidado:
|
|
379
425
|
|
|
380
426
|
```bash
|
|
381
|
-
echo "=== GATE
|
|
382
|
-
|
|
383
|
-
[ -
|
|
384
|
-
echo "GATE
|
|
427
|
+
echo "=== GATE A consolidado (Fase ${PHASE_NUMBER}) ==="
|
|
428
|
+
SUMMARY_COUNT=$(ls ${PHASE_DIR}/*-SUMMARY.md 2>/dev/null | wc -l)
|
|
429
|
+
[ "$SUMMARY_COUNT" -lt "$PLAN_COUNT" ] && echo "GATE A FALHOU: ${SUMMARY_COUNT}/${PLAN_COUNT} SUMMARY(s). Re-executar plano(s) faltante(s)." && exit 1
|
|
430
|
+
echo "GATE A OK: ${SUMMARY_COUNT}/${PLAN_COUNT} SUMMARY(s) (todas as waves)"
|
|
385
431
|
```
|
|
386
432
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
**Se APPROVE:** prosseguir para verificacao.
|
|
433
|
+
> A partir daqui (3.4-3.9) o escopo e a FASE INTEIRA (todos os planos / todos os SUMMARYs), nao mais
|
|
434
|
+
> "o plano". Roda UMA VEZ por fase, depois de TODAS as waves.
|
|
390
435
|
|
|
391
|
-
|
|
436
|
+
### 3.4 Re-plan local (so se um plano especifico se revelar inviavel)
|
|
392
437
|
|
|
393
|
-
|
|
438
|
+
Por-plano: se durante a execucao de UM plano especifico ficar evidente que ele e fundamentalmente
|
|
439
|
+
errado/inviavel, o orquestrador re-planeja SO aquele plano, LOCALMENTE (max 2 por projeto). Sem
|
|
440
|
+
supervisor: o `up-planejador` faz self-check. `{PLAN}` aqui = o plano inviavel especifico (nao a fase).
|
|
394
441
|
|
|
395
442
|
```bash
|
|
396
443
|
REPLAN_COUNT=$(cat .plano/governance/replans.log 2>/dev/null | wc -l)
|
|
397
444
|
if [ "$REPLAN_COUNT" -ge 2 ]; then
|
|
398
|
-
echo "Max re-plans atingido.
|
|
399
|
-
# ESCALATE
|
|
445
|
+
echo "Max re-plans atingido. Alertar o dono (AskUserQuestion)."
|
|
400
446
|
else
|
|
401
|
-
|
|
402
|
-
echo "REQUEST_REPLAN aprovado. Re-planejando fase {phase_number} localmente..."
|
|
403
|
-
|
|
404
|
-
# Spawnar planejador LOCAL (Agent SEPARADO)
|
|
405
|
-
Agent(
|
|
406
|
-
subagent_type="up-planejador",
|
|
407
|
-
prompt=f"""
|
|
408
|
-
RE-PLAN da Fase {phase_number}.
|
|
409
|
-
|
|
410
|
-
Plano original: {PLAN}
|
|
411
|
-
Razao do re-plan: {execution_supervisor_reason}
|
|
412
|
-
|
|
413
|
-
Refaca o plano corrigindo o problema descoberto.
|
|
414
|
-
"""
|
|
415
|
-
)
|
|
416
|
-
|
|
417
|
-
# Salvar como -PLAN-v2.md
|
|
418
|
-
mv "$PLAN" "${PLAN%-PLAN.md}-PLAN-v1.md"
|
|
419
|
-
|
|
420
|
-
# Registrar
|
|
421
|
-
echo "$(date -u) | phase-{phase_number} | execution-supervisor | REPLAN | reason: {reason}" >> .plano/governance/replans.log
|
|
422
|
-
|
|
423
|
-
# Planning-supervisor revisa novo plano (Agent SEPARADO)
|
|
424
|
-
Agent(subagent_type="up-planning-supervisor", prompt="""
|
|
425
|
-
Revisar re-plan da fase {phase_number}.
|
|
426
|
-
**OUTPUT OBRIGATORIO:** logar em .plano/governance/approvals.log
|
|
427
|
-
""")
|
|
428
|
-
|
|
429
|
-
# Voltar pro 3.3 (re-spawn specialist)
|
|
447
|
+
echo "REQUEST_REPLAN. Re-planejando fase {phase_number} localmente..."
|
|
430
448
|
fi
|
|
431
449
|
```
|
|
432
450
|
|
|
433
|
-
|
|
451
|
+
```python
|
|
452
|
+
# Re-plan LOCAL — Agent SEPARADO (so up-planejador, sem camada de revisao intermediaria)
|
|
453
|
+
Agent(subagent_type="up-planejador", prompt=f"""
|
|
454
|
+
RE-PLAN da Fase {phase_number}.
|
|
455
|
+
Plano original: {PLAN}
|
|
456
|
+
Razao: {motivo descoberto na execucao}
|
|
457
|
+
Refaca o plano corrigindo o problema. Self-check: confirme viabilidade e completude antes de retornar.
|
|
458
|
+
""")
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
mv "$PLAN" "${PLAN%-PLAN.md}-PLAN-v1.md"
|
|
463
|
+
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | phase-{phase_number} | up-planejador | REPLAN | {motivo}" >> .plano/governance/replans.log
|
|
464
|
+
# Voltar pro LOOP DE WAVES (3.2+3.3): re-spawnar o executor SO desse plano, na wave dele, com o plano novo.
|
|
465
|
+
```
|
|
434
466
|
|
|
435
|
-
### 3.
|
|
467
|
+
### 3.5 Verificacao da FASE (PASSO 2 - Agent SEPARADO)
|
|
436
468
|
|
|
437
|
-
|
|
469
|
+
Roda UMA VEZ por fase, depois de TODAS as waves. O verificador valida a FASE INTEIRA (todos os planos /
|
|
470
|
+
todos os SUMMARYs juntos), nao 1 plano isolado. Um unico VERIFICATION.md cobre a fase.
|
|
438
471
|
|
|
439
|
-
|
|
472
|
+
**Verification ladder deterministica primeiro:**
|
|
440
473
|
|
|
441
474
|
```bash
|
|
442
475
|
STATIC=$(node "$HOME/.claude/up/bin/up-tools.cjs" verify-static --raw)
|
|
443
476
|
STATIC_OVERALL=$(echo "$STATIC" | grep -oE 'overall.{1,20}' | head -1 | grep -oE '"(pass|fail|skip)"' | tr -d '"')
|
|
444
477
|
|
|
445
478
|
if [ "$STATIC_OVERALL" = "pass" ]; then
|
|
446
|
-
# Pular verificador-LLM, criar VERIFICATION.md sintetico
|
|
447
479
|
cat > "${PHASE_DIR}/VERIFICATION.md" <<EOF
|
|
448
480
|
---
|
|
449
481
|
status: passed
|
|
@@ -457,194 +489,376 @@ EOF
|
|
|
457
489
|
fi
|
|
458
490
|
```
|
|
459
491
|
|
|
460
|
-
Se STATIC=fail ou skip: spawnar verificador
|
|
492
|
+
Se STATIC=fail ou skip: spawnar `up-verificador` com os logs estaticos como contexto:
|
|
461
493
|
|
|
462
494
|
```python
|
|
463
495
|
Agent(subagent_type="up-verificador", prompt=f"""
|
|
464
|
-
Verificar
|
|
465
|
-
|
|
496
|
+
Verificar a FASE {phase_number} INTEIRA (todos os planos / todos os SUMMARYs juntos, nao 1 plano).
|
|
497
|
+
Conferir o objetivo da fase contra o codebase real e cruzar os REQUIREMENTS desta fase com o que
|
|
498
|
+
TODOS os SUMMARYs ({PHASE_DIR}/*-SUMMARY.md) entregaram.
|
|
466
499
|
<static_check_results overall="{STATIC_OVERALL}">
|
|
467
500
|
Logs em .plano/runtime/verify-static-*.log
|
|
468
501
|
</static_check_results>
|
|
469
|
-
|
|
470
|
-
FOCAR no que falhou nos checks. Nao reexecutar tudo.
|
|
502
|
+
FOCAR no que falhou. Exigir evidencia fresca por tipo de codigo. Gerar UM VERIFICATION.md da fase.
|
|
471
503
|
""")
|
|
472
504
|
```
|
|
473
505
|
|
|
474
|
-
### --- GATE
|
|
506
|
+
### --- GATE B: artefatos da verificacao ---
|
|
475
507
|
|
|
476
508
|
```bash
|
|
477
|
-
echo "=== GATE
|
|
509
|
+
echo "=== GATE B: artefatos da verificacao (Fase ${PHASE_NUMBER}) ==="
|
|
478
510
|
VERIF_COUNT=$(ls ${PHASE_DIR}/*-VERIFICATION.md 2>/dev/null | wc -l)
|
|
479
|
-
[ "$VERIF_COUNT" -eq 0 ] && echo "GATE
|
|
480
|
-
echo "GATE
|
|
511
|
+
[ "$VERIF_COUNT" -eq 0 ] && echo "GATE B FALHOU: sem VERIFICATION.md. Spawnar verificador." && exit 1
|
|
512
|
+
echo "GATE B OK: ${VERIF_COUNT} VERIFICATION(s)"
|
|
481
513
|
```
|
|
482
514
|
|
|
483
|
-
### 3.6
|
|
515
|
+
### 3.6 E2E + DCRV (PASSO 3)
|
|
484
516
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
**OUTPUT OBRIGATORIO (fazer ANTES de retornar):**
|
|
491
|
-
```bash
|
|
492
|
-
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | phase-{phase_number} | verification-supervisor | {{DECISAO}} | {{motivo}}" >> .plano/governance/approvals.log
|
|
493
|
-
```
|
|
494
|
-
""")
|
|
517
|
+
Delegar ao loop DCRV (que absorveu builder-e2e). Ver `@~/.claude/up/workflows/dcrv.md`.
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
SCOPE=phase, PHASE_DIR={PHASE_DIR}, PHASE_NUMBER={phase_number}, AUTO_FIX=true, MAX_CYCLES=3
|
|
495
521
|
```
|
|
496
522
|
|
|
497
|
-
|
|
523
|
+
Pular se a fase nao tem UI nem API (infra/schema).
|
|
524
|
+
|
|
525
|
+
### 3.7 Revisao da FASE (PASSO 4 - Agent SEPARADO)
|
|
526
|
+
|
|
527
|
+
Roda UMA VEZ por fase, depois de TODAS as waves. O revisor revisa a FASE consolidada (todos os planos /
|
|
528
|
+
todos os SUMMARYs juntos).
|
|
529
|
+
|
|
530
|
+
**Derivar o tipo de evidencia esperado (Fase 3 - TDD por tipo).** A fase pode ter VARIOS planos de tipos
|
|
531
|
+
diferentes; agregamos o `type` do frontmatter de TODOS os planos da fase e exigimos a evidencia mais forte
|
|
532
|
+
aplicavel (UI > glue > logic): se QUALQUER plano da fase e UI -> exige `ui:visual`; senao se qualquer plano
|
|
533
|
+
e integracao -> `glue:smoke`; senao `logic:test_pass`. O GATE so aprova com `evidence=<tipo>:<resultado>`
|
|
534
|
+
do tipo certo:
|
|
498
535
|
|
|
499
536
|
```bash
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
echo "
|
|
537
|
+
# Agrega os tipos de TODOS os planos da fase (nao mais 1 plano via head -1).
|
|
538
|
+
PHASE_TYPES=$(grep -hoE '^type:[[:space:]]*[a-z-]+' ${PHASE_DIR}/*-PLAN.md 2>/dev/null | sed 's/type:[[:space:]]*//')
|
|
539
|
+
if echo "$PHASE_TYPES" | grep -qE '^(frontend|ui|css)$'; then
|
|
540
|
+
EVIDENCE_TYPE="ui"; EVIDENCE_RESULT="visual" # UI/CSS -> captura visual antes/depois (Playwright)
|
|
541
|
+
elif echo "$PHASE_TYPES" | grep -qE '^(integration|glue|webhook)$'; then
|
|
542
|
+
EVIDENCE_TYPE="glue"; EVIDENCE_RESULT="smoke" # integracao (Asaas/uazapi/etc) -> smoke-test
|
|
543
|
+
else
|
|
544
|
+
EVIDENCE_TYPE="logic"; EVIDENCE_RESULT="test_pass" # parser/calculo/API-propria/bugfix -> teste red-green
|
|
545
|
+
fi
|
|
546
|
+
echo "Fase {phase_number}: evidence esperada (agregada da fase) = ${EVIDENCE_TYPE}:${EVIDENCE_RESULT}"
|
|
505
547
|
```
|
|
506
548
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
549
|
+
A evidencia ja foi PRODUZIDA upstream: `logic:test_pass` pelo verificador (red-green); `ui:visual` pela
|
|
550
|
+
captura visual antes/depois do `up-tester` no DCRV (3.6); `glue:smoke` pelo smoke do DCRV (3.6). O revisor
|
|
551
|
+
apenas CONFIRMA que ela existe e a carimba no approvals.log. Ver `@~/.claude/up/workflows/dcrv.md`.
|
|
510
552
|
|
|
511
|
-
|
|
553
|
+
Spawnar `up-revisor` (UNICO, two-stage). Substitui supervisores, chiefs e auditores gold.
|
|
512
554
|
|
|
513
555
|
```python
|
|
514
556
|
Agent(
|
|
515
|
-
subagent_type="up-
|
|
557
|
+
subagent_type="up-revisor",
|
|
516
558
|
prompt=f"""
|
|
517
|
-
Revisar Fase {phase_number} consolidada.
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
559
|
+
Revisar a Fase {phase_number} consolidada (two-stage).
|
|
560
|
+
|
|
561
|
+
STAGE 1 — spec-compliance cetico: assuma que "terminou rapido demais". Valide o comportamento
|
|
562
|
+
contra os REQUIREMENTS desta fase navegando/inspecionando o resultado real (nao confie no codigo
|
|
563
|
+
nem no SUMMARY). Emita um Confidence Score (0-100) de delivery.
|
|
564
|
+
STAGE 2 — code-quality: padroes, edge cases, OWASP/security, wiring ponta a ponta.
|
|
565
|
+
|
|
566
|
+
<files_to_read>
|
|
567
|
+
- {PHASE_DIR}/*-PLAN.md (TODOS os planos da fase)
|
|
568
|
+
- {PHASE_DIR}/*-SUMMARY.md (TODOS os SUMMARYs da fase)
|
|
569
|
+
- {PHASE_DIR}/*-VERIFICATION.md
|
|
570
|
+
- {PHASE_DIR}/dcrv/DCRV-REPORT.md (se existir)
|
|
571
|
+
- git diff (use Bash)
|
|
572
|
+
- .plano/fases/{phase_number}/REQUIREMENTS-SLICE.md (se existir)
|
|
573
|
+
Sob demanda: $HOME/.claude/up/references/engineering-principles-compressed.md,
|
|
574
|
+
$HOME/.claude/up/references/production-requirements-compressed.md
|
|
575
|
+
</files_to_read>
|
|
576
|
+
|
|
577
|
+
Veredito unico: APPROVE | REQUEST_CHANGES | BLOCK.
|
|
578
|
+
|
|
579
|
+
**EVIDENCIA OBRIGATORIA (Fase 3 - TDD por tipo):** so APPROVE se houver evidencia fresca do tipo
|
|
580
|
+
`{EVIDENCE_TYPE}` desta fase:
|
|
581
|
+
- logic (parser/calculo/API-propria/bugfix): teste red-green passando -> evidence=logic:test_pass
|
|
582
|
+
- ui (UI/CSS): captura visual antes/depois (Playwright, do up-tester) -> evidence=ui:visual
|
|
583
|
+
- glue (integracao Asaas/uazapi/etc): smoke-test passando -> evidence=glue:smoke
|
|
584
|
+
Se a evidencia do tipo certo NAO existe, o veredito NAO pode ser APPROVE (use REQUEST_CHANGES para
|
|
585
|
+
forcar a producao da evidencia).
|
|
586
|
+
|
|
587
|
+
**OUTPUT OBRIGATORIO (ANTES de retornar) - formato estendido com campo evidence:**
|
|
522
588
|
```bash
|
|
523
|
-
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | phase-{phase_number} |
|
|
589
|
+
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | phase-{phase_number} | up-revisor | {{DECISAO}} | {{motivo}} | evidence={EVIDENCE_TYPE}:{EVIDENCE_RESULT}" >> .plano/governance/approvals.log
|
|
524
590
|
```
|
|
591
|
+
Sem este log COM o campo evidence preenchido do tipo certo, o GATE de fase bloqueia o avanco.
|
|
525
592
|
"""
|
|
526
593
|
)
|
|
527
594
|
```
|
|
528
595
|
|
|
529
|
-
### --- GATE
|
|
596
|
+
### --- GATE de fase: veredito do revisor (deterministico) ---
|
|
597
|
+
|
|
598
|
+
Aplicar o gate de `@~/.claude/up/workflows/governance.md`:
|
|
530
599
|
|
|
531
600
|
```bash
|
|
532
|
-
echo "=== GATE
|
|
601
|
+
echo "=== GATE: Fase ${PHASE_NUMBER} ==="
|
|
533
602
|
SUMMARY_OK=$(ls ${PHASE_DIR}/*-SUMMARY.md 2>/dev/null | wc -l)
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
VERIF_OK=$(grep -c "phase-${PHASE_NUMBER}.*verification-supervisor" .plano/governance/approvals.log 2>/dev/null)
|
|
537
|
-
CHIEF_OK=$(grep -c "phase-${PHASE_NUMBER}.*chief-engineer" .plano/governance/approvals.log 2>/dev/null)
|
|
603
|
+
VERIF_OK=$(ls ${PHASE_DIR}/*-VERIFICATION.md 2>/dev/null | wc -l)
|
|
604
|
+
REVISOR_ENTRY=$(grep "phase-${PHASE_NUMBER}.*up-revisor" .plano/governance/approvals.log 2>/dev/null | tail -1)
|
|
538
605
|
|
|
539
606
|
PASS=true
|
|
540
|
-
[ "$SUMMARY_OK" -eq 0 ] && echo "FALHA:
|
|
541
|
-
[ "$
|
|
542
|
-
[ "$
|
|
543
|
-
|
|
544
|
-
|
|
607
|
+
[ "$SUMMARY_OK" -eq 0 ] && echo "FALHA: sem SUMMARY.md" && PASS=false
|
|
608
|
+
[ "$VERIF_OK" -eq 0 ] && echo "FALHA: sem VERIFICATION.md" && PASS=false
|
|
609
|
+
[ -z "$REVISOR_ENTRY" ] && echo "FALHA: up-revisor NAO logou" && PASS=false
|
|
610
|
+
|
|
611
|
+
# Fase 3 - TDD: a entry do revisor PRECISA ter o campo evidence=<tipo>:<resultado> do tipo certo.
|
|
612
|
+
EVIDENCE_FIELD=$(echo "$REVISOR_ENTRY" | grep -oE 'evidence=(logic|ui|glue):(test_pass|visual|smoke)')
|
|
613
|
+
if [ -z "$EVIDENCE_FIELD" ]; then
|
|
614
|
+
echo "FALHA: up-revisor logou sem campo evidence=<tipo>:<resultado>. Re-rodar revisor com prova fresca." && PASS=false
|
|
615
|
+
elif [ -n "$EVIDENCE_TYPE" ] && ! echo "$EVIDENCE_FIELD" | grep -q "evidence=${EVIDENCE_TYPE}:"; then
|
|
616
|
+
echo "FALHA: evidence de tipo errado ($EVIDENCE_FIELD; esperado ${EVIDENCE_TYPE}). Re-rodar com prova certa." && PASS=false
|
|
617
|
+
fi
|
|
618
|
+
|
|
619
|
+
DECISION=$(echo "$REVISOR_ENTRY" | awk -F'|' '{gsub(/ /,"",$4); print $4}')
|
|
545
620
|
|
|
546
621
|
if [ "$PASS" = false ]; then
|
|
547
|
-
echo "GATE
|
|
622
|
+
echo "GATE FALHOU: spawnar o agente faltante e re-rodar."
|
|
548
623
|
exit 1
|
|
549
|
-
else
|
|
550
|
-
echo "GATE E OK: Todos 5 checks passaram."
|
|
551
624
|
fi
|
|
552
625
|
```
|
|
553
626
|
|
|
554
|
-
|
|
627
|
+
**Processar o veredito:**
|
|
628
|
+
- `APPROVE`: prosseguir para 3.8.
|
|
629
|
+
- `REQUEST_CHANGES`: cap de rework 1 round (ver governance.md passo 4). Round 0 -> re-spawn do(s)
|
|
630
|
+
executor(es) do(s) plano(s) apontado(s) no review (mesmo bloco Agent de 3.2+3.3, parametrizado por
|
|
631
|
+
plano); round >= 1 -> forced approval com debito tecnico. Depois re-rodar verificador da fase + revisor.
|
|
632
|
+
- `BLOCK`: interromper e alertar o dono (AskUserQuestion).
|
|
633
|
+
|
|
634
|
+
### 3.8 Fechar a fase: teste visual (pre-merge) + merge
|
|
635
|
+
|
|
636
|
+
So apos o GATE aprovar (APPROVE ou forced approval registrado).
|
|
637
|
+
|
|
638
|
+
**Caso `--solo` (github_native=false):** nada a fazer aqui. Tudo ja foi committado atomicamente na branch
|
|
639
|
+
atual. Seguir direto para 3.9. (Sem worktree, sem teste-visual-gate, sem merge.)
|
|
640
|
+
|
|
641
|
+
#### 3.8.0 Checkpoint de teste visual (PRE-MERGE) - so GitHub-nativo
|
|
642
|
+
|
|
643
|
+
Roda ANTES de qualquer merge. Garante que NADA sobe sem o dono ver na tela. Resolver:
|
|
644
|
+
|
|
645
|
+
```bash
|
|
646
|
+
REQUIRE_VISUAL=$(node "$HOME/.claude/up/bin/up-tools.cjs" config get require_visual_test --raw 2>/dev/null)
|
|
647
|
+
[ -z "$REQUIRE_VISUAL" ] && REQUIRE_VISUAL=true
|
|
648
|
+
# HAS_UI: a fase tocou em UI? (tipo do plano frontend/ui/css OU package.json com script dev/start/serve)
|
|
649
|
+
HAS_DEV=$(node -e "try{const s=require('./package.json').scripts||{};process.stdout.write((s.dev||s.start||s.serve)?'1':'')}catch(e){}" 2>/dev/null)
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
**Aplica o gate quando:** (HAS_UI ou HAS_DEV) E NAO (`--auto` E REQUIRE_VISUAL=false).
|
|
653
|
+
Ou seja: por padrao SEMPRE pede aprovacao visual antes do merge em fase de UI. Para PULAR (CI/yolo):
|
|
654
|
+
`--auto` + setar `require_visual_test=false` no config. Para projeto em PRODUCAO: deixe o default (true).
|
|
655
|
+
|
|
656
|
+
Se aplica:
|
|
657
|
+
|
|
658
|
+
1. **Subir o dev server DENTRO da worktree** (o codigo da fase vive na worktree - voce testa o codigo REAL
|
|
659
|
+
da fase, nao a main). Ainda DENTRO da worktree, antes de sair dela:
|
|
660
|
+
|
|
661
|
+
```bash
|
|
662
|
+
PORT=${PORT:-3000}
|
|
663
|
+
if ! curl -s "http://localhost:${PORT}" >/dev/null 2>&1; then
|
|
664
|
+
( npm run dev > /tmp/up-build-dev-${phase_number}.log 2>&1 & ) \
|
|
665
|
+
|| ( npm start > /tmp/up-build-dev-${phase_number}.log 2>&1 & )
|
|
666
|
+
for i in $(seq 1 40); do curl -s "http://localhost:${PORT}" >/dev/null 2>&1 && break; sleep 1; done
|
|
667
|
+
fi
|
|
668
|
+
echo "Dev server da Fase {phase_number} no ar: http://localhost:${PORT}"
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
2. **Perguntar (AskUserQuestion):**
|
|
672
|
+
|
|
673
|
+
```
|
|
674
|
+
header: "Fase {phase_number}: testar antes de mergear?"
|
|
675
|
+
question: "Subi o dev server em http://localhost:{PORT} com o codigo desta fase. Testar primeiro ou pode mergear?"
|
|
676
|
+
options:
|
|
677
|
+
- "Testar primeiro (deixo o server no ar)"
|
|
678
|
+
- "Pode mergear"
|
|
679
|
+
- "Deixa a branch (nao mergeia agora)"
|
|
680
|
+
- "Descarta a fase"
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
3. **Se "Testar primeiro":** MANTEM o dev server no ar, repete a URL, e ESPERA o dono testar. Quando ele
|
|
684
|
+
voltar, perguntar de novo:
|
|
685
|
+
|
|
686
|
+
```
|
|
687
|
+
header: "Testou a Fase {phase_number}?"
|
|
688
|
+
question: "E ai, pode fechar?"
|
|
689
|
+
options:
|
|
690
|
+
- "Aprovado, pode mergear"
|
|
691
|
+
- "Achei problema, quero ajustar"
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
- **"Achei problema, quero ajustar":** pedir a descricao do problema, re-spawnar `up-executor` pra corrigir
|
|
695
|
+
NA WORKTREE (mesma branch da fase), re-rodar `up-verificador` + GATE (3.6/3.7), e VOLTAR pro 3.8.0
|
|
696
|
+
(re-testa com o dev server). Loop ate o dono aprovar. (E o "quando eu disser nao, ajusta; quando eu
|
|
697
|
+
disser sim, merge".)
|
|
698
|
+
- **"Aprovado, pode mergear":** segue como "Pode mergear".
|
|
699
|
+
|
|
700
|
+
4. **Matar o dev server** antes de sair da worktree e mergear:
|
|
701
|
+
|
|
702
|
+
```bash
|
|
703
|
+
pkill -f "npm run dev" 2>/dev/null || true; pkill -f "npm start" 2>/dev/null || true
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
A escolha do checkpoint define a acao de fechamento (3.8.1): "Pode mergear"/"Aprovado" -> MERGE;
|
|
707
|
+
"Deixa a branch" -> nao mergeia; "Descarta" -> remove sem merge.
|
|
708
|
+
|
|
709
|
+
**Fase SEM UI** (infra/schema/backend puro) ou `--auto` com `require_visual_test=false`: pula 3.8.0.
|
|
710
|
+
Nesse caso, GitHub-nativo interativo ainda apresenta o mesmo AskUserQuestion de 4 opcoes (sem o passo do
|
|
711
|
+
dev server) pra o dono decidir merge/PR/deixa/descarta. `--auto` com fase sem UI fecha direto (sem perguntar).
|
|
712
|
+
|
|
713
|
+
#### 3.8.1 Merge e avancar
|
|
714
|
+
|
|
715
|
+
Sair da worktree (**ExitWorktree** ou `cd` de volta ao repo principal) para que `finish-phase` opere e
|
|
716
|
+
atualize `git-map.json` na main. Mapear a escolha de 3.8.0 para `finish-phase`
|
|
717
|
+
(`--mode menu|auto|solo`):
|
|
718
|
+
|
|
719
|
+
```bash
|
|
720
|
+
case "$ESCOLHA" in
|
|
721
|
+
# Pode mergear / Aprovado: finish-phase --mode auto faz gh pr create (Closes #N) -> merge squash -> cleanup.
|
|
722
|
+
# FAIL-OPEN: sem gh/remote, --mode auto degrada para merge LOCAL da branch na base + cleanup (issue/PR=null).
|
|
723
|
+
mergear|aprovado) node "$HOME/.claude/up/bin/up-tools.cjs" github finish-phase --phase {phase_number} --mode auto --strategy squash ;;
|
|
724
|
+
# Deixa a branch: nao mergeia; worktree+branch vivos. menu so atualiza git-map.json (status=in_review).
|
|
725
|
+
deixa) node "$HOME/.claude/up/bin/up-tools.cjs" github finish-phase --phase {phase_number} --mode menu ;;
|
|
726
|
+
# Descarta: orquestrador remove worktree + branch (sem merge); reflete em git-map.json via status=cancelled.
|
|
727
|
+
descarta) echo "Descartando fase {phase_number}: remover worktree + branch (sem merge)." ;;
|
|
728
|
+
esac
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
`finish-phase --mode auto` faz: gh pr create (body com `Closes #<issue>` quando ha issue) -> merge (squash
|
|
732
|
+
default, ou `--strategy merge|rebase`) -> cleanup worktree+branch, e atualiza `git-map.json`. FAIL-OPEN: sem
|
|
733
|
+
gh/remote, faz merge LOCAL da branch da fase na base e remove a worktree (issue/PR = null). `--mode solo` nao
|
|
734
|
+
faz nada (usado quando ja esta tudo committado na branch atual); em `--solo` o fluxo nem chega aqui.
|
|
735
|
+
|
|
736
|
+
**Multica: sync BATCHED no FIM da fase/onda (so se `--board`).**
|
|
737
|
+
Uma unica chamada que reflete TODAS as transicoes acumuladas da fase de uma vez (nao por microtransicao):
|
|
738
|
+
status final + metadata `gh_issue`/`branch`/`pr`. Mapeamento de status UP -> Multica:
|
|
739
|
+
`done->done`, `in_review->in_review`, `blocked->blocked` (descarte/opcao 4 -> `cancelled`). Status final:
|
|
740
|
+
opcoes 1/2 (merge/PR) -> `done`; opcao 3 (deixa branch) -> `in_review`; opcao 4 (descarta) -> `cancelled`.
|
|
741
|
+
A KEY do Multica ja vai no body do PR (`Closes MUL-X`) via `finish-phase`, entao o merge auto-avanca a
|
|
742
|
+
issue pra `done` no proprio Multica; este `sync done` e idempotente. FAIL-OPEN: erro -> avisa e segue.
|
|
743
|
+
|
|
744
|
+
```bash
|
|
745
|
+
if [ "$BOARD" = "true" ]; then
|
|
746
|
+
case "$ESCOLHA" in
|
|
747
|
+
1|2) MB_STATUS=done ;;
|
|
748
|
+
3) MB_STATUS=in_review ;;
|
|
749
|
+
4) MB_STATUS=cancelled ;;
|
|
750
|
+
*) MB_STATUS=done ;; # --auto sem menu = fechou = done
|
|
751
|
+
esac
|
|
752
|
+
# Ler pr_number do git-map.json da fase (escrito por finish-phase), se houver.
|
|
753
|
+
MB_PR=$(node "$HOME/.claude/up/bin/up-tools.cjs" github status --phase {phase_number} --raw 2>/dev/null \
|
|
754
|
+
| grep -oE '"pr"[^,}]*' | sed 's/.*: *//;s/"//g')
|
|
755
|
+
node "$HOME/.claude/up/bin/up-tools.cjs" multica sync \
|
|
756
|
+
--phase {phase_number} --status "$MB_STATUS" \
|
|
757
|
+
--gh-issue "${ISSUE:-}" --branch "${BRANCH:-}" --pr "${MB_PR:-}" --raw 2>/dev/null \
|
|
758
|
+
|| echo "AVISO: Multica indisponivel (sync $MB_STATUS fase {phase_number}). Seguindo."
|
|
759
|
+
fi
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
> Em `--solo` o fluxo nem chega aqui (sem `--board`): nenhuma chamada Multica.
|
|
763
|
+
|
|
764
|
+
### 3.9 Reassessment de roadmap (pos-fase, inline, ~30s)
|
|
765
|
+
|
|
766
|
+
Apos o GATE aprovar e ANTES de planejar/executar a proxima fase, o orquestrador re-avalia o ROADMAP inline (sem agente separado). Migrado do builder.md 3.1.7 (caira por omissao no corte; recolocado).
|
|
767
|
+
|
|
768
|
+
Ler ROADMAP.md (fases futuras) + os SUMMARY da fase recem-completa e checar 3 coisas:
|
|
769
|
+
- **(a) Fase futura virou redundante?** A fase atual pode ter coberto algo que uma fase futura faria (ex: auth da Fase 3 ja entregou o RBAC que a Fase 6 planejava). Se sim: marcar a fase futura como `Removida (coberta pela Fase {X})` no ROADMAP.
|
|
770
|
+
- **(b) Fase futura precisa de ajuste?** Decisao arquitetural desta fase muda o escopo de fases futuras (ex: escolheu tRPC, fases de API mudam). Se sim: atualizar objetivo/criterios da fase futura.
|
|
771
|
+
- **(c) Surgiu necessidade nova critica?** Ler `.plano/captures/` (se existir). Insight que bloqueia fases futuras vira fase nova; melhoria so vai pro Polish.
|
|
772
|
+
|
|
773
|
+
Se houve mudanca no roadmap:
|
|
774
|
+
|
|
775
|
+
```bash
|
|
776
|
+
node "$HOME/.claude/up/bin/up-tools.cjs" commit "docs: reassessment apos fase {X}" --files .plano/ROADMAP.md
|
|
777
|
+
```
|
|
555
778
|
|
|
556
|
-
|
|
779
|
+
Log de 1 linha: `Reassessment: [sem mudancas | X ajustadas | Y removidas | Z adicionadas]`. Sem mudanca: seguir silenciosamente. Diferente do re-plan LOCAL do Estagio 3.4 (que so corrige a fase corrente): aqui poda/ajusta o roadmap FUTURO a luz do que ja foi construido.
|
|
557
780
|
|
|
558
781
|
## Estagio 4: QUALITY GATE GLOBAL
|
|
559
782
|
|
|
560
|
-
|
|
783
|
+
Rodar DCRV em escopo global apos todas as fases:
|
|
784
|
+
|
|
785
|
+
```
|
|
786
|
+
SCOPE=global, AUTO_FIX=true, MAX_CYCLES=5
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
Ver `@~/.claude/up/workflows/dcrv.md`. Carryover de issues por fase ja foi acumulado em
|
|
790
|
+
`.plano/issues-carryover/`.
|
|
561
791
|
|
|
562
|
-
## Estagio 4.5: DELIVERY
|
|
792
|
+
## Estagio 4.5: REVISAO DE DELIVERY (consolidada)
|
|
793
|
+
|
|
794
|
+
Spawnar `up-revisor` em escopo global (Confidence Score de delivery do projeto inteiro). Substitui a
|
|
795
|
+
antiga auditoria de delivery dedicada.
|
|
563
796
|
|
|
564
797
|
```python
|
|
565
|
-
Agent(subagent_type="up-
|
|
798
|
+
Agent(subagent_type="up-revisor", prompt="""
|
|
799
|
+
Revisao final de delivery (escopo: projeto). Stage 1 valida comportamento vs REQUIREMENTS globais;
|
|
800
|
+
Stage 2 confere qualidade/seguranca cross-fase. Emitir Confidence Score (0-100) e veredito.
|
|
801
|
+
Logar em .plano/governance/approvals.log com escopo 'delivery'.
|
|
802
|
+
""")
|
|
566
803
|
```
|
|
567
804
|
|
|
568
805
|
## Estagio 5: DELIVERY
|
|
569
806
|
|
|
570
|
-
|
|
807
|
+
Apresentacao = output direto do orquestrador (sem CEO). Le owner-profile pra tom.
|
|
571
808
|
|
|
572
809
|
### 5.X Marcar Projeto Completo
|
|
573
810
|
|
|
574
811
|
```bash
|
|
575
|
-
# PLAN-READY.md → PROJECT-COMPLETE.md
|
|
576
812
|
mv .plano/PLAN-READY.md .plano/PROJECT-COMPLETE.md
|
|
577
813
|
```
|
|
578
814
|
|
|
815
|
+
**Multica: fechar o board (so se `--board`).** Sync batched final marca a issue-pai como `done` (idempotente).
|
|
816
|
+
FAIL-OPEN. Imprimir a URL do board pro dono ver o resultado.
|
|
817
|
+
|
|
818
|
+
```bash
|
|
819
|
+
if [ "$BOARD" = "true" ]; then
|
|
820
|
+
node "$HOME/.claude/up/bin/up-tools.cjs" multica sync --status done --raw 2>/dev/null \
|
|
821
|
+
|| echo "AVISO: Multica indisponivel (sync final). Seguindo."
|
|
822
|
+
node "$HOME/.claude/up/bin/up-tools.cjs" multica board --raw 2>/dev/null # imprime a URL do board
|
|
823
|
+
fi
|
|
824
|
+
```
|
|
825
|
+
|
|
579
826
|
Adicionar ao frontmatter:
|
|
580
827
|
```yaml
|
|
581
828
|
status: complete
|
|
582
829
|
completed_at: [timestamp]
|
|
583
830
|
completed_by:
|
|
584
831
|
runtime: [current]
|
|
585
|
-
|
|
586
|
-
final_confidence: [from audit]
|
|
832
|
+
final_confidence: [do up-revisor de delivery]
|
|
587
833
|
```
|
|
588
834
|
|
|
589
835
|
</process>
|
|
590
836
|
|
|
591
|
-
<replans>
|
|
592
|
-
|
|
593
|
-
## Re-plans Locais (max 2)
|
|
594
|
-
|
|
595
|
-
Quando: execution-supervisor descobre que o plano original esta inviavel.
|
|
596
|
-
|
|
597
|
-
Como funciona:
|
|
598
|
-
|
|
599
|
-
```
|
|
600
|
-
Execution falha
|
|
601
|
-
↓
|
|
602
|
-
execution-supervisor analisa
|
|
603
|
-
↓
|
|
604
|
-
Decide: REQUEST_REPLAN
|
|
605
|
-
↓
|
|
606
|
-
Verifica replans.log < 2?
|
|
607
|
-
├─ Sim: prosseguir
|
|
608
|
-
└─ Nao: ESCALATE pro CEO
|
|
609
|
-
↓
|
|
610
|
-
Spawnar planejador LOCAL no runtime atual
|
|
611
|
-
↓
|
|
612
|
-
Refaz plano daquela fase
|
|
613
|
-
↓
|
|
614
|
-
Salva como PLAN-v2.md (preserva v1 pra historico)
|
|
615
|
-
↓
|
|
616
|
-
Planning-supervisor LOCAL revisa
|
|
617
|
-
↓
|
|
618
|
-
Se APPROVE: voltar pro executor com novo plano
|
|
619
|
-
Se REJECT: ESCALATE pro chief-engineer
|
|
620
|
-
```
|
|
621
|
-
|
|
622
|
-
Registro em `.plano/governance/replans.log`:
|
|
623
|
-
```
|
|
624
|
-
2026-04-11T15:30:00Z | phase-3 | execution-supervisor | REPLAN | cycle 1/2
|
|
625
|
-
reason: Library X discontinued, need to use Y instead
|
|
626
|
-
original_plan: 03-01-PLAN-v1.md
|
|
627
|
-
new_plan: 03-01-PLAN.md (was v2)
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
</replans>
|
|
631
|
-
|
|
632
837
|
<success_criteria>
|
|
633
838
|
- [ ] Owner profile LOCAL validado
|
|
634
839
|
- [ ] PLAN-READY.md existe e parseado
|
|
635
840
|
- [ ] Validacao light passou (artefatos + planos existem)
|
|
636
|
-
- [ ]
|
|
841
|
+
- [ ] Dono confirmou execucao (orquestrador, sem CEO)
|
|
637
842
|
- [ ] Governance inicializada (.plano/governance/approvals.log)
|
|
638
|
-
- [ ] Todas fases executadas com SUMMARY.md (GATE A
|
|
639
|
-
- [ ]
|
|
640
|
-
- [ ]
|
|
641
|
-
- [ ]
|
|
642
|
-
- [ ]
|
|
643
|
-
- [ ]
|
|
644
|
-
-
|
|
645
|
-
- [ ]
|
|
646
|
-
|
|
647
|
-
- [ ]
|
|
648
|
-
|
|
649
|
-
-
|
|
843
|
+
- [ ] Todas as fases executadas com SUMMARY.md (GATE A)
|
|
844
|
+
- [ ] Verificador produziu VERIFICATION.md por fase (GATE B); ladder estatica usada quando possivel
|
|
845
|
+
- [ ] E2E + DCRV rodaram por fase (delegado a dcrv.md)
|
|
846
|
+
- [ ] up-revisor emitiu veredito por fase e LOGOU em approvals.log COM campo evidence=<tipo>:<resultado>
|
|
847
|
+
- [ ] GATE de fase deterministico passou (APPROVE + evidence do tipo certo, ou forced approval com debito)
|
|
848
|
+
- [ ] GitHub-nativo (default): worktree+branch+issue por fase via `github start-phase`; menu 4 opcoes /
|
|
849
|
+
`github finish-phase` no fim. `--solo` degrada para commit na branch atual (sem worktree/issue/PR)
|
|
850
|
+
- [ ] Execucao sempre via up-executor (roteia por contexto: frontend/backend/database/misto); SEM agentes
|
|
851
|
+
specialist separados (Onda 2 do corte)
|
|
852
|
+
- [ ] `--board`: Multica init no inicio (project+pai), sync `in_progress` na entrada da fase, sync BATCHED
|
|
853
|
+
no fim da fase/onda (status+metadata gh_issue/branch/pr), sync done + board URL no delivery. Tudo
|
|
854
|
+
fail-open (nunca crasha) e batched (nao por microtransicao). Sem `--board`: zero chamada Multica
|
|
855
|
+
- [ ] Cap de rework de 1 round respeitado
|
|
856
|
+
- [ ] Re-plans locais registrados (se houve, max 2)
|
|
857
|
+
- [ ] Quality Gate global rodou
|
|
858
|
+
- [ ] up-revisor fez revisao de delivery consolidada
|
|
859
|
+
- [ ] PLAN-READY.md -> PROJECT-COMPLETE.md
|
|
860
|
+
- [ ] Nenhuma referencia a CEO, chiefs, camadas de revisao intermediaria, auditores gold ou builder-e2e
|
|
861
|
+
- [ ] Nenhuma referencia aos 3 specialists de dominio nem aos 3 detectores DCRV antigos (6 agentes
|
|
862
|
+
deletados na Onda 2; tudo via up-executor e up-tester)
|
|
650
863
|
</success_criteria>
|
|
864
|
+
</output>
|