atlas-workflow 0.8.3 → 0.9.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 +6 -3
- package/VERSION +1 -1
- package/build/bump-version.mjs +41 -2
- package/build/cli/atlas-init.mjs +82 -7
- package/hosts/opencode/.opencode/atlas/VERSION +1 -1
- package/hosts/opencode/.opencode/atlas/orchestrator/README.md +2 -2
- package/hosts/opencode/.opencode/atlas/orchestrator/references/host-adapters.md +13 -12
- package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -53
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/README.md +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/server.js +40 -6
- package/hosts/opencode/.opencode/skills/atlas-workflow-orchestrator/SKILL.md +24 -53
- package/hosts/pi/atlas/VERSION +1 -1
- package/hosts/pi/atlas/orchestrator/README.md +2 -2
- package/hosts/pi/atlas/orchestrator/references/host-adapters.md +13 -12
- package/hosts/pi/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -53
- package/hosts/pi/atlas/packages/mcp-server/README.md +1 -1
- package/hosts/pi/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/pi/atlas/packages/mcp-server/server.js +40 -6
- package/hosts/pi/skills/atlas-workflow-orchestrator/SKILL.md +24 -53
- package/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/.codex-plugin/plugin.json +1 -1
- package/plugins/atlas-workflow-orchestrator/VERSION +1 -1
- package/plugins/atlas-workflow-orchestrator/agents/atlas-direct-execute.md +1 -1
- package/plugins/atlas-workflow-orchestrator/agents/atlas-plan-execute.md +1 -1
- package/plugins/atlas-workflow-orchestrator/orchestrator/README.md +2 -2
- package/plugins/atlas-workflow-orchestrator/orchestrator/references/host-adapters.md +13 -12
- package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -53
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/server.js +40 -6
- package/plugins/atlas-workflow-orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -53
|
@@ -266,6 +266,25 @@ const HOST_ADAPTERS = {
|
|
|
266
266
|
// Fail-closed — só passam se o caller reportar disponibilidade real (não otimismo do perfil).
|
|
267
267
|
prereq_policy: 'must_report',
|
|
268
268
|
},
|
|
269
|
+
antigravity: {
|
|
270
|
+
label: 'Antigravity',
|
|
271
|
+
subagent_dispatch: {
|
|
272
|
+
mechanism: 'define_subagent(name, system_prompt) + invoke_subagent(Subagents)',
|
|
273
|
+
example: 'define_subagent(name: "atlas-task-validator", system_prompt: "<SKILL_MD>") e invoke_subagent(Subagents: [{TypeName: "atlas-task-validator", Role: "Validator", Prompt: "<state_path>"}])',
|
|
274
|
+
registration: 'Mapeamento de skills e agents via define_subagent dinâmico',
|
|
275
|
+
},
|
|
276
|
+
validator_dispatch: {
|
|
277
|
+
dispatcher: 'orchestrator',
|
|
278
|
+
join: {
|
|
279
|
+
sync: 'self_evident',
|
|
280
|
+
confidence: 'high',
|
|
281
|
+
mechanism: 'invoke_subagent bloqueante por design do host',
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
todo_tool: null,
|
|
285
|
+
hooks: { supported: false, mechanism: null },
|
|
286
|
+
capabilities_flags: { subagent_available: true, mcp_available: true, todo_available: false },
|
|
287
|
+
},
|
|
269
288
|
generic: {
|
|
270
289
|
label: 'Host genérico',
|
|
271
290
|
subagent_dispatch: {
|
|
@@ -523,7 +542,15 @@ function parseWorkflowConfig() {
|
|
|
523
542
|
|
|
524
543
|
function consumerRoot(args = {}) {
|
|
525
544
|
const explicitRoot = optionalString(args, 'project_root');
|
|
526
|
-
|
|
545
|
+
if (explicitRoot && explicitRoot.trim() !== '') {
|
|
546
|
+
return path.resolve(explicitRoot);
|
|
547
|
+
}
|
|
548
|
+
const cwd = process.cwd();
|
|
549
|
+
if (cwd === '/' || cwd === '/var/folders') {
|
|
550
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
551
|
+
if (home) return path.resolve(home);
|
|
552
|
+
}
|
|
553
|
+
return path.resolve(cwd);
|
|
527
554
|
}
|
|
528
555
|
|
|
529
556
|
function runRoot(args = {}) {
|
|
@@ -613,8 +640,12 @@ function redact(value) {
|
|
|
613
640
|
}
|
|
614
641
|
|
|
615
642
|
function logCall(entry, args = {}) {
|
|
616
|
-
|
|
617
|
-
|
|
643
|
+
try {
|
|
644
|
+
const line = JSON.stringify({ timestamp: nowIso(), ...entry }) + '\n';
|
|
645
|
+
fs.appendFileSync(path.join(ensureRunDir(args), 'mcp.log'), line, { mode: 0o600 });
|
|
646
|
+
} catch (error) {
|
|
647
|
+
// Ignora silenciosamente falhas de gravação de log (ex: diretório somente-leitura)
|
|
648
|
+
}
|
|
618
649
|
}
|
|
619
650
|
|
|
620
651
|
function rpcError(code, message, data) {
|
|
@@ -3018,11 +3049,14 @@ function assertAfterPlan(args = {}) {
|
|
|
3018
3049
|
}
|
|
3019
3050
|
|
|
3020
3051
|
function toolResult(value) {
|
|
3052
|
+
// JSON compacto (sem indentação): o consumidor é o LLM orquestrador, que parseia
|
|
3053
|
+
// igual com ou sem whitespace. Pretty-print só gastava tokens em toda resposta MCP
|
|
3054
|
+
// (~10-13 por run). Mesmos campos/valores — zero impacto em determinismo/contrato.
|
|
3021
3055
|
return {
|
|
3022
3056
|
content: [
|
|
3023
3057
|
{
|
|
3024
3058
|
type: 'text',
|
|
3025
|
-
text: JSON.stringify(value
|
|
3059
|
+
text: JSON.stringify(value),
|
|
3026
3060
|
},
|
|
3027
3061
|
],
|
|
3028
3062
|
};
|
|
@@ -3320,9 +3354,9 @@ function startStdioLoop() {
|
|
|
3320
3354
|
send({
|
|
3321
3355
|
id: message.id,
|
|
3322
3356
|
error: {
|
|
3323
|
-
code: error.code
|
|
3357
|
+
code: Number.isInteger(error.code) ? error.code : -32603,
|
|
3324
3358
|
message: error.message,
|
|
3325
|
-
data: error.data,
|
|
3359
|
+
data: error.data || { original_code: error.code },
|
|
3326
3360
|
},
|
|
3327
3361
|
});
|
|
3328
3362
|
}
|
|
@@ -8,7 +8,7 @@ category: Development Automation
|
|
|
8
8
|
|
|
9
9
|
Orquestra pipelines de desenvolvimento de features no projeto Atlas, automatizando a sequência de skills sob demanda com um único comando.
|
|
10
10
|
|
|
11
|
-
> **
|
|
11
|
+
> **MCP é fonte obrigatória de status.** Cada gate é consultado via MCP antes de avançar (tools por fase na Fase 0 e nos fluxos). Sem resposta MCP, sem resultado exigido ou status bloqueante → workflow abortado, sem fallback narrativo. Edge cases de ambiente (conflito plugin/nativo, MCP indisponível, estado corrompido, lock conflict, drift de versão) bloqueiam com causa, impacto e próxima ação segura.
|
|
12
12
|
|
|
13
13
|
## Sintaxe
|
|
14
14
|
|
|
@@ -124,33 +124,24 @@ A única interação legítima com o usuário é **dentro de uma fase** — o `A
|
|
|
124
124
|
|
|
125
125
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
126
|
|
|
127
|
-
O orquestrador **coordena a execução**, não implementa código
|
|
127
|
+
O orquestrador **coordena a execução**, não implementa código — maestro que aponta cada sub-agent na ordem e espera terminar, **nunca pega o instrumento de código**. A fronteira de determinismo é a **mutação de código** (PRD D10), com **duas fases**:
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
- **ANTES do plano validado — autoria documental livre no fio principal.** Pode autorar PRD, entrevistar e escrever `PLAN_*.md` direto; fases documentais não exigem sub-agent (documento não muta o produto). **Ao finalizar um PRD inline, estampar `| Status | Aprovado para implementação |`** — é o `required_status` do gate TC; sem isso o PRD sai `Draft` e trava o TC em rodadas de correção.
|
|
130
|
+
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** Não edita mais PRD/plano/código nem roda comando mutante; só coordena (despachar sub-agent, ler artefato pra verificar gate, ecoar banner, montar output).
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** A partir daí o orquestrador **NÃO** edita PRD/plano, **NÃO** edita código, **NÃO** roda comando mutante. Só **coordena a execução**: despachar sub-agent, ler artefato para verificar gate, ecoar banner, montar o output final.
|
|
133
|
-
- **Execução de código é SEMPRE gateada — nunca afrouxa.** Toda mutação de código vive obrigatoriamente em sub-agent `plan_execute` (blocking, um por vez) + validador frio `task_validator` (PRD D10). O orquestrador **nunca escreve código**, em nenhuma fase, em nenhum modo. Isto não muda com a autoria documental livre acima.
|
|
134
|
-
|
|
135
|
-
- **Permitido:** parse de args; classificar input; autorar PRD/entrevista/`PLAN_*.md` **enquanto o plano não foi validado**; despachar sub-agent (blocking, um por vez); ler artefato em disco para verificar gate; ecoar banner; montar o output final.
|
|
136
|
-
- **Proibido (Gate G9):** escrever/editar **código**; rodar comando mutante (`flutter`, `test`, `git add/commit`); editar PRD/plano **depois** do plano validado; implementar "em paralelo"; usar `run_in_background` para fases do pipeline.
|
|
137
|
-
- **Dispatch blocking:** despacha → **espera o retorno** → verifica gate → próxima fase. Nunca dois sub-agents simultâneos. Nunca trabalhar enquanto um sub-agent roda.
|
|
132
|
+
Execução de código é **sempre** sub-agent `plan_execute` (blocking, um por vez) + validador frio `task_validator` (Gate G9/G7 — detalhe na tabela de gates). Dispatch blocking: despacha → espera retorno → verifica gate → próxima fase. Nunca dois sub-agents simultâneos.
|
|
138
133
|
|
|
139
134
|
### Verbo de dispatch é host-agnóstico (não assuma "Agent tool")
|
|
140
135
|
|
|
141
|
-
O **mecanismo**
|
|
136
|
+
O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example` e `validator_dispatch` de `atlas_capabilities` (fonte de verdade em runtime) e use o **verbo nativo**. Não hardcode o verbo do Claude. Mapeamento ilustrativo, onde `<exec>` é o id da fase (`plan-execute`/`direct-execute`/`slice-review`/`task-validator`):
|
|
142
137
|
|
|
143
138
|
- **claude:** `Agent(subagent_type: "atlas-<exec>", prompt: ...)`
|
|
144
|
-
- **codex:** `spawn_agent(agent_type: "atlas-<exec>", items: [{ type: "text", text: "<state_path ou task>" }])`
|
|
139
|
+
- **codex:** `spawn_agent(agent_type: "atlas-<exec>", items: [{ type: "text", text: "<state_path ou task>" }])` (custom agent nativo em `CODEX_HOME/agents/atlas-<exec>.toml`; `.codex/agents/` do bundle é gerado). `$atlas-*` sozinho **não** isola contexto — use `spawn_agent`.
|
|
145
140
|
- **opencode:** `@atlas-<exec>` (ou auto por description)
|
|
146
141
|
- **pi:** `subagent({ agent: "atlas-<exec>", task, context: "fresh" })`
|
|
147
142
|
- **generic:** subagente nativo do host
|
|
148
143
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
> **Rodar a mutação de código no fio principal é violação do Gate G9 — em QUALQUER host.** Ausência da "Agent tool" (porque o host não é Claude) **não** é licença para executar inline: é sinal de que você deve usar o **verbo de dispatch daquele host**. No Codex, `$atlas-*` sozinho não isola contexto; use `spawn_agent`. Se o host não expõe nenhum mecanismo de sub-agent (preflight `subagent_available:false`), o gate PREREQ já abortou em `ready` — você nunca chega aqui sem isolamento.
|
|
152
|
-
|
|
153
|
-
Se você (orquestrador) está prestes a editar **código**, **pare**: esse trabalho é do sub-agent de execução. Despache-o (verbo nativo do host) e espere. (Autoria de PRD/plano antes da validação é a única autoria permitida no fio principal.)
|
|
144
|
+
> Ausência de "Agent tool" (host ≠ Claude) **não** é licença pra executar inline — é sinal pra usar o verbo daquele host (Gate G9, qualquer host). Host sem mecanismo de sub-agent já abortou em PREREQ; você nunca chega aqui sem isolamento.
|
|
154
145
|
|
|
155
146
|
## Protocolo de banner (única comunicação de progresso)
|
|
156
147
|
|
|
@@ -189,6 +180,10 @@ Regras inegociáveis. Violação = parar, não contornar.
|
|
|
189
180
|
|
|
190
181
|
## Fluxo de execução
|
|
191
182
|
|
|
183
|
+
### [EXEC] — passo comum de execução + validação (idêntico em `full`/`direct`/`execute`)
|
|
184
|
+
|
|
185
|
+
`atlas_lock_dispatch(action=start, phase=plan_execute)`; despachar `plan_execute` como sub-agent blocking (lê `PLAN_*.md` em `full`/`execute`, PRD em `direct`). O executor emite checkpoints G12; sem retorno/progresso, chamar `atlas_lock_dispatch(action=status, phase=plan_execute)` e tratar `executor_bootstrap_timeout`/`executor_progress_timeout` como `stalled`/retry — nunca como execução em andamento. O executor retorna `validator_handoff_required` com `state_path`; o MCP só abre o slot após o checkpoint `state_path_created` para esse mesmo `state_path`. Validação sempre **sibling**: `atlas_lock_validator(action=start)`, despachar **um** `task_validator`, exigir no output o `dispatch_token` do slot e fechar com `validator_run_id` + `dispatch_token`. Em `fail`: `repair_start`, despachar `atlas-findings-repair` com `{state_path, findings, validator_attempt, repair_run_id, repair_budget: 1}`, exigir atualização do mesmo `state_path`, fechar com `repair_run_id` e rodar o **2º e último** validator. `passed`/`passed_with_observations` são terminais aprovados; status diferente bloqueia review e output completed.
|
|
186
|
+
|
|
192
187
|
### Full mode
|
|
193
188
|
|
|
194
189
|
Artefatos esperados (em ordem): `PRD_*.md` → (`PRD_*.md` atualizado) → `PLAN_*.md` → diff de código → relatório do validador.
|
|
@@ -200,7 +195,7 @@ Artefatos esperados (em ordem): `PRD_*.md` → (`PRD_*.md` atualizado) → `PLAN
|
|
|
200
195
|
5. **Plan** — `atlas_lock_dispatch(action=start, phase=plan_handoff)`, carregar/invocar `plan_handoff` no fio principal para redigir `PLAN_*.md`, depois chamar `atlas_verify_artifact` e `atlas_verify_template_conformance(artifact_type=plan)`. Concluir a fase com `atlas_lock_dispatch(action=complete, phase=plan_handoff)`. **Nenhuma linha de código pode ter sido escrita até aqui.**
|
|
201
196
|
- **G11:** se `PLAN_*.md` foi validado, chamar `atlas_assert_after_plan`. Se a próxima ação não for `dispatch_plan_execute_blocking`, abortar.
|
|
202
197
|
6. **Validate plan** — se há gaps → dispara entrevista, propaga e continua (ver "Decisão em aberto ≠ parada"). Não para pra pedir permissão.
|
|
203
|
-
7. **Execute** —
|
|
198
|
+
7. **Execute** — rodar o passo **[EXEC]** (lê `PLAN_*.md`).
|
|
204
199
|
8. **Review (condicional)** — somente após execução concluída e se `--review` → `atlas_lock_dispatch(action=start, phase=slice_review)`, despachar `slice_review`, depois `atlas_lock_dispatch(action=complete, phase=slice_review)`.
|
|
205
200
|
9. **Output** — ledger verificado com fonte MCP por gate/fase (ver "Output") + próximos passos.
|
|
206
201
|
|
|
@@ -210,7 +205,7 @@ Artefatos esperados: `PRD_*.md` → (atualizado) → diff de código → relató
|
|
|
210
205
|
|
|
211
206
|
1. Parse / Generate PRD (se necessário) + `atlas_verify_artifact`.
|
|
212
207
|
2. Validate PRD → `atlas_scan_prd` + `atlas_verify_template_conformance`; entrevista condicional reexecuta os gates.
|
|
213
|
-
3. **Execute** —
|
|
208
|
+
3. **Execute** — rodar o passo **[EXEC]** (executor lê o PRD; sem `PLAN_*.md`).
|
|
214
209
|
4. Review (condicional) — só após executor retornar 100% e dispatch MCP permitir.
|
|
215
210
|
5. Output (ledger verificado).
|
|
216
211
|
|
|
@@ -222,7 +217,7 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
222
217
|
|
|
223
218
|
1. **Parse / classify** — `atlas_ping` → `atlas_capabilities` → **`atlas_classify_input`** no input (PRD D3/D6: o tipo é fato e precisa ser conhecido antes de travar o modo) → **`atlas_preflight(<modo efetivo>)`** (PREREQ hard-fail intacto). A classificação determina o tipo: se for plano, o modo efetivo é `execute` e o preflight trava `execute`; se o input não for plano, auto-rotear (ver Fase 0, passo 2b) e o preflight trava o modo roteado. **`classify_input` sempre precede `preflight`** (o preflight trava o modo efetivo, não o pedido).
|
|
224
219
|
2. **Reverificar o plano na entrada** — `atlas_verify_artifact` no `PLAN_*.md` (G1) + `atlas_verify_template_conformance(artifact_type=plan)` (TC). Plano velho/manual/inválido **trava aqui** com `next_action` em linguagem de produto (PRD D11 — "autoria é livre, execução é gateada"). Sem reverificação válida não há dispatch.
|
|
225
|
-
3. **Executar** —
|
|
220
|
+
3. **Executar** — rodar o passo **[EXEC]** (lê `PLAN_*.md`). `plan_execute` é aceito como **primeira fase** em `execute` (sem fase nova; PRD D13).
|
|
226
221
|
4. **Review (condicional)** — só após execução concluída e se `--review` → `atlas_lock_dispatch(action=start, phase=slice_review)`, despachar `slice_review`, depois `complete`.
|
|
227
222
|
5. **Output** — ledger verificado; `guarantee_level` = `full_pipeline` (PRD D12).
|
|
228
223
|
|
|
@@ -239,15 +234,7 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
239
234
|
|
|
240
235
|
## Validação automática de PRD
|
|
241
236
|
|
|
242
|
-
O scan é **determinístico
|
|
243
|
-
|
|
244
|
-
- **§1 Contexto e objetivo:** `TBD`, `a confirmar`, `talvez`, `não definido`
|
|
245
|
-
- **§2 Escopo:** `pode ser`, `depende de`, `ainda não`, `incompleto`
|
|
246
|
-
- **§3 Decisões:** vazio/conteúdo mínimo, `vago`
|
|
247
|
-
- **§4 Fluxos e cenários UX:** `a definir`, `gap`, `depende de`
|
|
248
|
-
- **§5 Contrato funcional e invariantes:** `ainda não definido`, `mock apenas`, `a confirmar`
|
|
249
|
-
|
|
250
|
-
Antes de contar bloqueantes, aplicar exclusões estreitas do config (`exclude_if_line_contains`, hoje `depende de plano`) para frases de sucesso/resultado que descrevem dependência operacional já planejada. Não usar julgamento livre: a exclusão precisa estar no config e ser logada.
|
|
237
|
+
O scan é **determinístico** e roda **dentro do MCP** (`atlas_scan_prd`): a lista canônica de padrões §1-§5 e as exclusões de config (`exclude_if_line_contains`) são embutidas e mantidas no servidor — o orquestrador **não** reaplica padrões por conta própria, só consome o resultado. Não usar julgamento livre.
|
|
251
238
|
|
|
252
239
|
**Threshold = 1.** Se ≥ 1 padrão bloqueante → o orquestrador invoca `atlas-prd-interview` no fio principal. **Gate G5:** se 0 padrões bloqueantes, registrar `Ambiguity scan: 0 padrões bloqueantes — entrevista pulada` no output. Não há decisão subjetiva de "tenho certeza, pulo".
|
|
253
240
|
|
|
@@ -255,16 +242,16 @@ Antes de contar bloqueantes, aplicar exclusões estreitas do config (`exclude_if
|
|
|
255
242
|
|
|
256
243
|
## Decisão em aberto ≠ parada
|
|
257
244
|
|
|
258
|
-
|
|
245
|
+
Detalhe do caminho que a "Princípio de continuação automática" exige para decisão pendente de **qualquer fonte** (scan/entrevista/validação de plano/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — a fonte não muda o tratamento):
|
|
259
246
|
|
|
260
|
-
|
|
247
|
+
1. **Garantir o PRD primeiro.** Em `full`/`direct`, se o PRD não existe, **gerar o PRD draft** com as decisões marcadas. A entrevista é **PRD-scoped**: roda **sobre** o PRD, nunca antes. Detectar decisão não antecipa nem pula a geração do PRD.
|
|
248
|
+
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve via `AskUserQuestion` (interação dentro da fase, não pedido de permissão).
|
|
249
|
+
3. **Propagar** ao PRD/plano/DEC/registro de origem.
|
|
250
|
+
4. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** automaticamente.
|
|
261
251
|
|
|
262
|
-
|
|
263
|
-
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve a decisão via `AskUserQuestion` (interação **dentro da fase**, não pedido de permissão pra avançar).
|
|
264
|
-
3. **Propagar** a resolução ao PRD/plano/DEC/registro de origem.
|
|
265
|
-
4. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** (plano→execução) automaticamente.
|
|
252
|
+
Marcar TBD e adiar só se o usuário pedir **explicitamente** — nunca por iniciativa do orquestrador.
|
|
266
253
|
|
|
267
|
-
|
|
254
|
+
> `PERGUNTAS_EM_ABERTO.md` é verificado na validação de PRD; Q- aberta da sprint **não é blockage** — entra neste mesmo caminho.
|
|
268
255
|
|
|
269
256
|
---
|
|
270
257
|
|
|
@@ -325,12 +312,6 @@ Se `full` gerou `PLAN_*.md` mas não despachou `plan_execute`, o cabeçalho deve
|
|
|
325
312
|
|
|
326
313
|
---
|
|
327
314
|
|
|
328
|
-
## Integração com PERGUNTAS_EM_ABERTO.md
|
|
329
|
-
|
|
330
|
-
Plugin verifica `PERGUNTAS_EM_ABERTO.md` durante validação de PRD. Q-… abertas relacionadas à sprint **não param o pipeline** (Q- aberta não é blockage). O orquestrador trata como decisão em aberto: dispara `atlas-prd-interview` para resolver, propaga a decisão (PRD/plano/DEC/registro) e **continua** o pipeline. Ver "Decisão em aberto ≠ parada".
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
315
|
## Error handling
|
|
335
316
|
|
|
336
317
|
- **Pré-flight falha (skill ausente no host)** → para, reporta, não emula (ver Fase 0).
|
|
@@ -400,14 +381,4 @@ orquestrador
|
|
|
400
381
|
|
|
401
382
|
Regra de ouro: **um sub-agent por fase de execução, em série, blocking, sustentado por MCP**. O orquestrador espera cada sub-agent terminar antes do próximo e **nunca** trabalha em paralelo nem escreve código (Gate G9). Autoria documental (PRD/plano) é livre no fio principal **antes** do plano validado; depois, mãos atadas. Em `full`, `PLAN_*.md` validado obriga `plan_execute` no mesmo workflow (G11). `task-validator` ⟂ `slice-review` jamais coexistem. Progresso só por banner (string do MCP).
|
|
402
383
|
|
|
403
|
-
> Histórico
|
|
404
|
-
|
|
405
|
-
- **v0.8.1** — Patch de confiabilidade de contrato (só SKILL/command; sem código MCP, sem schema, schema v5 intacto). Fecha o vazamento de **parada discricionária**: nova seção "Princípio de continuação automática" (pipeline fire-and-continue — só para em gate duro `blocked` ou blockage de ambiente real) + "Decisão em aberto ≠ parada" (decisão pendente de **qualquer fonte** — scan/entrevista/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — dispara entrevista, propaga e **continua**, nunca vira menu de permissão nem "responda só: seguir ou D=..."; sequência travada: em `full`/`direct` gera PRD draft **primeiro**, entrevista roda **sobre** o PRD). Proíbe modo fora do contrato ("Modo Discussão"/"dry-run") e "quer que eu gere/continue?"; PRD ausente em `full`/`direct` gera automático. Novo **Gate DEP**: dependência de backlog não-`done` é hard-fail determinístico (não confundir com decisão em aberto). Origem: relato de pausa indevida no pipeline (orquestrador parava pra pedir confirmação que o contrato não exige).
|
|
406
|
-
- **v0.8.0** — Proof-of-work do validador frio (Gate G4, R20). `atlas_lock_validator(start)` emite um `challenge` (sha256 de um arquivo do boundary do `state_path`); o validador irmão lê via `validator_recovery.challenge`, computa o hash e devolve em `challenge_response`; o `complete` recomputa do disco e bloqueia (`challenge_failed`, slot preservado) em divergência/ausência. Atestação mecânica de que o veredito leu o boundary — fecha o atalho preguiçoso de afirmar `pass` sem ler código. **Não** é prova de isolamento não-forjável (MCP fala stdio com um único caller); best-effort (boundary sem arquivo legível → sem challenge, sem enforcement). Schema `atlas_capabilities` intacto (v5).
|
|
407
|
-
- **v0.7.2** — Patch de confiabilidade (sem breaking, schema v5 intacto). `ping().capabilities` passa a ser **derivado de `toolsList()`** (fonte única) — fim do drift que omitia `atlas_classify_input`, capaz de travar run válida na Fase 0; guard cruzado novo. CI ganha job `cross-os` (Windows/macOS, Node puro). Doc: proveniência do `dispatch_token` no `atlas-task-validator` e `.gitattributes` marcando artefatos gerados.
|
|
408
|
-
- **v0.7.1** — Patch de confiabilidade. MCP: `atlas_run_state(upsert)` faz merge top-level (não derruba `dispatch.active`); `findActiveRunConflict` só bloqueia conflito de lock real; `atlas_verify_artifact` aceita `artifact_kind`. Gate G4 endurecido: falha de dispatch em runtime = `blocked`, nunca inline (R17); `dispatch_token` do `complete` vem do output do próprio validador irmão (R19).
|
|
409
|
-
|
|
410
|
-
## Próximas fases
|
|
411
|
-
|
|
412
|
-
- **v0.4** hardening de empacotamento e smoke multi-host
|
|
413
|
-
- **v1.0** contrato estável de workflow
|
|
384
|
+
> Histórico de versões (detalhe de cada correção) e roadmap: [`CHANGELOG.md`](../../../../CHANGELOG.md) na raiz — fonte canônica.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atlas-workflow-orchestrator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Orquestra pipelines via sub-agents (PRD, entrevista, plan handoff, execução, validator, repair, review) e oferece geração explícita de backlog mestre. Bundle único: 9 skills atlas-* + orquestrador + 5 templates canônicos.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Paulo Borini"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.9.1
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: atlas-direct-execute
|
|
3
3
|
description: Executor direto da família Atlas (modo direct). Despachado em contexto isolado pelo orquestrador para implementar um PRD/tarefa escopada sem artefato de plano separado — toda mutação de código acontece aqui, nunca no fio do orquestrador (Gate G9). Primeira ação: carregar a skill completa atlas-direct-execute. Antes do relatório final, escreve o state_path e retorna validator_handoff_required; o orquestrador despacha a validação fria sibling (atlas-task-validator, Gate G4).
|
|
4
|
-
tools: Read, Write, Edit, Grep, Glob, Bash, Skill, Agent
|
|
4
|
+
tools: Read, Write, Edit, Grep, Glob, Bash, Skill, Agent, mcp__plugin_atlas-workflow-orchestrator_atlas-workflow
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Atlas Direct Execute (sub-agent)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: atlas-plan-execute
|
|
3
3
|
description: Executor de plano da família Atlas. Despachado em contexto isolado pelo orquestrador após o plano validado — toda mutação de código (editar, rodar build/testes, commitar) acontece aqui, nunca no fio do orquestrador (Gate G9). Primeira ação: carregar a skill completa atlas-plan-execute. Antes do relatório final, escreve o state_path e retorna validator_handoff_required; o orquestrador despacha a validação fria sibling (atlas-task-validator, Gate G4).
|
|
4
|
-
tools: Read, Write, Edit, Grep, Glob, Bash, Skill, Agent
|
|
4
|
+
tools: Read, Write, Edit, Grep, Glob, Bash, Skill, Agent, mcp__plugin_atlas-workflow-orchestrator_atlas-workflow
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Atlas Plan Execute (sub-agent)
|
|
@@ -220,11 +220,11 @@ Veja este README, `packages/mcp-server/README.md` e os SKILL.md `atlas-*` para o
|
|
|
220
220
|
|
|
221
221
|
---
|
|
222
222
|
|
|
223
|
-
**Plugin version:** 0.
|
|
223
|
+
**Plugin version:** 0.9.1
|
|
224
224
|
**Author:** Paulo Borini
|
|
225
225
|
**Last updated:** 2026-06-16
|
|
226
226
|
|
|
227
|
-
### Novidades v0.8.
|
|
227
|
+
### Novidades v0.8.4 — liveness do executor (Gate G12)
|
|
228
228
|
|
|
229
229
|
- `plan_execute` agora tem liveness explícito: `atlas_lock_dispatch(start)` cria deadline de bootstrap e o executor precisa emitir checkpoints materiais.
|
|
230
230
|
- `atlas-plan-execute` deve reportar `executor_started`, `skill_loaded`, `plan_loaded`, `handoff_accepted`, `task_started`, `first_write` e `state_path_created` conforme avança.
|
|
@@ -23,22 +23,23 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
|
|
|
23
23
|
| env `CODEX_HOME` / `CODEX_PLUGIN_ROOT` | `codex` |
|
|
24
24
|
| env `ATLAS_HOST=opencode` (injetado por `opencode.json`) | `opencode` |
|
|
25
25
|
| env `ATLAS_HOST=pi` (injetado pela config do `pi-mcp-adapter`) | `pi` |
|
|
26
|
+
| env `ATLAS_HOST=antigravity` (injetado por `mcp_config.json`) | `antigravity` |
|
|
26
27
|
| nenhum | `generic` |
|
|
27
28
|
|
|
28
29
|
## Matriz de adapters
|
|
29
30
|
|
|
30
|
-
| Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `generic` |
|
|
31
|
-
|
|
32
|
-
| Disparo de subagente | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | `spawn_agent(agent_type: "<name>", items: [{ type: "text", text: "<state_path>" }])` | `@<name>` (ou auto) com `<state_path>` | tool `subagent({ agent: "<name>", task: "<state_path>", context: "fresh" })` (pi-subagents) | subagente nativo do host, passando só `<state_path>` |
|
|
33
|
-
| Registro do subagente | `agents/<name>.md` na raiz do plugin | `CODEX_HOME/agents/<name>.toml` via `init codex` (`.codex/agents/` no bundle é fonte gerada; custom agent nativo; `developer_instructions` carrega o `SKILL.md`; `atlas-task-validator` pinado em `model="gpt-5.4"` + `model_reasoning_effort="high"`) | `.opencode/agents/<name>.md` (`mode: subagent`) | `.pi/agents/<name>.md` (pi-subagents; frontmatter `name`+`description`+`tools`; **`SKILL.md` canônico embutido no corpo** porque o pi não tem skill loader no sub-agente — fonte única segue `packages/skills/<name>/SKILL.md`, agente é cópia gerada por `build/gen-host-agent.mjs`) | mecanismo nativo equivalente |
|
|
34
|
-
| Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
|
|
35
|
-
| Join síncrono (gate JOIN) | `self_evident` (`Agent()` bloqueante) | `self_evident` (confirmado em produção) | `self_evident` (`@<name>` bloqueante) | `must_report` (depende de `pi-subagents`; hard-fail sem report) | `must_report` (indeterminado; hard-fail sem report) |
|
|
36
|
-
| Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) |
|
|
37
|
-
| Config MCP | `plugin.json` `mcpServers` | `.mcp.json` | `opencode.json` `mcp.<name>` (`type:"local"`, `environment.ATLAS_HOST=opencode`) | `.mcp.json` no root (`pi-mcp-adapter`; `env.ATLAS_HOST=pi`); tools chegam proxiadas/prefixadas `atlas_workflow_<tool>` | host MCP-capaz |
|
|
38
|
-
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — |
|
|
39
|
-
| Estado de run | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) |
|
|
40
|
-
| Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
|
|
41
|
-
| Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem |
|
|
31
|
+
| Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `antigravity` (Gemini) | `generic` |
|
|
32
|
+
|---------|------------------------|---------------------|------------|---------------|------------------------|-----------|
|
|
33
|
+
| Disparo de subagente | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | `spawn_agent(agent_type: "<name>", items: [{ type: "text", text: "<state_path>" }])` | `@<name>` (ou auto) com `<state_path>` | tool `subagent({ agent: "<name>", task: "<state_path>", context: "fresh" })` (pi-subagents) | `define_subagent` + `invoke_subagent` com `<state_path>` | subagente nativo do host, passando só `<state_path>` |
|
|
34
|
+
| Registro do subagente | `agents/<name>.md` na raiz do plugin | `CODEX_HOME/agents/<name>.toml` via `init codex` (`.codex/agents/` no bundle é fonte gerada; custom agent nativo; `developer_instructions` carrega o `SKILL.md`; `atlas-task-validator` pinado em `model="gpt-5.4"` + `model_reasoning_effort="high"`) | `.opencode/agents/<name>.md` (`mode: subagent`) | `.pi/agents/<name>.md` (pi-subagents; frontmatter `name`+`description`+`tools`; **`SKILL.md` canônico embutido no corpo** porque o pi não tem skill loader no sub-agente — fonte única segue `packages/skills/<name>/SKILL.md`, agente é cópia gerada por `build/gen-host-agent.mjs`) | dinâmico via `define_subagent` da skill do orquestrador | mecanismo nativo equivalente |
|
|
35
|
+
| Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
|
|
36
|
+
| Join síncrono (gate JOIN) | `self_evident` (`Agent()` bloqueante) | `self_evident` (confirmado em produção) | `self_evident` (`@<name>` bloqueante) | `must_report` (depende de `pi-subagents`; hard-fail sem report) | `self_evident` (`invoke_subagent` bloqueante) | `must_report` (indeterminado; hard-fail sem report) |
|
|
37
|
+
| Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) | nenhum (segue sem mirror) |
|
|
38
|
+
| Config MCP | `plugin.json` `mcpServers` | `.mcp.json` | `opencode.json` `mcp.<name>` (`type:"local"`, `environment.ATLAS_HOST=opencode`) | `.mcp.json` no root (`pi-mcp-adapter`; `env.ATLAS_HOST=pi`); tools chegam proxiadas/prefixadas `atlas_workflow_<tool>` | `mcp_config.json` (`env.ATLAS_HOST=antigravity`) | host MCP-capaz |
|
|
39
|
+
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — |
|
|
40
|
+
| Estado de run | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) |
|
|
41
|
+
| Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
|
|
42
|
+
| Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem | idem |
|
|
42
43
|
|
|
43
44
|
`.cursor/plans/` e `.codex/plans/` são lidos com deprecation warning por 1 release; escrita só em `.atlas/plans/`. **opencode** instala via `.opencode/` + `opencode.json` (`hosts/opencode/`). **pi** instala via `mcp.json` + `agents/` + `skills/` (`hosts/pi/`) e exige as 2 deps obrigatórias; sem qualquer uma o preflight aborta (gate PREREQ).
|
|
44
45
|
|
package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md
CHANGED
|
@@ -8,7 +8,7 @@ category: Development Automation
|
|
|
8
8
|
|
|
9
9
|
Orquestra pipelines de desenvolvimento de features no projeto Atlas, automatizando a sequência de skills sob demanda com um único comando.
|
|
10
10
|
|
|
11
|
-
> **
|
|
11
|
+
> **MCP é fonte obrigatória de status.** Cada gate é consultado via MCP antes de avançar (tools por fase na Fase 0 e nos fluxos). Sem resposta MCP, sem resultado exigido ou status bloqueante → workflow abortado, sem fallback narrativo. Edge cases de ambiente (conflito plugin/nativo, MCP indisponível, estado corrompido, lock conflict, drift de versão) bloqueiam com causa, impacto e próxima ação segura.
|
|
12
12
|
|
|
13
13
|
## Sintaxe
|
|
14
14
|
|
|
@@ -124,33 +124,24 @@ A única interação legítima com o usuário é **dentro de uma fase** — o `A
|
|
|
124
124
|
|
|
125
125
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
126
|
|
|
127
|
-
O orquestrador **coordena a execução**, não implementa código
|
|
127
|
+
O orquestrador **coordena a execução**, não implementa código — maestro que aponta cada sub-agent na ordem e espera terminar, **nunca pega o instrumento de código**. A fronteira de determinismo é a **mutação de código** (PRD D10), com **duas fases**:
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
- **ANTES do plano validado — autoria documental livre no fio principal.** Pode autorar PRD, entrevistar e escrever `PLAN_*.md` direto; fases documentais não exigem sub-agent (documento não muta o produto). **Ao finalizar um PRD inline, estampar `| Status | Aprovado para implementação |`** — é o `required_status` do gate TC; sem isso o PRD sai `Draft` e trava o TC em rodadas de correção.
|
|
130
|
+
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** Não edita mais PRD/plano/código nem roda comando mutante; só coordena (despachar sub-agent, ler artefato pra verificar gate, ecoar banner, montar output).
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** A partir daí o orquestrador **NÃO** edita PRD/plano, **NÃO** edita código, **NÃO** roda comando mutante. Só **coordena a execução**: despachar sub-agent, ler artefato para verificar gate, ecoar banner, montar o output final.
|
|
133
|
-
- **Execução de código é SEMPRE gateada — nunca afrouxa.** Toda mutação de código vive obrigatoriamente em sub-agent `plan_execute` (blocking, um por vez) + validador frio `task_validator` (PRD D10). O orquestrador **nunca escreve código**, em nenhuma fase, em nenhum modo. Isto não muda com a autoria documental livre acima.
|
|
134
|
-
|
|
135
|
-
- **Permitido:** parse de args; classificar input; autorar PRD/entrevista/`PLAN_*.md` **enquanto o plano não foi validado**; despachar sub-agent (blocking, um por vez); ler artefato em disco para verificar gate; ecoar banner; montar o output final.
|
|
136
|
-
- **Proibido (Gate G9):** escrever/editar **código**; rodar comando mutante (`flutter`, `test`, `git add/commit`); editar PRD/plano **depois** do plano validado; implementar "em paralelo"; usar `run_in_background` para fases do pipeline.
|
|
137
|
-
- **Dispatch blocking:** despacha → **espera o retorno** → verifica gate → próxima fase. Nunca dois sub-agents simultâneos. Nunca trabalhar enquanto um sub-agent roda.
|
|
132
|
+
Execução de código é **sempre** sub-agent `plan_execute` (blocking, um por vez) + validador frio `task_validator` (Gate G9/G7 — detalhe na tabela de gates). Dispatch blocking: despacha → espera retorno → verifica gate → próxima fase. Nunca dois sub-agents simultâneos.
|
|
138
133
|
|
|
139
134
|
### Verbo de dispatch é host-agnóstico (não assuma "Agent tool")
|
|
140
135
|
|
|
141
|
-
O **mecanismo**
|
|
136
|
+
O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example` e `validator_dispatch` de `atlas_capabilities` (fonte de verdade em runtime) e use o **verbo nativo**. Não hardcode o verbo do Claude. Mapeamento ilustrativo, onde `<exec>` é o id da fase (`plan-execute`/`direct-execute`/`slice-review`/`task-validator`):
|
|
142
137
|
|
|
143
138
|
- **claude:** `Agent(subagent_type: "atlas-<exec>", prompt: ...)`
|
|
144
|
-
- **codex:** `spawn_agent(agent_type: "atlas-<exec>", items: [{ type: "text", text: "<state_path ou task>" }])`
|
|
139
|
+
- **codex:** `spawn_agent(agent_type: "atlas-<exec>", items: [{ type: "text", text: "<state_path ou task>" }])` (custom agent nativo em `CODEX_HOME/agents/atlas-<exec>.toml`; `.codex/agents/` do bundle é gerado). `$atlas-*` sozinho **não** isola contexto — use `spawn_agent`.
|
|
145
140
|
- **opencode:** `@atlas-<exec>` (ou auto por description)
|
|
146
141
|
- **pi:** `subagent({ agent: "atlas-<exec>", task, context: "fresh" })`
|
|
147
142
|
- **generic:** subagente nativo do host
|
|
148
143
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
> **Rodar a mutação de código no fio principal é violação do Gate G9 — em QUALQUER host.** Ausência da "Agent tool" (porque o host não é Claude) **não** é licença para executar inline: é sinal de que você deve usar o **verbo de dispatch daquele host**. No Codex, `$atlas-*` sozinho não isola contexto; use `spawn_agent`. Se o host não expõe nenhum mecanismo de sub-agent (preflight `subagent_available:false`), o gate PREREQ já abortou em `ready` — você nunca chega aqui sem isolamento.
|
|
152
|
-
|
|
153
|
-
Se você (orquestrador) está prestes a editar **código**, **pare**: esse trabalho é do sub-agent de execução. Despache-o (verbo nativo do host) e espere. (Autoria de PRD/plano antes da validação é a única autoria permitida no fio principal.)
|
|
144
|
+
> Ausência de "Agent tool" (host ≠ Claude) **não** é licença pra executar inline — é sinal pra usar o verbo daquele host (Gate G9, qualquer host). Host sem mecanismo de sub-agent já abortou em PREREQ; você nunca chega aqui sem isolamento.
|
|
154
145
|
|
|
155
146
|
## Protocolo de banner (única comunicação de progresso)
|
|
156
147
|
|
|
@@ -189,6 +180,10 @@ Regras inegociáveis. Violação = parar, não contornar.
|
|
|
189
180
|
|
|
190
181
|
## Fluxo de execução
|
|
191
182
|
|
|
183
|
+
### [EXEC] — passo comum de execução + validação (idêntico em `full`/`direct`/`execute`)
|
|
184
|
+
|
|
185
|
+
`atlas_lock_dispatch(action=start, phase=plan_execute)`; despachar `plan_execute` como sub-agent blocking (lê `PLAN_*.md` em `full`/`execute`, PRD em `direct`). O executor emite checkpoints G12; sem retorno/progresso, chamar `atlas_lock_dispatch(action=status, phase=plan_execute)` e tratar `executor_bootstrap_timeout`/`executor_progress_timeout` como `stalled`/retry — nunca como execução em andamento. O executor retorna `validator_handoff_required` com `state_path`; o MCP só abre o slot após o checkpoint `state_path_created` para esse mesmo `state_path`. Validação sempre **sibling**: `atlas_lock_validator(action=start)`, despachar **um** `task_validator`, exigir no output o `dispatch_token` do slot e fechar com `validator_run_id` + `dispatch_token`. Em `fail`: `repair_start`, despachar `atlas-findings-repair` com `{state_path, findings, validator_attempt, repair_run_id, repair_budget: 1}`, exigir atualização do mesmo `state_path`, fechar com `repair_run_id` e rodar o **2º e último** validator. `passed`/`passed_with_observations` são terminais aprovados; status diferente bloqueia review e output completed.
|
|
186
|
+
|
|
192
187
|
### Full mode
|
|
193
188
|
|
|
194
189
|
Artefatos esperados (em ordem): `PRD_*.md` → (`PRD_*.md` atualizado) → `PLAN_*.md` → diff de código → relatório do validador.
|
|
@@ -200,7 +195,7 @@ Artefatos esperados (em ordem): `PRD_*.md` → (`PRD_*.md` atualizado) → `PLAN
|
|
|
200
195
|
5. **Plan** — `atlas_lock_dispatch(action=start, phase=plan_handoff)`, carregar/invocar `plan_handoff` no fio principal para redigir `PLAN_*.md`, depois chamar `atlas_verify_artifact` e `atlas_verify_template_conformance(artifact_type=plan)`. Concluir a fase com `atlas_lock_dispatch(action=complete, phase=plan_handoff)`. **Nenhuma linha de código pode ter sido escrita até aqui.**
|
|
201
196
|
- **G11:** se `PLAN_*.md` foi validado, chamar `atlas_assert_after_plan`. Se a próxima ação não for `dispatch_plan_execute_blocking`, abortar.
|
|
202
197
|
6. **Validate plan** — se há gaps → dispara entrevista, propaga e continua (ver "Decisão em aberto ≠ parada"). Não para pra pedir permissão.
|
|
203
|
-
7. **Execute** —
|
|
198
|
+
7. **Execute** — rodar o passo **[EXEC]** (lê `PLAN_*.md`).
|
|
204
199
|
8. **Review (condicional)** — somente após execução concluída e se `--review` → `atlas_lock_dispatch(action=start, phase=slice_review)`, despachar `slice_review`, depois `atlas_lock_dispatch(action=complete, phase=slice_review)`.
|
|
205
200
|
9. **Output** — ledger verificado com fonte MCP por gate/fase (ver "Output") + próximos passos.
|
|
206
201
|
|
|
@@ -210,7 +205,7 @@ Artefatos esperados: `PRD_*.md` → (atualizado) → diff de código → relató
|
|
|
210
205
|
|
|
211
206
|
1. Parse / Generate PRD (se necessário) + `atlas_verify_artifact`.
|
|
212
207
|
2. Validate PRD → `atlas_scan_prd` + `atlas_verify_template_conformance`; entrevista condicional reexecuta os gates.
|
|
213
|
-
3. **Execute** —
|
|
208
|
+
3. **Execute** — rodar o passo **[EXEC]** (executor lê o PRD; sem `PLAN_*.md`).
|
|
214
209
|
4. Review (condicional) — só após executor retornar 100% e dispatch MCP permitir.
|
|
215
210
|
5. Output (ledger verificado).
|
|
216
211
|
|
|
@@ -222,7 +217,7 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
222
217
|
|
|
223
218
|
1. **Parse / classify** — `atlas_ping` → `atlas_capabilities` → **`atlas_classify_input`** no input (PRD D3/D6: o tipo é fato e precisa ser conhecido antes de travar o modo) → **`atlas_preflight(<modo efetivo>)`** (PREREQ hard-fail intacto). A classificação determina o tipo: se for plano, o modo efetivo é `execute` e o preflight trava `execute`; se o input não for plano, auto-rotear (ver Fase 0, passo 2b) e o preflight trava o modo roteado. **`classify_input` sempre precede `preflight`** (o preflight trava o modo efetivo, não o pedido).
|
|
224
219
|
2. **Reverificar o plano na entrada** — `atlas_verify_artifact` no `PLAN_*.md` (G1) + `atlas_verify_template_conformance(artifact_type=plan)` (TC). Plano velho/manual/inválido **trava aqui** com `next_action` em linguagem de produto (PRD D11 — "autoria é livre, execução é gateada"). Sem reverificação válida não há dispatch.
|
|
225
|
-
3. **Executar** —
|
|
220
|
+
3. **Executar** — rodar o passo **[EXEC]** (lê `PLAN_*.md`). `plan_execute` é aceito como **primeira fase** em `execute` (sem fase nova; PRD D13).
|
|
226
221
|
4. **Review (condicional)** — só após execução concluída e se `--review` → `atlas_lock_dispatch(action=start, phase=slice_review)`, despachar `slice_review`, depois `complete`.
|
|
227
222
|
5. **Output** — ledger verificado; `guarantee_level` = `full_pipeline` (PRD D12).
|
|
228
223
|
|
|
@@ -239,15 +234,7 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
239
234
|
|
|
240
235
|
## Validação automática de PRD
|
|
241
236
|
|
|
242
|
-
O scan é **determinístico
|
|
243
|
-
|
|
244
|
-
- **§1 Contexto e objetivo:** `TBD`, `a confirmar`, `talvez`, `não definido`
|
|
245
|
-
- **§2 Escopo:** `pode ser`, `depende de`, `ainda não`, `incompleto`
|
|
246
|
-
- **§3 Decisões:** vazio/conteúdo mínimo, `vago`
|
|
247
|
-
- **§4 Fluxos e cenários UX:** `a definir`, `gap`, `depende de`
|
|
248
|
-
- **§5 Contrato funcional e invariantes:** `ainda não definido`, `mock apenas`, `a confirmar`
|
|
249
|
-
|
|
250
|
-
Antes de contar bloqueantes, aplicar exclusões estreitas do config (`exclude_if_line_contains`, hoje `depende de plano`) para frases de sucesso/resultado que descrevem dependência operacional já planejada. Não usar julgamento livre: a exclusão precisa estar no config e ser logada.
|
|
237
|
+
O scan é **determinístico** e roda **dentro do MCP** (`atlas_scan_prd`): a lista canônica de padrões §1-§5 e as exclusões de config (`exclude_if_line_contains`) são embutidas e mantidas no servidor — o orquestrador **não** reaplica padrões por conta própria, só consome o resultado. Não usar julgamento livre.
|
|
251
238
|
|
|
252
239
|
**Threshold = 1.** Se ≥ 1 padrão bloqueante → o orquestrador invoca `atlas-prd-interview` no fio principal. **Gate G5:** se 0 padrões bloqueantes, registrar `Ambiguity scan: 0 padrões bloqueantes — entrevista pulada` no output. Não há decisão subjetiva de "tenho certeza, pulo".
|
|
253
240
|
|
|
@@ -255,16 +242,16 @@ Antes de contar bloqueantes, aplicar exclusões estreitas do config (`exclude_if
|
|
|
255
242
|
|
|
256
243
|
## Decisão em aberto ≠ parada
|
|
257
244
|
|
|
258
|
-
|
|
245
|
+
Detalhe do caminho que a "Princípio de continuação automática" exige para decisão pendente de **qualquer fonte** (scan/entrevista/validação de plano/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — a fonte não muda o tratamento):
|
|
259
246
|
|
|
260
|
-
|
|
247
|
+
1. **Garantir o PRD primeiro.** Em `full`/`direct`, se o PRD não existe, **gerar o PRD draft** com as decisões marcadas. A entrevista é **PRD-scoped**: roda **sobre** o PRD, nunca antes. Detectar decisão não antecipa nem pula a geração do PRD.
|
|
248
|
+
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve via `AskUserQuestion` (interação dentro da fase, não pedido de permissão).
|
|
249
|
+
3. **Propagar** ao PRD/plano/DEC/registro de origem.
|
|
250
|
+
4. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** automaticamente.
|
|
261
251
|
|
|
262
|
-
|
|
263
|
-
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve a decisão via `AskUserQuestion` (interação **dentro da fase**, não pedido de permissão pra avançar).
|
|
264
|
-
3. **Propagar** a resolução ao PRD/plano/DEC/registro de origem.
|
|
265
|
-
4. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** (plano→execução) automaticamente.
|
|
252
|
+
Marcar TBD e adiar só se o usuário pedir **explicitamente** — nunca por iniciativa do orquestrador.
|
|
266
253
|
|
|
267
|
-
|
|
254
|
+
> `PERGUNTAS_EM_ABERTO.md` é verificado na validação de PRD; Q- aberta da sprint **não é blockage** — entra neste mesmo caminho.
|
|
268
255
|
|
|
269
256
|
---
|
|
270
257
|
|
|
@@ -325,12 +312,6 @@ Se `full` gerou `PLAN_*.md` mas não despachou `plan_execute`, o cabeçalho deve
|
|
|
325
312
|
|
|
326
313
|
---
|
|
327
314
|
|
|
328
|
-
## Integração com PERGUNTAS_EM_ABERTO.md
|
|
329
|
-
|
|
330
|
-
Plugin verifica `PERGUNTAS_EM_ABERTO.md` durante validação de PRD. Q-… abertas relacionadas à sprint **não param o pipeline** (Q- aberta não é blockage). O orquestrador trata como decisão em aberto: dispara `atlas-prd-interview` para resolver, propaga a decisão (PRD/plano/DEC/registro) e **continua** o pipeline. Ver "Decisão em aberto ≠ parada".
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
315
|
## Error handling
|
|
335
316
|
|
|
336
317
|
- **Pré-flight falha (skill ausente no host)** → para, reporta, não emula (ver Fase 0).
|
|
@@ -400,14 +381,4 @@ orquestrador
|
|
|
400
381
|
|
|
401
382
|
Regra de ouro: **um sub-agent por fase de execução, em série, blocking, sustentado por MCP**. O orquestrador espera cada sub-agent terminar antes do próximo e **nunca** trabalha em paralelo nem escreve código (Gate G9). Autoria documental (PRD/plano) é livre no fio principal **antes** do plano validado; depois, mãos atadas. Em `full`, `PLAN_*.md` validado obriga `plan_execute` no mesmo workflow (G11). `task-validator` ⟂ `slice-review` jamais coexistem. Progresso só por banner (string do MCP).
|
|
402
383
|
|
|
403
|
-
> Histórico
|
|
404
|
-
|
|
405
|
-
- **v0.8.1** — Patch de confiabilidade de contrato (só SKILL/command; sem código MCP, sem schema, schema v5 intacto). Fecha o vazamento de **parada discricionária**: nova seção "Princípio de continuação automática" (pipeline fire-and-continue — só para em gate duro `blocked` ou blockage de ambiente real) + "Decisão em aberto ≠ parada" (decisão pendente de **qualquer fonte** — scan/entrevista/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — dispara entrevista, propaga e **continua**, nunca vira menu de permissão nem "responda só: seguir ou D=..."; sequência travada: em `full`/`direct` gera PRD draft **primeiro**, entrevista roda **sobre** o PRD). Proíbe modo fora do contrato ("Modo Discussão"/"dry-run") e "quer que eu gere/continue?"; PRD ausente em `full`/`direct` gera automático. Novo **Gate DEP**: dependência de backlog não-`done` é hard-fail determinístico (não confundir com decisão em aberto). Origem: relato de pausa indevida no pipeline (orquestrador parava pra pedir confirmação que o contrato não exige).
|
|
406
|
-
- **v0.8.0** — Proof-of-work do validador frio (Gate G4, R20). `atlas_lock_validator(start)` emite um `challenge` (sha256 de um arquivo do boundary do `state_path`); o validador irmão lê via `validator_recovery.challenge`, computa o hash e devolve em `challenge_response`; o `complete` recomputa do disco e bloqueia (`challenge_failed`, slot preservado) em divergência/ausência. Atestação mecânica de que o veredito leu o boundary — fecha o atalho preguiçoso de afirmar `pass` sem ler código. **Não** é prova de isolamento não-forjável (MCP fala stdio com um único caller); best-effort (boundary sem arquivo legível → sem challenge, sem enforcement). Schema `atlas_capabilities` intacto (v5).
|
|
407
|
-
- **v0.7.2** — Patch de confiabilidade (sem breaking, schema v5 intacto). `ping().capabilities` passa a ser **derivado de `toolsList()`** (fonte única) — fim do drift que omitia `atlas_classify_input`, capaz de travar run válida na Fase 0; guard cruzado novo. CI ganha job `cross-os` (Windows/macOS, Node puro). Doc: proveniência do `dispatch_token` no `atlas-task-validator` e `.gitattributes` marcando artefatos gerados.
|
|
408
|
-
- **v0.7.1** — Patch de confiabilidade. MCP: `atlas_run_state(upsert)` faz merge top-level (não derruba `dispatch.active`); `findActiveRunConflict` só bloqueia conflito de lock real; `atlas_verify_artifact` aceita `artifact_kind`. Gate G4 endurecido: falha de dispatch em runtime = `blocked`, nunca inline (R17); `dispatch_token` do `complete` vem do output do próprio validador irmão (R19).
|
|
409
|
-
|
|
410
|
-
## Próximas fases
|
|
411
|
-
|
|
412
|
-
- **v0.4** hardening de empacotamento e smoke multi-host
|
|
413
|
-
- **v1.0** contrato estável de workflow
|
|
384
|
+
> Histórico de versões (detalhe de cada correção) e roadmap: [`CHANGELOG.md`](../../../../CHANGELOG.md) na raiz — fonte canônica.
|