@tavaressan/vetor 0.1.0
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 +42 -0
- package/bin/vetor.js +6 -0
- package/lib/banner.js +35 -0
- package/lib/commands/install.js +71 -0
- package/lib/commands/status.js +59 -0
- package/lib/commands/uninstall.js +119 -0
- package/lib/commands/update.js +63 -0
- package/lib/installer/command-exists.js +30 -0
- package/lib/installer/cursor-hooks.js +181 -0
- package/lib/installer/detector.js +79 -0
- package/lib/installer/manifest.js +76 -0
- package/lib/installer/prompts.js +97 -0
- package/lib/installer/writer.js +382 -0
- package/lib/router.js +50 -0
- package/package.json +39 -0
- package/templates/.gitkeep +0 -0
- package/templates/agents/code-review/agent.json +27 -0
- package/templates/agents/code-review/codex.toml +37 -0
- package/templates/agents/code-review.md +99 -0
- package/templates/agents/issue-worker/agent.json +33 -0
- package/templates/agents/issue-worker/codex.toml +57 -0
- package/templates/agents/issue-worker.md +112 -0
- package/templates/hooks/hooks-codex.json +48 -0
- package/templates/hooks/hooks.json +62 -0
- package/templates/opencode/agent/code-review.md +73 -0
- package/templates/opencode/agent/issue-coordinator.md +521 -0
- package/templates/opencode/agent/issue-worker.md +64 -0
- package/templates/opencode/mcp.jsonc +39 -0
- package/templates/opencode/plugin/vetor.ts +207 -0
- package/templates/opencode/scripts/agent-registration_test.ts +92 -0
- package/templates/opencode/scripts/check-edit.ts +147 -0
- package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
- package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
- package/templates/opencode/scripts/lib/guard.ts +45 -0
- package/templates/opencode/scripts/lib/model-health.ts +133 -0
- package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
- package/templates/opencode/scripts/lib/project.ts +240 -0
- package/templates/opencode/scripts/lib/project_test.ts +45 -0
- package/templates/opencode/scripts/lib/status.ts +69 -0
- package/templates/opencode/scripts/lib/worktree.ts +41 -0
- package/templates/opencode/scripts/model-health.ts +50 -0
- package/templates/opencode/scripts/model-health_test.ts +80 -0
- package/templates/opencode/scripts/resolve-model.ts +112 -0
- package/templates/opencode/scripts/resolve-model_test.ts +185 -0
- package/templates/opencode/scripts/safety-check.ts +203 -0
- package/templates/opencode/scripts/vetor-checks.sh +217 -0
- package/templates/opencode/scripts/vetor-status.sh +99 -0
- package/templates/skills/architecture-review/SKILL.md +187 -0
- package/templates/skills/backlog-ideator/SKILL.md +277 -0
- package/templates/skills/design/SKILL.md +468 -0
- package/templates/skills/design/examples/design-contract-example.md +46 -0
- package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
- package/templates/skills/fix-loop-agent/SKILL.md +255 -0
- package/templates/skills/guardian/SKILL.md +343 -0
- package/templates/skills/issue-coordinator/SKILL.md +596 -0
- package/templates/skills/retro/SKILL.md +156 -0
- package/templates/skills/shared/references/agent-status.template.md +68 -0
- package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
- package/templates/skills/shared/references/conflict-resolution.md +94 -0
- package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
- package/templates/skills/shared/references/design-vocabulary.md +508 -0
- package/templates/skills/shared/references/evidence-state.md +365 -0
- package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
- package/templates/skills/shared/references/grilling-conventions.md +64 -0
- package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
- package/templates/skills/shared/references/mcp-availability.md +104 -0
- package/templates/skills/shared/references/module-test-map.template.md +72 -0
- package/templates/skills/shared/references/planning-conventions.md +97 -0
- package/templates/skills/shared/references/project-conventions.md +63 -0
- package/templates/skills/shared/references/tdd-conventions.md +81 -0
- package/templates/skills/shared/references/touched-files-cache.md +30 -0
- package/templates/skills/spec/SKILL.md +524 -0
- package/templates/skills/spec-validate/SKILL.md +195 -0
- package/templates/skills/spec-validate/references/traceability.md +169 -0
- package/templates/skills/stack-practices/SKILL.md +151 -0
- package/templates/skills/vetor/SKILL.md +174 -0
- package/templates/skills/worktree-create/SKILL.md +142 -0
- package/templates/skills/worktree-ship/SKILL.md +394 -0
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: issue-coordinator
|
|
3
|
+
description: Despacho paralelo de issues GitHub para sub-agentes com worktrees isolados guiado por Planejamento. Agrega status e coordena merge serializado. Use /vetor:issue-coordinator [label]. Aceita --headless para execução não-interativa (rotinas/CI).
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.6.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é o coordenador de issues do Vetor. Sua missão é despachar issues de um label GitHub para sub-agentes paralelos, cada um em seu próprio worktree, e coordenar o ciclo completo até merge, utilizando o fluxo nativo de planejamento.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Sintaxe
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/vetor:issue-coordinator [label]
|
|
19
|
+
/vetor:issue-coordinator <n1>,<n2>,...
|
|
20
|
+
/vetor:issue-coordinator
|
|
21
|
+
/vetor:issue-coordinator --resume
|
|
22
|
+
/vetor:issue-coordinator [label] --headless
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- `[label]`: label das issues a despachar (sem argumento: todas as issues abertas, ou usa `defaultDispatchLabel` de `.claude/vetor/config.json` se configurado)
|
|
26
|
+
- `<n1>,<n2>,...`: lista de números de issue (ex.: `/vetor:issue-coordinator 12,14,17`). Casa `^[0-9]+(,[0-9]+)*$`.
|
|
27
|
+
- **sem argumento** ou **`--resume`**: modo de retomada — reconstrói o estado a partir dos
|
|
28
|
+
worktrees/status files existentes (Fase 0).
|
|
29
|
+
- `--headless`: execução **não-interativa**, para rotinas agendadas e CI. Combinável com qualquer
|
|
30
|
+
um dos anteriores.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Referências
|
|
35
|
+
|
|
36
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
37
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
38
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
|
|
39
|
+
> ```bash
|
|
40
|
+
> SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
|
|
41
|
+
> ```
|
|
42
|
+
> e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
|
|
43
|
+
|
|
44
|
+
Este coordenador compõe os primitivos do plugin:
|
|
45
|
+
- `/vetor:worktree-create` — criação headless de worktree (skill, Fase 3)
|
|
46
|
+
- `vetor:issue-worker` — subagente nativo (`agents/issue-worker.md`) despachado por issue na Fase 4;
|
|
47
|
+
já traz a skill `fix-loop-agent` pré-carregada e tools restritas (nunca push/PR/merge)
|
|
48
|
+
- `/vetor:worktree-ship` — pipeline de entrega (test → PR → CI → merge), Fase 6
|
|
49
|
+
|
|
50
|
+
Os comandos de teste vêm de `.claude/vetor/module-test-map.md` ou, na ausência dela, de
|
|
51
|
+
auto-detecção a partir do CI — cada primitivo já consome essa referência, sempre resolvendo o
|
|
52
|
+
arquivo a partir do root do repositório (`vetor-checks.sh repo-root`), nunca do `cwd` do worktree
|
|
53
|
+
(issue #160), pois arquivos ignorados pelo `.gitignore` do projeto-alvo (ex.: uma entrada
|
|
54
|
+
`.claude/`) não são materializados em worktrees linkados. Se `git check-ignore -q .claude` indicar
|
|
55
|
+
que `.claude/` está ignorado no projeto-alvo, você pode opcionalmente injetar os comandos de teste
|
|
56
|
+
já resolvidos diretamente no prompt de cada worker despachado, como reforço redundante — a fonte de
|
|
57
|
+
verdade continua sendo a resolução via root em `project-conventions.md`.
|
|
58
|
+
Regras de economia de tokens e delegação a um runtime externo disponível (Gemini/OpenCode/Codex):
|
|
59
|
+
`../shared/references/planning-conventions.md` e
|
|
60
|
+
`../shared/references/delegate-to-runtime.md`.
|
|
61
|
+
Se uma issue referenciar uma Spec previamente gerada por `/vetor:spec` (ver `skills/spec/SKILL.md`
|
|
62
|
+
§6), ela fica em `docs/specs/<slug>.md` por padrão (path previsível, issue #219) — útil como contexto
|
|
63
|
+
adicional ao ler a issue no passo 1; esta skill não consome nem gera código a partir dela.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Modo headless
|
|
68
|
+
|
|
69
|
+
A flag `--headless` substitui os quatro pontos de interação humana por decisões determinísticas:
|
|
70
|
+
|
|
71
|
+
| Fase | Interativo | Headless |
|
|
72
|
+
|------|-----------|----------|
|
|
73
|
+
| 2 — gate de Spec/design | `AskUserQuestion` por issue não-trivial sem Spec associada | Nunca pergunta, nunca bloqueia; anota `⚠️ sem Spec associada` na coluna "Ação" e segue o dispatch |
|
|
74
|
+
| 2 — teto de workers | `AskUserQuestion` | Usa `N_rec` calculado, sem perguntar |
|
|
75
|
+
| 2 — aprovação do plano | `ExitPlanMode`, **pare** | Não pede aprovação; imprime o plano no relatório |
|
|
76
|
+
| 5.b — `BLOCKED_WAITING` | `AskUserQuestion` ao usuário | Não escala; deixa o grupo bloqueado e reporta |
|
|
77
|
+
| 5.c — circuit breaker | Pergunta se pausa | Sempre pausa: para de despachar e reporta |
|
|
78
|
+
|
|
79
|
+
Além disso, em `--headless`:
|
|
80
|
+
|
|
81
|
+
- **A Fase 6 (merge) não roda.** Nunca invoque `worktree-ship`, `gh pr ready` ou `gh pr merge`.
|
|
82
|
+
Grupos em `GREEN` são reportados como prontos para ship.
|
|
83
|
+
- **Nenhuma permissão é auto-aprovada.** Um worker que bloqueia pedindo permissão permanece
|
|
84
|
+
`BLOCKED_WAITING` e aparece no relatório final.
|
|
85
|
+
- **Ausência de trabalho não é falha.** Se não houver issue elegível, encerre com um relatório de
|
|
86
|
+
uma linha. Não force dispatch para parecer produtivo.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Comportamento
|
|
91
|
+
|
|
92
|
+
### 0 — Detecção de modo
|
|
93
|
+
|
|
94
|
+
- **Sem argumento** ou **`--resume`**: entre em **modo de retomada**.
|
|
95
|
+
1. Rode `bash "$SKILL_DIR/../../scripts/vetor-status.sh"` para listar os worktrees ativos com
|
|
96
|
+
status file. O script cruza os status files com `gh pr list` e anota `GREEN (PR #N aberta)` ou
|
|
97
|
+
`GREEN (já mergeado via #N)`.
|
|
98
|
+
2. Se houver ao menos um status file ativo: **pule as Fases 1–3** e faça a pergunta de workers
|
|
99
|
+
(Fase 2) — o estado em memória de `N` não sobrevive a um reinício da sessão. Depois monte a
|
|
100
|
+
tabela de status (Fase 5.a) e, para cada grupo em `GREEN` sem PR aberta ou merge, ofereça o
|
|
101
|
+
ship via `AskUserQuestion` ("Fazer ship do grupo `<slug>` (Issue #<N>), que está GREEN?"). Se
|
|
102
|
+
já estiver mergeado, apenas informe. Prossiga a partir da Fase 5/6.
|
|
103
|
+
Em `--headless`: não pergunte o teto (use `N_rec`) e não ofereça ship — apenas reporte os
|
|
104
|
+
grupos `GREEN` como prontos.
|
|
105
|
+
3. Se **não houver** worktree ativo com status file: caia no fluxo padrão (Fase 1), descobrindo
|
|
106
|
+
dinamicamente labels ou usando `defaultDispatchLabel` de `.claude/vetor/config.json` se configurado.
|
|
107
|
+
- **Lista de números** ou **label explícito**: siga o fluxo padrão a partir da Fase 1.
|
|
108
|
+
|
|
109
|
+
### 1 — Listar issues candidatas e analisar afinidades
|
|
110
|
+
|
|
111
|
+
Se o argumento casar `^[0-9]+(,[0-9]+)*$`, trate-o como **lista por número**; caso contrário, como
|
|
112
|
+
**label**. Se **nenhum argumento** for passado:
|
|
113
|
+
- Verifique se `.claude/vetor/config.json` declara `defaultDispatchLabel`
|
|
114
|
+
- Se sim: use esse label (filtro explícito)
|
|
115
|
+
- Se não: descubra todas as issues abertas (sem filtro de label)
|
|
116
|
+
|
|
117
|
+
O restante do fluxo é idêntico nos três modos (número, label, descoberta dinâmica).
|
|
118
|
+
|
|
119
|
+
- **Lista por número:**
|
|
120
|
+
```bash
|
|
121
|
+
for N in ${ARG//,/ }; do gh issue view "$N" --json number,title,labels,body; done
|
|
122
|
+
```
|
|
123
|
+
- **Label ou defaultDispatchLabel:**
|
|
124
|
+
```bash
|
|
125
|
+
gh issue list --label <label> --state open --json number,title,labels,body
|
|
126
|
+
```
|
|
127
|
+
- **Descoberta dinâmica (sem argumento, sem defaultDispatchLabel):**
|
|
128
|
+
```bash
|
|
129
|
+
gh issue list --state open --json number,title,labels,body
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Priorização: pedidas pelo usuário vs. recomendadas pelo agente.** O modo por label (ou a descoberta
|
|
133
|
+
dinâmica) traz de volta, na mesma leva, issues abertas manualmente/via integração externa e issues
|
|
134
|
+
geradas por `/vetor:retro` ou `/vetor:backlog-ideator` (label `ai-generated`), sem distinção. Antes de
|
|
135
|
+
montar o agrupamento por afinidade, particione o resultado usando o campo `labels` já retornado:
|
|
136
|
+
|
|
137
|
+
- **Pedidas pelo usuário** (candidatas primárias): issues **sem** a label `ai-generated`.
|
|
138
|
+
- **Recomendadas pelo agente**: issues **com** a label `ai-generated`.
|
|
139
|
+
|
|
140
|
+
Monte o plano de dispatch priorizando o grupo "pedidas pelo usuário". Só inclua issues do grupo
|
|
141
|
+
"recomendadas pelo agente" quando o primeiro grupo estiver **vazio** no filtro aplicado — ou,
|
|
142
|
+
opcionalmente, como itens extras claramente sinalizados como "recomendação do agente" no plano
|
|
143
|
+
apresentado para aprovação (Fase 2), nunca misturados sem essa marcação.
|
|
144
|
+
|
|
145
|
+
Para cada issue, verifique se já há PR aberto:
|
|
146
|
+
```bash
|
|
147
|
+
gh pr list --search "closes:#<N>" --state open --json number,title
|
|
148
|
+
```
|
|
149
|
+
Se houver (ou se `vetor-status.sh` reportar `GREEN (PR #N aberta)` / `GREEN (já mergeado via #N)`):
|
|
150
|
+
pule a issue e registre na tabela como "PR já aberto (#<PR>)" ou "Já mergeado (#<PR>)".
|
|
151
|
+
|
|
152
|
+
#### Agrupamento por afinidade
|
|
153
|
+
|
|
154
|
+
Com as candidatas válidas em mãos, se houver mais de 3 issues, você pode delegar a proposta de
|
|
155
|
+
agrupamento a um runtime externo disponível — detecção e algoritmo de seleção em
|
|
156
|
+
`delegate-to-runtime.md` §1-2 (com 2+ candidatos e nenhuma preferência configurada, em sessão
|
|
157
|
+
interativa pergunte qual usar; em `--headless`, siga inline). Você valida e corrige a proposta; a
|
|
158
|
+
distribuição final é sua.
|
|
159
|
+
|
|
160
|
+
Inline (ou com 3 ou menos issues):
|
|
161
|
+
- Agrupe issues **complementares ou correlatas** (mesmo módulo, ou um `fix` que complementa
|
|
162
|
+
diretamente uma `feat`) por título, labels e descrição.
|
|
163
|
+
- Defina uma **Lead Issue** (a principal ou mais antiga), que dá nome ao worktree/branch.
|
|
164
|
+
- As demais viram **Sequential Issues**, resolvidas em sequência pelo mesmo agente no mesmo worktree.
|
|
165
|
+
|
|
166
|
+
#### Ondas de despacho (DAG Waves)
|
|
167
|
+
|
|
168
|
+
Grupos que rodam **em paralelo** podem depender causalmente uns dos outros (ex.: grupo B usa uma
|
|
169
|
+
entidade/migration/classe que só existe depois do merge do grupo A). Despachar B a partir do branch
|
|
170
|
+
default ANTES do merge de A causa branch skew: o worktree de B nunca verá as mudanças de A, exigindo
|
|
171
|
+
conciliação manual depois. Para evitar isso, organize os grupos em **ondas topológicas** (`O_1, O_2,
|
|
172
|
+
..., O_k`) antes de montar o plano da Fase 2:
|
|
173
|
+
|
|
174
|
+
1. Para cada par de grupos, verifique **heurísticas best-effort** de dependência (não há grafo formal
|
|
175
|
+
de dependências no GitHub — esta detecção é sempre uma inferência, nunca um fato garantido):
|
|
176
|
+
- Título/corpo de uma issue do grupo B menciona explicitamente outro grupo/issue do grupo A (ex.:
|
|
177
|
+
"depende de #12", "após #12", "usa a entidade criada em #12").
|
|
178
|
+
- Labels indicando ordem (ex.: `blocked-by`, `depends-on`) ou convenção do time.
|
|
179
|
+
- Mesmo módulo/diretório, mas com evidência de ordem de criação de arquivo (ex.: B referencia uma
|
|
180
|
+
classe, tabela ou migration que a descrição de A propõe criar pela primeira vez).
|
|
181
|
+
2. Construa um DAG (grafo acíclico dirigido) de grupos: aresta `A → B` quando B depende de A. Se
|
|
182
|
+
houver ciclo aparente (heurística ambígua), trate como **não-dependente** e avise no plano — não
|
|
183
|
+
bloqueie o dispatch por uma inferência de baixa confiança.
|
|
184
|
+
3. Derive as ondas por ordenação topológica: `O_1` contém todos os grupos sem dependência pendente;
|
|
185
|
+
`O_2` os que dependem só de grupos em `O_1`; e assim por diante.
|
|
186
|
+
4. **Fallback:** se nenhuma dependência for detectável entre os grupos (caso mais comum), cada grupo
|
|
187
|
+
forma sua própria onda e todas as ondas colapsam em uma só (`O_1`) — comportamento idêntico ao
|
|
188
|
+
dispatch paralelo atual, sem mudança de comportamento observável.
|
|
189
|
+
5. O usuário pode **corrigir manualmente** o agrupamento em ondas no plano da Fase 2 antes de aprovar
|
|
190
|
+
— a heurística é um ponto de partida, não uma decisão final.
|
|
191
|
+
|
|
192
|
+
### 2 — Apresentar plano de dispatch e obter aprovação
|
|
193
|
+
|
|
194
|
+
#### Gate de Spec/design (classificação de complexidade, antes do dispatch)
|
|
195
|
+
|
|
196
|
+
Antes de montar a tabela do plano, classifique cada issue candidata da Fase 1 — vocabulário derivado
|
|
197
|
+
da triagem equivalente de `spec/SKILL.md` §0.1 (Investigação/Confirmação rápida/Spec completa), mas
|
|
198
|
+
aplicado aqui à decisão "despachar como está, ou sinalizar a falta de uma Spec antes de despachar":
|
|
199
|
+
|
|
200
|
+
1. **Heurística de complexidade**, por issue (`gh issue view <N> --json body,labels`):
|
|
201
|
+
- **Módulos tocados**: quantos módulos de `.claude/vetor/module-test-map.md` têm o prefixo
|
|
202
|
+
mencionado no título/corpo da issue (ex.: `cli/`, `scripts/`). Mais de 1 é sinal de complexidade
|
|
203
|
+
— em projetos com poucos módulos mapeados este sinal tende a ficar em 0 ou 1 na maioria das
|
|
204
|
+
issues; nesse caso o sinal de "escopo já declarado" abaixo é quem decide a classificação.
|
|
205
|
+
- **Escopo já declarado**: o corpo já traz uma seção equivalente a "Escopo do trabalho" e um
|
|
206
|
+
"Critério de Aceite" com itens concretos (checklist, não frase vaga).
|
|
207
|
+
- **Label**: `feat`/`enhancement`/`refactor` tendem a não-trivial mesmo com escopo declarado;
|
|
208
|
+
`fix`/`chore`/`bug` com escopo declarado tendem a trivial. Ajuste esta lista ao vocabulário de
|
|
209
|
+
labels efetivamente usado no repositório-alvo (ex.: um projeto sem label `feat` própria, como
|
|
210
|
+
este mesmo repositório, usa `enhancement` para o equivalente).
|
|
211
|
+
2. **Classificação**: `trivial` quando o escopo já está declarado **e** o nº de módulos tocados é
|
|
212
|
+
≤ 1 **e** a label não é `feat`/`enhancement`/`refactor`; **não-trivial** em qualquer outro caso
|
|
213
|
+
(múltiplos módulos, ou escopo ausente/vago, ou `feat`/`enhancement`/`refactor` sem Critério de
|
|
214
|
+
Aceite explícito).
|
|
215
|
+
3. **Spec associada**: verifique se a issue referencia uma Spec (`docs/specs/<slug>.md`, ver
|
|
216
|
+
`spec/SKILL.md` §6) no corpo ou em algum comentário.
|
|
217
|
+
4. **Gate**: sinalize apenas issues `não-trivial` **sem** Spec associada — nunca issues `trivial`
|
|
218
|
+
(um bugfix que já chega com escopo claro não é bloqueado cegamente) nem issues `não-trivial` que já
|
|
219
|
+
têm Spec.
|
|
220
|
+
|
|
221
|
+
**Fora de `--headless`:** para cada issue sinalizada, pergunte via `AskUserQuestion` (uma pergunta por
|
|
222
|
+
issue, ou agrupada se houver mais de uma — `planning-conventions.md` §3 "Regra das 3 perguntas"),
|
|
223
|
+
**antes de montar a tabela do plano**:
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
Issue #<N> parece não-trivial (<razão: múltiplos módulos | sem Escopo do trabalho/Critério de
|
|
227
|
+
Aceite | feat/enhancement/refactor sem escopo detalhado>) e não tem Spec associada. Como prosseguir?
|
|
228
|
+
|
|
229
|
+
1. Despachar mesmo assim — escopo confirmado nesta conversa
|
|
230
|
+
2. Gerar Spec antes (/vetor:spec) — esta issue sai desta leva de dispatch
|
|
231
|
+
3. Confirmar rapidamente 2-3 pontos agora (problema, resultado esperado, não-escopo) e seguir sem
|
|
232
|
+
Spec completa
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
- **Opções 1 ou 3**: a issue segue no plano normalmente; marque na coluna "Ação" da tabela (abaixo)
|
|
236
|
+
`Despachar (⚠️ sem Spec — confirmado pelo usuário)`. Na opção 3, inclua os 2-3 pontos confirmados
|
|
237
|
+
no prompt do worker da Fase 4, como contexto adicional (não substitui uma Spec — é só o mínimo de
|
|
238
|
+
escopo confirmado para o worker não inventar critério de aceite sozinho).
|
|
239
|
+
- **Opção 2**: remova a issue desta leva de dispatch — ela não aparece como `Despachar`, e sim com
|
|
240
|
+
Ação `SKIPPED (aguardando Spec)` e coluna "Onda" `—` (nunca foi despachada, não pertence a onda
|
|
241
|
+
nenhuma). Se a issue sinalizada é a **Lead** do grupo, o grupo inteiro sai da leva (as Sequential
|
|
242
|
+
Issues do grupo ficam sem Lead para dar nome ao worktree/branch — voltam junto na próxima sessão);
|
|
243
|
+
se é uma **Sequential Issue**, apenas ela sai e o restante do grupo (Lead + demais Sequential) segue
|
|
244
|
+
normalmente. A issue (ou grupo) volta a ser candidata em uma sessão futura do coordinator, quando a
|
|
245
|
+
Spec existir (`/vetor:spec` roda fora deste fluxo, tipicamente numa sessão manual). **Um grupo
|
|
246
|
+
`SKIPPED` nunca é pendência para a transição de onda da Fase 4** — como não foi despachado, não há
|
|
247
|
+
branch skew a prevenir (as ondas ordenam merges de trabalho já despachado, não issues que nunca
|
|
248
|
+
saíram do plano); a transição de `O_i` para `O_{i+1}` ignora grupos `SKIPPED` de `O_i`.
|
|
249
|
+
|
|
250
|
+
**Em `--headless`: nunca pergunte, nunca bloqueie.** Um gate síncrono aqui recriaria o mesmo deadlock
|
|
251
|
+
por falta de interlocutor do worker preso em plan mode (issue #121 — ver `wiki/Decisoes-de-Design.md`).
|
|
252
|
+
Marque a issue na coluna "Ação" como `Despachar (⚠️ sem Spec associada — sinalização não-bloqueante)` e
|
|
253
|
+
prossiga o dispatch normalmente; a ausência de Spec fica registrada no relatório final (Fase 7), nunca
|
|
254
|
+
impede o dispatch.
|
|
255
|
+
|
|
256
|
+
Monte o plano (conteúdo mínimo em `planning-conventions.md` §2.1), já refletindo o resultado do gate
|
|
257
|
+
acima na coluna "Ação":
|
|
258
|
+
|
|
259
|
+
```markdown
|
|
260
|
+
# Plano de Execução Vetor — Coordinator
|
|
261
|
+
|
|
262
|
+
Coordenando issues: <label ou "todas as abertas" ou descrição do filtro>
|
|
263
|
+
|
|
264
|
+
## Ações Propostas
|
|
265
|
+
|
|
266
|
+
| Onda | Subagente/Grupo (Slug) | Lead/Sequential Issues | Modelo Sugerido | Ação |
|
|
267
|
+
|------|-------------------------|------------------------|-----------------|------|
|
|
268
|
+
| O_1 | <slug-1> | #<N1> (Lead), #<M1> | <haiku|sonnet> | Despachar |
|
|
269
|
+
| O_1 | <slug-2> | #<N3> (Lead) | <haiku|sonnet> | Despachar (⚠️ sem Spec — confirmado pelo usuário) |
|
|
270
|
+
| — | <slug-4> | #<N5> (Lead) | — | SKIPPED (aguardando Spec) |
|
|
271
|
+
| O_2 | <slug-3> | #<N4> (Lead) | <haiku|sonnet> | Aguardar O_1 |
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Se houver mais de uma onda, explique **por que** cada grupo da onda `O_2+` depende de um grupo de
|
|
275
|
+
onda anterior (cite a issue/menção que fundamentou a heurística). Se todos os grupos couberem em
|
|
276
|
+
`O_1`, omita a coluna de justificativa — é o caso comum, sem dependências detectadas.
|
|
277
|
+
|
|
278
|
+
Se o plano incluir issues do grupo "recomendadas pelo agente" (Fase 1) — porque não havia issues
|
|
279
|
+
pedidas pelo usuário pendentes, ou como itens extras opcionais —, sinalize cada uma delas na coluna
|
|
280
|
+
"Ação" (ex.: "Despachar (recomendação do agente)") para que a aprovação distinga claramente as duas
|
|
281
|
+
origens.
|
|
282
|
+
|
|
283
|
+
#### Teto de workers simultâneos
|
|
284
|
+
|
|
285
|
+
Cada subagente paralelo é uma instância Claude completa, sem contexto compartilhado — é o maior
|
|
286
|
+
driver de custo agregado do coordinator.
|
|
287
|
+
|
|
288
|
+
1. **Recomendação** `N_rec` = `min(nº de grupos da Fase 1, maxConcurrentWorkers de
|
|
289
|
+
.claude/vetor/config.json se existir — senão 5)`. Acima de ~8 workers, custo agregado e ruído de
|
|
290
|
+
monitoramento tendem a crescer mais rápido que o ganho de paralelismo: se `N_rec` > 8, sinalize
|
|
291
|
+
isso na pergunta. É recomendação, não limite — a decisão é do usuário.
|
|
292
|
+
2. **Em `--headless`:** adote `N = N_rec` sem perguntar e registre no relatório qual valor foi usado
|
|
293
|
+
e como foi calculado. Fora do headless, **pergunte via `AskUserQuestion`** (uma única vez por sessão):
|
|
294
|
+
- `"<N_rec> (Recomendado)"` — justifique em 1 linha (nº de grupos, custo por worker, alerta se > 8)
|
|
295
|
+
- `"1 — serializado"` — mais lento, mais previsível, menor custo
|
|
296
|
+
- `"<maxConcurrentWorkers de config.json>"` — só se existir e for diferente de `N_rec`
|
|
297
|
+
- O usuário pode responder valor customizado ("Other"), **inclusive acima de 8** — respeite-o.
|
|
298
|
+
3. **Armazene como `N`** para a Fase 4; vale para toda a sessão de dispatch, incluindo redespachos.
|
|
299
|
+
Em modo de retomada, repita a pergunta antes de despachar qualquer `QUEUED`. O valor **não
|
|
300
|
+
persiste** em `.claude/vetor/config.json`.
|
|
301
|
+
|
|
302
|
+
#### Obtenção de aprovação
|
|
303
|
+
|
|
304
|
+
**Em `--headless`: pule esta seção** — inclua o plano no relatório final (Fase 7) e siga para a Fase 3.
|
|
305
|
+
|
|
306
|
+
- **No Claude Code:** apresente o plano e conclua com `ExitPlanMode`.
|
|
307
|
+
- **No Antigravity/Gemini:** gere/atualize `implementation_plan.md` com `request_feedback: true` e
|
|
308
|
+
`user_facing: true`, e aguarde `request_feedback: false` ou "Proceed".
|
|
309
|
+
- Sem nenhum dos dois: exiba o plano no chat e aguarde resposta afirmativa explícita.
|
|
310
|
+
|
|
311
|
+
**Pare** até a aprovação. Respeite trocas manuais de modelo ou de teto no dispatch da Fase 4.
|
|
312
|
+
|
|
313
|
+
### 3 — Fase de criação (nativa e serializada)
|
|
314
|
+
|
|
315
|
+
⚠️ **Esta fase é serializada** para evitar `git index lock` ao inicializar os worktrees nativos.
|
|
316
|
+
|
|
317
|
+
A criação e a **localização** do worktree são do harness (`isolation: "worktree"` na Fase 4) — não
|
|
318
|
+
assuma path de worktree. O coordenador deriva apenas:
|
|
319
|
+
1. **Slug:** kebab-case derivado da Lead Issue (máx 30 chars).
|
|
320
|
+
2. **Branch:** `<type>/<issue#>-<slug>` da Lead Issue — o worker a cria como primeiro passo (`git checkout -b <branch>`).
|
|
321
|
+
3. **Status File Path (absoluto, no root do repo):**
|
|
322
|
+
`<repo-root>/.claude/vetor/status/<branch com / trocada por ->.md` — fica fora do worktree;
|
|
323
|
+
formato em `../shared/references/agent-status.template.md`.
|
|
324
|
+
|
|
325
|
+
⚠️ **O slug é só nominal — não é o path do worktree.** Ele serve apenas para compor o nome da branch
|
|
326
|
+
e o do arquivo de status. **Nunca** infira que o worktree está em `.claude/worktrees/<slug>/` ou
|
|
327
|
+
qualquer convenção derivada do slug: obtenha o path real via `git worktree list` (correlacionando
|
|
328
|
+
pela branch) ou pelo retorno do `Agent()`.
|
|
329
|
+
|
|
330
|
+
### 4 — Fase de desenvolvimento (paralela, com teto de concorrência e ondas)
|
|
331
|
+
|
|
332
|
+
- Ordene os grupos por prioridade (ex.: ordem das issues no label) **dentro de cada onda** (Fase 1).
|
|
333
|
+
- Despache em paralelo até `N` grupos, **estritamente dentro da onda corrente** (`O_i`). Grupos de
|
|
334
|
+
`O_{i+1}` ou posterior nunca são despachados enquanto houver grupo de `O_i` ainda não mergeado —
|
|
335
|
+
mesmo que haja vagas no teto `N`. Eles ficam `QUEUED (aguardando O_i)` na tabela (Fase 5.a).
|
|
336
|
+
- Dentro da onda corrente: quando um worker ativo atingir `GREEN`, `FAILED_MAX_ITERATIONS` ou for
|
|
337
|
+
cancelado, despache o próximo `QUEUED` da mesma onda, mantendo os ativos no teto.
|
|
338
|
+
- O teto é contabilidade do coordinator, não bloqueio de plataforma: respeite-o a cada ciclo.
|
|
339
|
+
- **Transição de onda.** Só inicie o dispatch de `O_{i+1}` depois que:
|
|
340
|
+
1. Todos os grupos de `O_i` **que foram efetivamente despachados** tiverem chegado a `GREEN` e
|
|
341
|
+
passado pela Fase 6 (merge) — um grupo de `O_i` em `FAILED_MAX_ITERATIONS` ou `BLOCKED_WAITING`
|
|
342
|
+
sem resolução bloqueia a transição; trate como pendência a reportar, não avance a onda para não
|
|
343
|
+
repetir o branch skew que motivou esta seção. Um grupo `SKIPPED (aguardando Spec)` (gate de
|
|
344
|
+
Spec/design, Fase 2) **nunca** conta como pendência aqui — nunca foi despachado, então não há
|
|
345
|
+
branch/merge dele para a próxima onda esperar.
|
|
346
|
+
2. O branch default (`$DEFAULT_BRANCH`) estiver sincronizado com esses merges. `git fetch && git
|
|
347
|
+
log origin/<default> -1` confirma que o *remoto* já tem os merges — mas não garante que o HEAD
|
|
348
|
+
*local* do root os tenha: `isolation: "worktree"` cria o novo worktree a partir do HEAD local
|
|
349
|
+
do root (não de `origin/$DEFAULT_BRANCH` diretamente). Complete a checagem comparando os dois
|
|
350
|
+
antes do primeiro dispatch de `O_{i+1}`:
|
|
351
|
+
```bash
|
|
352
|
+
git fetch origin "$DEFAULT_BRANCH"
|
|
353
|
+
git rev-parse HEAD # HEAD local do root
|
|
354
|
+
git rev-parse "origin/$DEFAULT_BRANCH" # último commit do remoto
|
|
355
|
+
```
|
|
356
|
+
Se divergirem (root atrasado), rode `bash "$SKILL_DIR/../../scripts/vetor-checks.sh" sync-root`
|
|
357
|
+
e **repita a comparação acima** — `sync-root` sai com código 0 mesmo quando recusa avançar (ex.:
|
|
358
|
+
mudanças locais pré-existentes não commitadas no root, alheias a este trabalho de coordenação —
|
|
359
|
+
causa raiz confirmada na issue #244); não trate o exit 0 como prova de que o HEAD avançou. Se,
|
|
360
|
+
mesmo após o `sync-root`, o root continuar atrasado (dirty state não resolvido ou branch não
|
|
361
|
+
mesclável), **não bloqueie o dispatch por conta disso**: essa condição é exatamente o motivo do
|
|
362
|
+
passo obrigatório abaixo em "Prompt de execução sequencial para o worker" — cada worker de
|
|
363
|
+
`O_{i+1}` sincroniza com `origin/$DEFAULT_BRANCH` por conta própria, como primeiro passo padrão
|
|
364
|
+
(não recuperação ad-hoc), então a divergência do root deixa de ser bloqueante para o dispatch.
|
|
365
|
+
- Se, apesar da heurística da Fase 1, um worker de uma onda posterior reportar erro de compilação por
|
|
366
|
+
dependência ausente de um grupo anterior ainda não mergeado, isso é sinal de dependência não
|
|
367
|
+
detectada: pause o grupo, registre no relatório e corrija o agrupamento em ondas para a próxima
|
|
368
|
+
sessão.
|
|
369
|
+
|
|
370
|
+
⚠️ **Checagem de duplicidade (antes de cada dispatch).** Rode
|
|
371
|
+
`bash "$SKILL_DIR/../../scripts/vetor-status.sh"` e cruze as issues do grupo candidato contra as
|
|
372
|
+
já reportadas como em andamento (`Iteration: N/5 (Issue #<M>)`) em status files ativos (`RUNNING`,
|
|
373
|
+
`BLOCKED_WAITING`, ou `GREEN` ainda não mergeado). Se qualquer issue do grupo já aparecer em um
|
|
374
|
+
worktree ativo: alerte (`⚠️ Issue #<M> já está em andamento no worktree/branch <outra-branch> —
|
|
375
|
+
pulando dispatch duplicado`) e **pule** o dispatch desse grupo.
|
|
376
|
+
|
|
377
|
+
**Antes de invocar `Agent()`, o coordenador DEVE criar o status file** (path da Fase 3) com
|
|
378
|
+
`Status: RUNNING` — o sandbox de isolamento pode impedir o worker de criar arquivo fora do worktree.
|
|
379
|
+
Exemplo: `echo -e "# Agent Status - <branch>\nStatus: RUNNING\nIteration: 1/5 (Issue #<M>)" > <path>`.
|
|
380
|
+
|
|
381
|
+
```javascript
|
|
382
|
+
Agent({
|
|
383
|
+
description: "Grupo Lead #<N>: <título>",
|
|
384
|
+
prompt: "...",
|
|
385
|
+
subagent_type: "vetor:issue-worker",
|
|
386
|
+
model: "<haiku|sonnet>",
|
|
387
|
+
isolation: "worktree",
|
|
388
|
+
run_in_background: true
|
|
389
|
+
})
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**Escolha do `model`:** `haiku` se todas as issues do grupo forem `chore` ou `fix` simples; `sonnet`
|
|
393
|
+
se houver `feat`, `refactor` ou mais de 2 issues complementares. Se esgotar iterações, redespache
|
|
394
|
+
uma vez com `sonnet`.
|
|
395
|
+
|
|
396
|
+
⚠️ **`isolation: "worktree"` é só para dispatch inicial (worktree ainda não existe).** Se o worktree
|
|
397
|
+
já existe — retomada de sessão, redespacho após `BLOCKED_WAITING` ou após `FAILED_MAX_ITERATIONS`, ou
|
|
398
|
+
recuperação de um worker travado em plan mode (sintoma: status parado em `RUNNING`, sem iteração nova
|
|
399
|
+
nem commit — descarte a sessão travada) — **NÃO use `vetor:issue-worker`**: ele força worktree novo
|
|
400
|
+
via frontmatter. Despache um subagente padrão sem `subagent_type`, instruindo-o com a skill
|
|
401
|
+
`fix-loop-agent` no prompt e um `cd` explícito para o path real do worktree (via `git worktree list`):
|
|
402
|
+
|
|
403
|
+
```javascript
|
|
404
|
+
Agent({
|
|
405
|
+
description: "Grupo Lead #<N>: <título> (Resumo)",
|
|
406
|
+
prompt: "Entre no diretório <path> e retome o trabalho usando a skill fix-loop-agent...",
|
|
407
|
+
model: "<haiku|sonnet>",
|
|
408
|
+
run_in_background: true
|
|
409
|
+
})
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
⚠️ **Colisão de migrations paralelas.** Workers paralelos **dentro da mesma onda** que tocam módulos
|
|
413
|
+
com versionamento sequencial de arquivos (ex.: Flyway `V<N>__*.sql`) podem gerar colisões invisíveis
|
|
414
|
+
ao git. A rede de segurança é o merge serializado (Fase 6) somado à checagem 2.b do `worktree-ship`.
|
|
415
|
+
Já a colisão **entre ondas** (grupo de `O_2` sem visibilidade das migrations de `O_1`) é o problema
|
|
416
|
+
que as Ondas de Despacho (Fase 1) previnem estruturalmente, ao só liberar `O_2` depois do merge e
|
|
417
|
+
sincronismo do branch default com `O_1`.
|
|
418
|
+
|
|
419
|
+
**Nota (Antigravity):** o `issue-worker` também é registrado via `agents/issue-worker/agent.json`
|
|
420
|
+
(`customAgentSpec`). Como define `tools:` explicitamente, **não** herda MCP do contexto pai — se um
|
|
421
|
+
worker precisar de MCP, adicione-o à lista.
|
|
422
|
+
|
|
423
|
+
**Prompt de execução sequencial para o worker:**
|
|
424
|
+
1. **Lead Issue:** #<N> (título, descrição, critérios de aceite).
|
|
425
|
+
2. **Issues Sequenciais:** #<M1>, #<M2> (idem).
|
|
426
|
+
3. **Branch:** `<type>/<issue#>-<slug>` — criar como primeiro passo no worktree.
|
|
427
|
+
4. **Status File Path:** o path absoluto da Fase 3, atualizado a cada iteração de cada issue
|
|
428
|
+
(ex.: `Iteration: 2/5 (Issue #<M1>)`). Instrua o worker explicitamente:
|
|
429
|
+
> Escreva o status file no path absoluto `<status-file-path>`. Se a plataforma rejeitar com
|
|
430
|
+
> mensagem como *"Edit the worktree copy..."* ou qualquer bloqueio de escrita fora do worktree,
|
|
431
|
+
> salve também uma cópia dentro do worktree em `.claude/vetor-status.md`. Se apenas a cópia local
|
|
432
|
+
> foi gravada, sinalize no chat.
|
|
433
|
+
5. **Sincronização com origin (obrigatória a partir de `O_2`).** Se este dispatch pertence a uma
|
|
434
|
+
onda `O_{i+1}` posterior à primeira, inclua no prompt, como **primeiro passo padrão logo após o
|
|
435
|
+
`git checkout -b`** — não como recuperação ad-hoc descoberta pelo próprio worker (issue #244):
|
|
436
|
+
> Antes de investigar o escopo da issue, rode `git fetch origin $DEFAULT_BRANCH` e compare com o
|
|
437
|
+
> seu HEAD (`git log origin/$DEFAULT_BRANCH -1` vs `git log HEAD -1`). Se o seu worktree nasceu
|
|
438
|
+
> de um commit anterior aos merges das ondas anteriores, sincronize agora (`git merge
|
|
439
|
+
> origin/$DEFAULT_BRANCH` ou `git rebase origin/$DEFAULT_BRANCH`) antes de procurar qualquer
|
|
440
|
+
> arquivo — issues desta onda podem depender de arquivos criados por PRs de ondas já mergeadas.
|
|
441
|
+
Isso vale mesmo que o coordinator já tenha checado a sincronia do root na Transição de onda: o
|
|
442
|
+
worktree é criado a partir do HEAD local do root no momento do dispatch (`isolation: "worktree"`
|
|
443
|
+
é controlado pelo harness, não pelo coordinator — não há como forçar a criação diretamente a
|
|
444
|
+
partir de `origin/$DEFAULT_BRANCH`), então essa instrução no prompt do worker é a rede de
|
|
445
|
+
segurança que não depende do root ter avançado a tempo.
|
|
446
|
+
|
|
447
|
+
Ao concluir todas as issues com sucesso, o worker marca `GREEN`. Se falhar em alguma, para e marca
|
|
448
|
+
`FAILED_MAX_ITERATIONS` especificando qual issue falhou.
|
|
449
|
+
|
|
450
|
+
### 5 — Monitoramento
|
|
451
|
+
|
|
452
|
+
**5.a — Tabela de status**
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
bash "$SKILL_DIR/../../scripts/vetor-status.sh"
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
O script lê `.claude/vetor/status/*.md`, cruza com `git worktree list` (worktree removido
|
|
459
|
+
manualmente → `cancelled (worktree removed)`; não recrie) e com `gh pr list --state all`, e imprime
|
|
460
|
+
a tabela. Reproduza-a no chat acrescentando os grupos `QUEUED`, e adicione a coluna `Onda` (Fase 1)
|
|
461
|
+
a cada linha — o script não conhece o DAG, então essa coluna vem do plano da Fase 2 mantido em
|
|
462
|
+
memória pelo coordinator. Grupos `QUEUED` de uma onda posterior aparecem como
|
|
463
|
+
`QUEUED (aguardando O_i)` para deixar explícita a razão de não terem sido despachados mesmo havendo
|
|
464
|
+
vaga no teto `N`.
|
|
465
|
+
|
|
466
|
+
⚠️ **Fallback de leitura.** Se o status file no path absoluto não existir ou estiver desatualizado
|
|
467
|
+
para um worktree ativo, leia `<path-do-worktree>/.claude/vetor-status.md` (path via
|
|
468
|
+
`git worktree list`).
|
|
469
|
+
|
|
470
|
+
⚠️ **Workers duplicados.** Extraia o número de issue de cada `Iteration: N/5 (Issue #<M>)` dos status
|
|
471
|
+
files ativos e cruze-os. Se a mesma issue aparecer em mais de um worktree ativo, sinalize:
|
|
472
|
+
`⚠️ Issue #<M> em andamento simultaneamente em <slug-A> e <slug-B> — possível dispatch duplicado` e
|
|
473
|
+
avalie com o usuário qual worker continua.
|
|
474
|
+
|
|
475
|
+
**5.b — Escalação de bloqueios**
|
|
476
|
+
|
|
477
|
+
**A fonte de verdade da escalação é o status file.** Se um worker sinalizar bloqueio apenas por
|
|
478
|
+
chat, **não escale ainda**: instrua-o via `SendMessage` a gravar o `BLOCKED_WAITING` estruturado
|
|
479
|
+
(`Blocked on` / `Options` / `Recommendation`) primeiro, para que o estado sobreviva a um reinício.
|
|
480
|
+
|
|
481
|
+
**Em `--headless`: não escale.** Registre no relatório final o agente (`<slug>` / Issue `#<N>`), o
|
|
482
|
+
motivo do bloqueio e a recomendação do worker. Não conceda permissão, não escolha opção técnica e
|
|
483
|
+
não redespache. Nunca mate um worker bloqueado para abrir vaga no teto `N`.
|
|
484
|
+
|
|
485
|
+
Fora do headless, leia o bloco `Blocked on` / `Options` / `Recommendation` e escale via
|
|
486
|
+
`AskUserQuestion`, identificando o agente e transmitindo a recomendação. Opções conforme o tipo:
|
|
487
|
+
- **Permissão bloqueada** (`<comando>`): permitir esta vez / permitir para este agente (auto-aprova
|
|
488
|
+
chamadas similares dele) / negar (registra "skipped") / parar agente.
|
|
489
|
+
- **Decisão técnica**: as opções do bloco `Options`.
|
|
490
|
+
|
|
491
|
+
Comunique a decisão ao sub-agente via `SendMessage`. Se a resposta exigir redespachar em worktree
|
|
492
|
+
existente, siga a nota de redispatch da Fase 4.
|
|
493
|
+
|
|
494
|
+
**5.c — Circuit Breaker**
|
|
495
|
+
|
|
496
|
+
Se 2 ou mais agentes falharem com `FAILED_MAX_ITERATIONS` apresentando assinaturas de erro idênticas
|
|
497
|
+
(ex.: falha de rede do gerenciador de pacotes, erro de linkagem global), acione o circuit breaker:
|
|
498
|
+
pause os subagentes ativos e pergunte:
|
|
499
|
+
`⚠️ Circuit Breaker acionado devido a falhas recorrentes com erro similar. Deseja pausar para investigar ou prosseguir mesmo assim?`
|
|
500
|
+
|
|
501
|
+
**Em `--headless`: não pergunte — sempre pause.** Pare de despachar `QUEUED`, deixe os ativos
|
|
502
|
+
terminarem e vá para o relatório destacando a assinatura de erro comum.
|
|
503
|
+
|
|
504
|
+
### 6 — Fase de merge (serializada)
|
|
505
|
+
|
|
506
|
+
⚠️ **Serializada** — um merge por vez. ⚠️ **Em `--headless` esta fase inteira é pulada**: liste os
|
|
507
|
+
grupos `GREEN` no relatório final com branch e path do worktree, e encerre.
|
|
508
|
+
|
|
509
|
+
Quando um agente atingir `GREEN`:
|
|
510
|
+
|
|
511
|
+
1. Verifique que o worker está de fato verde (leia o status file).
|
|
512
|
+
2. `/vetor:worktree-ship` aborta se o `cwd` não for um worktree, e o contexto do coordinator é o root
|
|
513
|
+
do repo. Entre no worktree antes de invocar:
|
|
514
|
+
```bash
|
|
515
|
+
git worktree list # localize a linha cuja branch é a do grupo (Fase 3)
|
|
516
|
+
cd <path-do-worktree-do-grupo>
|
|
517
|
+
```
|
|
518
|
+
Só então:
|
|
519
|
+
```
|
|
520
|
+
/vetor:worktree-ship <issue#>
|
|
521
|
+
```
|
|
522
|
+
3. Após merge bem-sucedido, atualize a tabela.
|
|
523
|
+
|
|
524
|
+
Se `worktree-ship` falhar (CI vermelho, review required), marque na tabela e continue com os outros.
|
|
525
|
+
|
|
526
|
+
### 7 — Relatório final
|
|
527
|
+
|
|
528
|
+
**Antes do relatório, volte ao root e sincronize.** A Fase 6 faz `cd` para dentro do worktree de
|
|
529
|
+
cada grupo; sem um retorno explícito, a sessão termina com o git preso na branch de um worktree —
|
|
530
|
+
possivelmente já mergeada e obsoleta.
|
|
531
|
+
|
|
532
|
+
```bash
|
|
533
|
+
cd "$(git worktree list | head -1 | awk '{print $1}')" # a 1ª linha é sempre o root
|
|
534
|
+
bash "$SKILL_DIR/../../scripts/vetor-checks.sh" sync-root
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
`sync-root` só troca de branch se a atual estiver limpa e já mesclada em `origin/<default>`. Se
|
|
538
|
+
imprimir `AVISO`, **não force**: reporte a pendência no relatório em vez de descartar trabalho.
|
|
539
|
+
|
|
540
|
+
Após todos os agentes terminarem (ou timeout de 90 minutos):
|
|
541
|
+
|
|
542
|
+
```
|
|
543
|
+
## Coordinator Report
|
|
544
|
+
|
|
545
|
+
| Issue | Resultado | PR | Detalhes |
|
|
546
|
+
|-------|----------|-----|----------|
|
|
547
|
+
| #42 | ✅ Merged | #87 | squash merged |
|
|
548
|
+
| #43 | ❌ CI failed | #88 | 3 fix attempts, worktree preserved |
|
|
549
|
+
| #44 | ⏸️ Review required | #89 | awaiting human review |
|
|
550
|
+
| #45 | ⏭️ SKIPPED (aguardando Spec) | — | gate de Spec/design, Fase 2 — usuário optou por gerar a Spec antes |
|
|
551
|
+
|
|
552
|
+
Resumo: <N> merged, <M> falharam, <K> aguardando review, <J> aguardando Spec.
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
**Em `--headless`, o relatório é a única saída da execução** — acrescente:
|
|
556
|
+
- O plano de dispatch da Fase 2 (apenas registrado, não aprovado).
|
|
557
|
+
- Para cada issue `não-trivial` sem Spec associada (gate de Spec/design, Fase 2): sinalizada, nunca
|
|
558
|
+
bloqueada — mesma marca `⚠️ sem Spec associada` da coluna "Ação" do plano.
|
|
559
|
+
- O teto `N` usado e como foi calculado.
|
|
560
|
+
- Para cada `GREEN`: branch e path do worktree, marcados como **prontos para ship**.
|
|
561
|
+
- Para cada `BLOCKED_WAITING`: o bloqueio e a recomendação do worker.
|
|
562
|
+
- Se o circuit breaker disparou: a assinatura de erro comum e os grupos não despachados.
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## Orçamentos e hard caps
|
|
567
|
+
|
|
568
|
+
- **fix-loop-agent:** 5 iterações é **orçamento sugerido**, não hard cap enforced — nada no hook
|
|
569
|
+
interrompe o agente automaticamente (issue #156). Ao atingir a 5ª iteração sem verde, o agente
|
|
570
|
+
deve registrar `BLOCKED_WAITING` (não decidir sozinho continuar) e escalar ao coordinator via os
|
|
571
|
+
blocos `Blocked on`/`Options`/`Recommendation` do status file, em vez de estourar para 6+.
|
|
572
|
+
- **worktree-ship:** máximo 3 tentativas de fix de CI
|
|
573
|
+
- **Coordinator:** timeout global de 90 minutos (este sim, hard cap real)
|
|
574
|
+
- Agentes em `BLOCKED_WAITING` não consomem iterações do fix-loop
|
|
575
|
+
- `vetor-status.sh` destaca com `⚠️` na tabela qualquer `Iteration: N/5` com `N` acima do orçamento —
|
|
576
|
+
sinal de que o agente não escalou como deveria; trate como candidato a redispatch/intervenção.
|
|
577
|
+
|
|
578
|
+
O teto de workers simultâneos **não é um hard cap**: é o valor `N` decidido pelo usuário na Fase 2
|
|
579
|
+
(default recomendado `maxConcurrentWorkers` de `.claude/vetor/config.json`, senão 5).
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
## Restrições
|
|
584
|
+
|
|
585
|
+
- `worktree-create` e fase de merge são **sempre serializados**
|
|
586
|
+
- Fonte de verdade para status: status files (`.claude/vetor/status/`) + `gh pr list` + `gh pr checks`
|
|
587
|
+
- Nunca chama `EnterWorktree`/`ExitWorktree` por sub-agentes
|
|
588
|
+
- Se interrompido, reconstrói estado com `vetor-status.sh` + `gh pr list` — não depende de memória
|
|
589
|
+
- Ao fim de toda sessão (Fase 7), o root fica na branch principal e sincronizado — nunca preso numa
|
|
590
|
+
branch de worktree de grupo
|
|
591
|
+
- Em `--headless`: nunca chama `AskUserQuestion` nem `ExitPlanMode`, nunca faz merge/ship, nunca
|
|
592
|
+
auto-aprova permissão. Se o contexto exigir uma decisão que o headless não pode tomar, registre no
|
|
593
|
+
relatório e pare — não improvise
|
|
594
|
+
- O gate de Spec/design (Fase 2) nunca bloqueia o dispatch em `--headless` — vira sinalização
|
|
595
|
+
registrada no plano/relatório, nunca um `AskUserQuestion` síncrono (mesmo motivo do item acima:
|
|
596
|
+
deadlock por falta de interlocutor, issue #121)
|