atlas-workflow 0.9.1 → 0.9.3

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.
Files changed (169) hide show
  1. package/README.md +5 -2
  2. package/VERSION +1 -1
  3. package/build/bump-version.mjs +6 -21
  4. package/build/cli/atlas-init.mjs +92 -5
  5. package/build/tests/classify-findings.test.mjs +20 -0
  6. package/build/tests/etapa3.test.mjs +161 -0
  7. package/build/tests/test_classify_findings.py +79 -0
  8. package/hosts/opencode/.opencode/agents/atlas-findings-repair.md +4 -0
  9. package/hosts/opencode/.opencode/agents/atlas-task-validator.md +18 -1
  10. package/hosts/opencode/.opencode/atlas/VERSION +1 -1
  11. package/hosts/opencode/.opencode/atlas/orchestrator/README.md +7 -5
  12. package/hosts/opencode/.opencode/atlas/orchestrator/commands/workflow.md +1 -1
  13. package/hosts/opencode/.opencode/atlas/orchestrator/references/host-adapters.md +13 -12
  14. package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -17
  15. package/hosts/opencode/.opencode/atlas/packages/mcp-server/README.md +1 -1
  16. package/hosts/opencode/.opencode/atlas/packages/mcp-server/package.json +1 -1
  17. package/hosts/opencode/.opencode/atlas/packages/mcp-server/server.js +514 -20
  18. package/hosts/opencode/.opencode/atlas/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
  19. package/hosts/opencode/.opencode/atlas/packages/templates/PRD_TEMPLATE.md +2 -1
  20. package/hosts/opencode/.opencode/atlas/packages/templates/STATE_FILE_SCHEMA.md +25 -1
  21. package/hosts/opencode/.opencode/skills/_shared/references/stack-profiles.md +36 -0
  22. package/hosts/opencode/.opencode/skills/_shared/scripts/document_quality.mjs +252 -0
  23. package/hosts/opencode/.opencode/skills/atlas-backlog-generator/SKILL.md +7 -2
  24. package/hosts/opencode/.opencode/skills/atlas-direct-execute/SKILL.md +6 -2
  25. package/hosts/opencode/.opencode/skills/atlas-findings-repair/SKILL.md +11 -1
  26. package/hosts/opencode/.opencode/skills/atlas-plan-execute/SKILL.md +16 -2
  27. package/hosts/opencode/.opencode/skills/atlas-plan-handoff/SKILL.md +6 -4
  28. package/hosts/opencode/.opencode/skills/atlas-prd-interview/SKILL.md +7 -2
  29. package/hosts/opencode/.opencode/skills/atlas-slice-review/SKILL.md +37 -2
  30. package/hosts/opencode/.opencode/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
  31. package/hosts/opencode/.opencode/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
  32. package/hosts/opencode/.opencode/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
  33. package/hosts/opencode/.opencode/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
  34. package/hosts/opencode/.opencode/skills/atlas-task-validator/SKILL.md +29 -14
  35. package/hosts/opencode/.opencode/skills/atlas-workflow-orchestrator/SKILL.md +24 -17
  36. package/hosts/pi/.pi/agents/atlas-direct-execute.md +6 -2
  37. package/hosts/pi/.pi/agents/atlas-findings-repair.md +15 -1
  38. package/hosts/pi/.pi/agents/atlas-plan-execute.md +16 -2
  39. package/hosts/pi/.pi/agents/atlas-slice-review.md +37 -2
  40. package/hosts/pi/.pi/agents/atlas-task-validator.md +18 -1
  41. package/hosts/pi/atlas/VERSION +1 -1
  42. package/hosts/pi/atlas/orchestrator/README.md +7 -5
  43. package/hosts/pi/atlas/orchestrator/commands/workflow.md +1 -1
  44. package/hosts/pi/atlas/orchestrator/references/host-adapters.md +13 -12
  45. package/hosts/pi/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -17
  46. package/hosts/pi/atlas/packages/mcp-server/README.md +1 -1
  47. package/hosts/pi/atlas/packages/mcp-server/package.json +1 -1
  48. package/hosts/pi/atlas/packages/mcp-server/server.js +514 -20
  49. package/hosts/pi/atlas/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
  50. package/hosts/pi/atlas/packages/templates/PRD_TEMPLATE.md +2 -1
  51. package/hosts/pi/atlas/packages/templates/STATE_FILE_SCHEMA.md +25 -1
  52. package/hosts/pi/skills/_shared/references/stack-profiles.md +36 -0
  53. package/hosts/pi/skills/_shared/scripts/document_quality.mjs +252 -0
  54. package/hosts/pi/skills/atlas-backlog-generator/SKILL.md +7 -2
  55. package/hosts/pi/skills/atlas-direct-execute/SKILL.md +6 -2
  56. package/hosts/pi/skills/atlas-findings-repair/SKILL.md +11 -1
  57. package/hosts/pi/skills/atlas-plan-execute/SKILL.md +16 -2
  58. package/hosts/pi/skills/atlas-plan-handoff/SKILL.md +6 -4
  59. package/hosts/pi/skills/atlas-prd-interview/SKILL.md +7 -2
  60. package/hosts/pi/skills/atlas-slice-review/SKILL.md +37 -2
  61. package/hosts/pi/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
  62. package/hosts/pi/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
  63. package/hosts/pi/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
  64. package/hosts/pi/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
  65. package/hosts/pi/skills/atlas-task-validator/SKILL.md +29 -14
  66. package/hosts/pi/skills/atlas-workflow-orchestrator/SKILL.md +24 -17
  67. package/hosts/zcode/.zcode-plugin/plugin.json +27 -0
  68. package/hosts/zcode/agents/atlas-direct-execute.md +31 -0
  69. package/hosts/zcode/agents/atlas-findings-repair.md +39 -0
  70. package/hosts/zcode/agents/atlas-plan-execute.md +33 -0
  71. package/hosts/zcode/agents/atlas-slice-review.md +27 -0
  72. package/hosts/zcode/agents/atlas-task-validator.md +138 -0
  73. package/hosts/zcode/packages/mcp-server/README.md +29 -0
  74. package/hosts/zcode/packages/mcp-server/VERSION +1 -0
  75. package/hosts/zcode/packages/mcp-server/package.json +15 -0
  76. package/hosts/zcode/packages/mcp-server/server.js +3897 -0
  77. package/hosts/zcode/packages/orchestrator/README.md +270 -0
  78. package/hosts/zcode/packages/orchestrator/commands/workflow.md +37 -0
  79. package/hosts/zcode/packages/orchestrator/defaults/paths.md +21 -0
  80. package/hosts/zcode/packages/orchestrator/references/host-adapters.md +106 -0
  81. package/hosts/zcode/packages/orchestrator/references/qa_s13_matrix.md +141 -0
  82. package/hosts/zcode/packages/orchestrator/references/subagent_dispatch.md +42 -0
  83. package/hosts/zcode/packages/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +391 -0
  84. package/hosts/zcode/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +855 -0
  85. package/hosts/zcode/packages/templates/BOUNDARY_PRD_PLAN.md +93 -0
  86. package/hosts/zcode/packages/templates/PERGUNTAS_EM_ABERTO_TEMPLATE.md +139 -0
  87. package/hosts/zcode/packages/templates/PLAN_TEMPLATE.md +146 -0
  88. package/hosts/zcode/packages/templates/PRD_TEMPLATE.md +150 -0
  89. package/hosts/zcode/packages/templates/STATE_FILE_SCHEMA.md +56 -0
  90. package/hosts/zcode/skills/_shared/references/stack-profiles.md +36 -0
  91. package/hosts/zcode/skills/_shared/scripts/document_quality.mjs +252 -0
  92. package/hosts/zcode/skills/atlas-backlog-generator/SKILL.md +93 -0
  93. package/hosts/zcode/skills/atlas-backlog-generator/agents/openai.yaml +4 -0
  94. package/hosts/zcode/skills/atlas-direct-execute/SKILL.md +221 -0
  95. package/hosts/zcode/skills/atlas-direct-execute/agents/openai.yaml +7 -0
  96. package/hosts/zcode/skills/atlas-findings-repair/SKILL.md +158 -0
  97. package/hosts/zcode/skills/atlas-findings-repair/agents/openai.yaml +7 -0
  98. package/hosts/zcode/skills/atlas-plan-execute/SKILL.md +175 -0
  99. package/hosts/zcode/skills/atlas-plan-execute/agents/openai.yaml +7 -0
  100. package/hosts/zcode/skills/atlas-plan-execute/references/plan-contract.md +88 -0
  101. package/hosts/zcode/skills/atlas-plan-execute/references/quality-gates.md +60 -0
  102. package/hosts/zcode/skills/atlas-plan-execute/scripts/check_budget_state.py +96 -0
  103. package/hosts/zcode/skills/atlas-plan-execute/scripts/extract_plan_contract.py +191 -0
  104. package/hosts/zcode/skills/atlas-plan-execute/scripts/validate_gate_result.py +56 -0
  105. package/hosts/zcode/skills/atlas-plan-handoff/SKILL.md +183 -0
  106. package/hosts/zcode/skills/atlas-plan-handoff/agents/openai.yaml +7 -0
  107. package/hosts/zcode/skills/atlas-prd-interview/SKILL.md +82 -0
  108. package/hosts/zcode/skills/atlas-prd-interview/agents/openai.yaml +7 -0
  109. package/hosts/zcode/skills/atlas-slice-review/SKILL.md +156 -0
  110. package/hosts/zcode/skills/atlas-slice-review/agents/openai.yaml +4 -0
  111. package/hosts/zcode/skills/atlas-slice-review/references/review-contract.md +58 -0
  112. package/hosts/zcode/skills/atlas-slice-review/references/scenario-lenses.md +57 -0
  113. package/hosts/zcode/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
  114. package/hosts/zcode/skills/atlas-slice-review/scripts/classify_findings.py +24 -0
  115. package/hosts/zcode/skills/atlas-slice-review/scripts/extract_review_slice.py +158 -0
  116. package/hosts/zcode/skills/atlas-sprint-prd-generator/SKILL.md +77 -0
  117. package/hosts/zcode/skills/atlas-sprint-prd-generator/agents/openai.yaml +7 -0
  118. package/hosts/zcode/skills/atlas-task-validator/SKILL.md +173 -0
  119. package/hosts/zcode/skills/atlas-task-validator/agents/openai.yaml +7 -0
  120. package/hosts/zcode/skills/atlas-workflow-orchestrator/SKILL.md +391 -0
  121. package/package.json +1 -1
  122. package/plugins/atlas-workflow-orchestrator/.codex/agents/atlas-findings-repair.toml +1 -1
  123. package/plugins/atlas-workflow-orchestrator/.codex/agents/atlas-task-validator.toml +1 -1
  124. package/plugins/atlas-workflow-orchestrator/.codex-plugin/plugin.json +1 -1
  125. package/plugins/atlas-workflow-orchestrator/VERSION +1 -1
  126. package/plugins/atlas-workflow-orchestrator/agents/atlas-findings-repair.md +4 -0
  127. package/plugins/atlas-workflow-orchestrator/agents/atlas-task-validator.md +18 -1
  128. package/plugins/atlas-workflow-orchestrator/orchestrator/README.md +7 -5
  129. package/plugins/atlas-workflow-orchestrator/orchestrator/commands/workflow.md +1 -1
  130. package/plugins/atlas-workflow-orchestrator/orchestrator/references/host-adapters.md +13 -12
  131. package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -17
  132. package/plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md +1 -1
  133. package/plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json +1 -1
  134. package/plugins/atlas-workflow-orchestrator/packages/mcp-server/server.js +514 -20
  135. package/plugins/atlas-workflow-orchestrator/packages/skills/_shared/references/stack-profiles.md +36 -0
  136. package/plugins/atlas-workflow-orchestrator/packages/skills/_shared/scripts/document_quality.mjs +252 -0
  137. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-backlog-generator/SKILL.md +7 -2
  138. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-direct-execute/SKILL.md +6 -2
  139. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-findings-repair/SKILL.md +11 -1
  140. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-plan-execute/SKILL.md +16 -2
  141. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-plan-handoff/SKILL.md +6 -4
  142. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-prd-interview/SKILL.md +7 -2
  143. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/SKILL.md +37 -2
  144. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
  145. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
  146. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
  147. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
  148. package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-task-validator/SKILL.md +29 -14
  149. package/plugins/atlas-workflow-orchestrator/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
  150. package/plugins/atlas-workflow-orchestrator/packages/templates/PRD_TEMPLATE.md +2 -1
  151. package/plugins/atlas-workflow-orchestrator/packages/templates/STATE_FILE_SCHEMA.md +25 -1
  152. package/plugins/atlas-workflow-orchestrator/skills/_shared/references/stack-profiles.md +36 -0
  153. package/plugins/atlas-workflow-orchestrator/skills/_shared/scripts/document_quality.mjs +252 -0
  154. package/plugins/atlas-workflow-orchestrator/skills/atlas-backlog-generator/SKILL.md +7 -2
  155. package/plugins/atlas-workflow-orchestrator/skills/atlas-direct-execute/SKILL.md +6 -2
  156. package/plugins/atlas-workflow-orchestrator/skills/atlas-findings-repair/SKILL.md +11 -1
  157. package/plugins/atlas-workflow-orchestrator/skills/atlas-plan-execute/SKILL.md +16 -2
  158. package/plugins/atlas-workflow-orchestrator/skills/atlas-plan-handoff/SKILL.md +6 -4
  159. package/plugins/atlas-workflow-orchestrator/skills/atlas-prd-interview/SKILL.md +7 -2
  160. package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/SKILL.md +37 -2
  161. package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
  162. package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
  163. package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
  164. package/plugins/atlas-workflow-orchestrator/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
  165. package/plugins/atlas-workflow-orchestrator/skills/atlas-task-validator/SKILL.md +29 -14
  166. package/plugins/atlas-workflow-orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +24 -17
  167. package/plugins/atlas-workflow-orchestrator/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
  168. package/plugins/atlas-workflow-orchestrator/templates/PRD_TEMPLATE.md +2 -1
  169. package/plugins/atlas-workflow-orchestrator/templates/STATE_FILE_SCHEMA.md +25 -1
@@ -2,4 +2,4 @@ name = "atlas-task-validator"
2
2
  description = "Validador frio de slice executada por atlas-plan-execute ou atlas-direct-execute. Invocado como subagente obrigatório antes do relatório final de uma slice. Recebe apenas state_path, lê o boundary da slice e o plano, compara código real vs contrato e retorna findings P0/P1/P2/P3 estruturados com veredito JSON determinístico. Não corrige código. Não propõe diff."
3
3
  model = "gpt-5.4"
4
4
  model_reasoning_effort = "high"
5
- developer_instructions = "# Atlas Task Validator\n\n<!-- MANUTENÇÃO (cross-host): este corpo é o system prompt canônico do validator.\n Claude usa agents/<name>.md; Codex/opencode/pi geram registros nativos a partir\n deste arquivo. packages/skills/atlas-task-validator/SKILL.md documenta o contrato\n e o guard mantém o veredito/severidades sincronizados. -->\n\nSubagente de validação fria. Despachado pelo **orquestrador** como folha irmã (sibling) isolada, a partir do `state_path` que o executor escreve e retorna (`validator_handoff_required`), depois que todas as tasks de uma slice foram implementadas e localmente gateadas. Nunca é invocado pelo executor.\n\nObjetivo: passagem de validação fria e estruturada da slice entregue contra o contrato do plano. Você não observou a implementação — leia apenas o código atual.\n\n---\n\n## Invocation Contract\n\nVocê recebe **um único input base**: `state_path`.\n\nLeia o JSON em `.atlas/state/<run_id>/<slice>.json` usando o schema em `packages/templates/STATE_FILE_SCHEMA.md`. Desse arquivo, carregue:\n\n1. **Slice boundary** — `files_changed` + `diff_stat`.\n2. **Plan path** — `plan_path`, depois leia Section 2 (Invariantes de execução), Section 6 (Contratos técnicos) e Section 8 (Validação e checklist).\n3. **Executed task ids** — `tasks`.\n4. **Boundary refs** — `boundary_refs`.\n\nNão aceite contrato inline, diff colado ou listas de tasks coladas como boundary de validação. Se `state_path` estiver ausente, ilegível, ou faltar qualquer campo obrigatório, retorne JSON com `verdict: \"fail\"` e um finding P1 `Input insuficiente: <missing item>`.\n\n## State persistence\n\nUse `atlas_run_state` como fonte primária de metadados da run e estado de gate. O JSON em `state_path` é a projeção do boundary da slice para validação, não substituto do estado MCP. Se `atlas_run_state` estiver indisponível quando necessário para confirmar estado da run, retorne `verdict: \"fail\"` com finding P1 em vez de inferir status.\n\nAntes de validar, derive o `run_id` do `state_path`, chame `atlas_run_state(action=get)` e confirme:\n\n- `validator_recovery.status == \"running\"`\n- `validator_recovery.expected_state_path == state_path`\n- `validator_recovery.expected_dispatch_token` é inteiro\n\nCopie esse token sem alteração para `dispatch_token` no output. Se a correlação falhar, não invente token: retorne `dispatch_token: null` e `verdict: \"fail\"` com finding P1 `Correlação do slot de validação indisponível`.\n\n### Proof-of-work (challenge do boundary)\n\nSe `validator_recovery.challenge` não for `null`, ele traz `{ file, algo: \"sha256\" }` — um arquivo do boundary ao qual você **deve** ter acesso de leitura. Compute o hash dos bytes crus desse arquivo (relativo ao project root) e devolva em `challenge_response`:\n\n```bash\nshasum -a 256 \"<challenge.file>\"\n```\n\nColoque o hash hex (primeiro token da saída) em `challenge_response`. Se `challenge` for `null`, omita `challenge_response` ou devolva `null`. Não invente o hash: o orquestrador recomputa do disco e bloqueia a slice (`challenge_failed`) se divergir. Honestidade do mecanismo: este passo é atestação **mecânica** de que o veredito tocou bytes reais do boundary — fecha o atalho preguiçoso de afirmar `pass` sem nenhuma leitura; **não** prova, por si só, que você leu e entendeu o código (computar o hash não exige carregar o conteúdo no contexto). A leitura real do boundary continua sendo sua obrigação de validador. Falhas de challenge são bounded por attempt: após o teto, o slot fecha terminal (`challenge_exhausted`) — em geral sinaliza resolução de path divergente do consumer root, não veredito malicioso. O token submetido ao `atlas_lock_validator(complete)` vem **deste output**, nunca preenchido pelo orquestrador.\n\n---\n\n## Operating Rules\n\n1. **Leia código real no boundary da slice.** Não infira conformidade por nome de arquivo ou título de task.\n2. **Para cada Invariante relevante da Section 2:** identifique evidência de código que satisfaz ou viola.\n3. **Para cada Contrato relevante da Section 6:** verifique assinatura, comportamento e shape retornado.\n4. **Para cada item relevante do checklist da Section 8:** marque pass ou fail com evidência.\n5. **Cross-task checks:** estado compartilhado, args obrigatórios faltando, ordem de rota, tratamento de falha parcial, mismatch de permissão UI/backend.\n6. **Baseline universal abaixo.** Não invente critérios obrigatórios fora do plano e do baseline.\n7. **Não corrija arquivos nem proponha diffs.** Sugestão de fix cabe em 1-2 linhas de texto.\n\n## Universal Baseline\n\n* **Naming cross-layer:** métodos de leitura usam prefixo `get*`. Mutação usa verbos explícitos (`create`, `update`, `delete`, `add`, `remove`). Conceitos mantêm raiz consistente entre camadas.\n* **State lifecycle:** stores/controllers reusados entre modos ou rotas resetam estado anterior em `init()` ou transição.\n* **Navigation args:** resolvers validam campos obrigatórios; navegação passa todos os ids exigidos (sem placeholder vazio `''`).\n* **Partial failure paths:** mutações multi-step expõem persistência parcial claramente se um passo posterior falhar.\n* **Backend e UI gate match:** mutações sensíveis exigem enforcement server-side. Gate só de UI é insuficiente.\n* **Route registration:** rotas literais registradas antes de paramétricas (`/:id`, `/:id/edit`) sob o mesmo prefixo.\n* **Localization:** novas chaves de localização existem em todos os locales exigidos; l10n gerado limpo.\n* **Analyzer:** `flutter analyze` (ou equivalente da stack) retorna zero issues para arquivos tocados no boundary.\n* **Casts e nullability:** casts de payload remoto usam padrões defensivos; nulos em coleções tratados com `?? []`.\n\n---\n\n## Output contract\n\nRetorne JSON estrito como output final. Não envolva em Markdown e não anteceda com prosa.\n\n```json\n{\n \"dispatch_token\": 1,\n \"challenge_response\": \"string (sha256 hex do challenge.file; null se sem challenge)\",\n \"verdict\": \"pass | fail | pass_with_observations\",\n \"findings\": [\n { \"severity\": \"P0|P1|P2|P3\", \"file\": \"string\", \"line\": 0, \"msg\": \"string\" }\n ],\n \"observations\": [\n { \"file\": \"string\", \"line\": 0, \"msg\": \"string\" }\n ],\n \"boundary_violations\": [\n { \"file\": \"string\", \"reason\": \"string\" }\n ]\n}\n```\n\n`dispatch_token` deve ser exatamente `validator_recovery.expected_dispatch_token`. `findings`, `observations` e `boundary_violations` são sempre arrays. Use arrays vazios quando não houver itens.\n\n## Severity Model\n\nEscala alinhada com `atlas-slice-review` (`P0/P1/P2/P3`).\n\n* `P0`: blocker — falha de segurança, perda/corrupção de dado, build quebrado, ou mutação sensível que chega à produção sem enforcement server-side.\n* `P1`: fluxo primário quebrado, violação de invariante crítico da Section 2, id/contexto obrigatório inválido.\n* `P2`: gap de cenário, vazamento de state lifecycle, mitigação ausente em caminho de falha relevante.\n* `P3`: inconsistência de baixo risco, item de limpeza.\n\n## Verdict Rule (determinística)\n\nMapeie findings → veredito **mecanicamente**, nunca por percepção:\n\n* Qualquer finding `P0` **ou** `P1` em `findings` → `verdict: \"fail\"`. Sem exceção.\n* Sem `P0`/`P1`, mas um ou mais `P2` → `verdict: \"pass_with_observations\"`.\n* Só `P3` (ou zero findings) → `verdict: \"pass\"`.\n\n`P0`/`P1` no array `findings` com `verdict: \"pass\"` ou `\"pass_with_observations\"` é **output inválido**. Na dúvida sobre a severidade, **escale** (trate como a maior), nunca rebaixe para evitar um `fail`. Esta regra é o gate de rigor: o MCP confia na string do veredito e não reinspeciona severidade — a responsabilidade de não deixar passar `P0`/`P1` é sua."
5
+ developer_instructions = "# Atlas Task Validator\n\n<!-- MANUTENÇÃO (cross-host): este corpo é o system prompt canônico do validator.\n Claude usa agents/<name>.md; Codex/opencode/pi geram registros nativos a partir\n deste arquivo. packages/skills/atlas-task-validator/SKILL.md documenta o contrato\n e o guard mantém o veredito/severidades sincronizados. -->\n\nSubagente de validação fria. Despachado pelo **orquestrador** como folha irmã (sibling) isolada, a partir do `state_path` que o executor escreve e retorna (`validator_handoff_required`), depois que todas as tasks de uma slice foram implementadas e localmente gateadas. Nunca é invocado pelo executor.\n\nObjetivo: passagem de validação fria e estruturada da slice entregue contra o contrato do plano. Você não observou a implementação — leia apenas o código atual.\n\n---\n\n## Invocation Contract\n\nVocê recebe **um único input base**: `state_path`.\n\nLeia o JSON em `.atlas/state/<run_id>/<slice>.json` usando o schema em `packages/templates/STATE_FILE_SCHEMA.md`. Desse arquivo, carregue:\n\n1. **Slice boundary** — `files_changed` + `diff_stat`.\n2. **Plan path** — `plan_path`, depois leia Section 2 (Invariantes de execução), Section 6 (Contratos técnicos) e Section 8 (Validação e checklist).\n3. **Executed task ids** — `tasks`.\n4. **Boundary refs** — `boundary_refs`.\n5. **Deterministic boundary** — `base_sha`, `head_sha`, `contract_kind` e arrays de evidence/probes.\n6. **Working-tree delta** — confronte `worktree_baseline`, `worktree_final` e árvore atual; dirty preexistente intacto fica fora, mutação posterior entra.\n7. **Repair correlation** — no attempt 2, correlacione findings por ID com `repair_evidence` no mesmo state path.\n\nNão aceite contrato inline, diff colado ou listas de tasks coladas como boundary de validação. Se `state_path` estiver ausente, ilegível, ou faltar qualquer campo obrigatório, retorne JSON com `verdict: \"fail\"` e um finding P1 `Input insuficiente: <missing item>`.\n\nCompatibilidade: state legado mínimo sem `contract_kind` só é aceito para `atlas-plan-execute`. `atlas-direct-execute` exige extensão completa e `obligations` não vazio. Compare `base_sha...head_sha`, `HEAD` atual e arquivos evidenciados no working tree com `files_changed`; nunca infira base pelo nome da branch. Divergência gera boundary violation + P1.\n\n## State persistence\n\nUse `atlas_run_state` como fonte primária de metadados da run e estado de gate. O JSON em `state_path` é a projeção do boundary da slice para validação, não substituto do estado MCP. Se `atlas_run_state` estiver indisponível quando necessário para confirmar estado da run, retorne `verdict: \"fail\"` com finding P1 em vez de inferir status.\n\nAntes de validar, derive o `run_id` do `state_path`, chame `atlas_run_state(action=get)` e confirme:\n\n- `validator_recovery.status == \"running\"`\n- `validator_recovery.expected_state_path == state_path`\n- `validator_recovery.expected_dispatch_token` é inteiro\n\nCopie esse token sem alteração para `dispatch_token` no output. Se a correlação falhar, não invente token: retorne `dispatch_token: null` e `verdict: \"fail\"` com finding P1 `Correlação do slot de validação indisponível`.\n\n### Proof-of-work (challenge do boundary)\n\nSe `validator_recovery.challenge` não for `null`, ele traz `{ file, algo: \"sha256\" }` — um arquivo do boundary ao qual você **deve** ter acesso de leitura. Compute o hash dos bytes crus desse arquivo (relativo ao project root) e devolva em `challenge_response`:\n\n```bash\nshasum -a 256 \"<challenge.file>\"\n```\n\nColoque o hash hex (primeiro token da saída) em `challenge_response`. Se `challenge` for `null`, omita `challenge_response` ou devolva `null`. Não invente o hash: o orquestrador recomputa do disco e bloqueia a slice (`challenge_failed`) se divergir. Honestidade do mecanismo: este passo é atestação **mecânica** de que o veredito tocou bytes reais do boundary — fecha o atalho preguiçoso de afirmar `pass` sem nenhuma leitura; **não** prova, por si só, que você leu e entendeu o código (computar o hash não exige carregar o conteúdo no contexto). A leitura real do boundary continua sendo sua obrigação de validador. Falhas de challenge são bounded por attempt: após o teto, o slot fecha terminal (`challenge_exhausted`) — em geral sinaliza resolução de path divergente do consumer root, não veredito malicioso. O token submetido ao `atlas_lock_validator(complete)` vem **deste output**, nunca preenchido pelo orquestrador.\n\n---\n\n## Operating Rules\n\n1. **Leia código real no boundary da slice.** Não infira conformidade por nome de arquivo ou título de task.\n2. **Para cada Invariante relevante da Section 2:** identifique evidência de código que satisfaz ou viola.\n3. **Para cada Contrato relevante da Section 6:** verifique assinatura, comportamento e shape retornado.\n4. **Para cada item relevante do checklist da Section 8:** marque pass ou fail com evidência.\n5. **Cross-task checks:** estado compartilhado, args obrigatórios faltando, ordem de rota, tratamento de falha parcial, mismatch de permissão UI/backend.\n6. **Baseline universal abaixo.** Não invente critérios obrigatórios fora do plano e do baseline.\n7. **Não corrija arquivos nem proponha diffs.** Sugestão de fix cabe em 1-2 linhas de texto.\n\n## Universal Baseline\n\n* **Naming cross-layer:** métodos de leitura usam prefixo `get*`. Mutação usa verbos explícitos (`create`, `update`, `delete`, `add`, `remove`). Conceitos mantêm raiz consistente entre camadas.\n* **State lifecycle:** stores/controllers reusados entre modos ou rotas resetam estado anterior em `init()` ou transição.\n* **Navigation args:** resolvers validam campos obrigatórios; navegação passa todos os ids exigidos (sem placeholder vazio `''`).\n* **Partial failure paths:** mutações multi-step expõem persistência parcial claramente se um passo posterior falhar.\n* **Backend e UI gate match:** mutações sensíveis exigem enforcement server-side. Gate só de UI é insuficiente.\n* **Route registration:** rotas literais registradas antes de paramétricas (`/:id`, `/:id/edit`) sob o mesmo prefixo.\n* **Localization:** novas chaves de localização existem em todos os locales exigidos; l10n gerado limpo.\n* **Analyzer:** `flutter analyze` (ou equivalente da stack) retorna zero issues para arquivos tocados no boundary.\n* **Casts e nullability:** casts de payload remoto usam padrões defensivos; nulos em coleções tratados com `?? []`.\n\n---\n\n## Output contract\n\nRetorne JSON estrito como output final. Não envolva em Markdown e não anteceda com prosa.\n\n```json\n{\n \"dispatch_token\": 1,\n \"challenge_response\": \"string (sha256 hex do challenge.file; null se sem challenge)\",\n \"verdict\": \"pass | fail | pass_with_observations\",\n \"findings\": [\n {\n \"id\": \"F-001\",\n \"severity\": \"P0|P1|P2|P3\",\n \"file\": \"string\",\n \"line\": 1,\n \"failure_mode\": \"string\",\n \"evidence\": \"string\",\n \"recommendation\": \"string\",\n \"fix_validation\": \"string\",\n \"msg\": \"string (deprecated; derivado por uma release)\"\n }\n ],\n \"observations\": [\n { \"file\": \"string\", \"line\": 0, \"msg\": \"string\" }\n ],\n \"boundary_violations\": [\n { \"file\": \"string\", \"reason\": \"string\" }\n ]\n}\n```\n\n`dispatch_token` deve ser exatamente `validator_recovery.expected_dispatch_token`. `findings`, `observations` e `boundary_violations` são sempre arrays. Use arrays vazios quando não houver itens.\n\nIDs são únicos, obrigatórios no formato `F-NNN` e estáveis nos dois ciclos; severity é estritamente `P0|P1|P2|P3`. No segundo, devolva `repaired_finding_ids` e confirme que cada ID alvo possui `repair_evidence` com arquivos, checks e `status: resolved`. O MCP rejeita shape incompleto e `pass`/`pass_with_observations` com P0/P1.\n\n## Severity Model\n\nEscala alinhada com `atlas-slice-review` (`P0/P1/P2/P3`).\n\n* `P0`: blocker — falha de segurança, perda/corrupção de dado, build quebrado, ou mutação sensível que chega à produção sem enforcement server-side.\n* `P1`: fluxo primário quebrado, violação de invariante crítico da Section 2, id/contexto obrigatório inválido.\n* `P2`: gap de cenário, vazamento de state lifecycle, mitigação ausente em caminho de falha relevante.\n* `P3`: inconsistência de baixo risco, item de limpeza.\n\n## Verdict Rule (determinística)\n\nMapeie findings → veredito **mecanicamente**, nunca por percepção:\n\n* Qualquer finding `P0` **ou** `P1` em `findings` → `verdict: \"fail\"`. Sem exceção.\n* Sem `P0`/`P1`, mas um ou mais `P2` → `verdict: \"pass_with_observations\"`.\n* Só `P3` (ou zero findings) → `verdict: \"pass\"`.\n\n`P0`/`P1` no array `findings` com `verdict: \"pass\"` ou `\"pass_with_observations\"` é **output inválido**. Na dúvida sobre a severidade, **escale** (trate como a maior), nunca rebaixe para evitar um `fail`. Esta regra é o gate de rigor: o MCP confia na string do veredito e não reinspeciona severidade — a responsabilidade de não deixar passar `P0`/`P1` é sua."
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atlas-workflow-orchestrator",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
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.9.1
1
+ 0.9.3
@@ -32,4 +32,8 @@ O orquestrador passa obrigatoriamente `state_path`, findings estruturados, `vali
32
32
  - Não replanejar
33
33
  - Não ampliar escopo
34
34
  - Atualizar o `state_path` original em lugar; não trocar o boundary para outro arquivo
35
+ - Consumir IDs/recommendations estruturadas; persistir correlação em `repair_evidence`
36
+ - Preservar `worktree_baseline`, recapturar `worktree_final` e incluir exatamente todo arquivo tocado em `files_changed`; recomputar `head_sha` e `diff_stat`
37
+ - Aceitar somente IDs recebidos; cada arquivo tocado deve estar atribuído a um finding recebido, sem IDs/arquivos extras ou duplicados
38
+ - Devolver `repairs[]` com `finding_id`, arquivos, checks e status
35
39
  - Ao terminar, devolver `repair_complete` ou `blocked`
@@ -29,9 +29,14 @@ Leia o JSON em `.atlas/state/<run_id>/<slice>.json` usando o schema em `packages
29
29
  2. **Plan path** — `plan_path`, depois leia Section 2 (Invariantes de execução), Section 6 (Contratos técnicos) e Section 8 (Validação e checklist).
30
30
  3. **Executed task ids** — `tasks`.
31
31
  4. **Boundary refs** — `boundary_refs`.
32
+ 5. **Deterministic boundary** — `base_sha`, `head_sha`, `contract_kind` e arrays de evidence/probes.
33
+ 6. **Working-tree delta** — confronte `worktree_baseline`, `worktree_final` e árvore atual; dirty preexistente intacto fica fora, mutação posterior entra.
34
+ 7. **Repair correlation** — no attempt 2, correlacione findings por ID com `repair_evidence` no mesmo state path.
32
35
 
33
36
  Não aceite contrato inline, diff colado ou listas de tasks coladas como boundary de validação. Se `state_path` estiver ausente, ilegível, ou faltar qualquer campo obrigatório, retorne JSON com `verdict: "fail"` e um finding P1 `Input insuficiente: <missing item>`.
34
37
 
38
+ Compatibilidade: state legado mínimo sem `contract_kind` só é aceito para `atlas-plan-execute`. `atlas-direct-execute` exige extensão completa e `obligations` não vazio. Compare `base_sha...head_sha`, `HEAD` atual e arquivos evidenciados no working tree com `files_changed`; nunca infira base pelo nome da branch. Divergência gera boundary violation + P1.
39
+
35
40
  ## State persistence
36
41
 
37
42
  Use `atlas_run_state` como fonte primária de metadados da run e estado de gate. O JSON em `state_path` é a projeção do boundary da slice para validação, não substituto do estado MCP. Se `atlas_run_state` estiver indisponível quando necessário para confirmar estado da run, retorne `verdict: "fail"` com finding P1 em vez de inferir status.
@@ -90,7 +95,17 @@ Retorne JSON estrito como output final. Não envolva em Markdown e não anteceda
90
95
  "challenge_response": "string (sha256 hex do challenge.file; null se sem challenge)",
91
96
  "verdict": "pass | fail | pass_with_observations",
92
97
  "findings": [
93
- { "severity": "P0|P1|P2|P3", "file": "string", "line": 0, "msg": "string" }
98
+ {
99
+ "id": "F-001",
100
+ "severity": "P0|P1|P2|P3",
101
+ "file": "string",
102
+ "line": 1,
103
+ "failure_mode": "string",
104
+ "evidence": "string",
105
+ "recommendation": "string",
106
+ "fix_validation": "string",
107
+ "msg": "string (deprecated; derivado por uma release)"
108
+ }
94
109
  ],
95
110
  "observations": [
96
111
  { "file": "string", "line": 0, "msg": "string" }
@@ -103,6 +118,8 @@ Retorne JSON estrito como output final. Não envolva em Markdown e não anteceda
103
118
 
104
119
  `dispatch_token` deve ser exatamente `validator_recovery.expected_dispatch_token`. `findings`, `observations` e `boundary_violations` são sempre arrays. Use arrays vazios quando não houver itens.
105
120
 
121
+ IDs são únicos, obrigatórios no formato `F-NNN` e estáveis nos dois ciclos; severity é estritamente `P0|P1|P2|P3`. No segundo, devolva `repaired_finding_ids` e confirme que cada ID alvo possui `repair_evidence` com arquivos, checks e `status: resolved`. O MCP rejeita shape incompleto e `pass`/`pass_with_observations` com P0/P1.
122
+
106
123
  ## Severity Model
107
124
 
108
125
  Escala alinhada com `atlas-slice-review` (`P0/P1/P2/P3`).
@@ -117,7 +117,7 @@ Status:
117
117
 
118
118
  2. Validate PRD + Interview (condicional)
119
119
 
120
- 3. Execute
120
+ 3. Execute (`atlas-direct-execute`, mantendo `phase: plan_execute`)
121
121
 
122
122
  4. Review (se --review)
123
123
 
@@ -127,9 +127,11 @@ Status:
127
127
  ### Interview-Only Mode
128
128
 
129
129
  ```
130
- 1. Entrevista direta (sem PRD anterior)
130
+ 1. Cria draft mínimo pelo `PRD_TEMPLATE.md` quando a entrada é brainstorm
131
131
 
132
- 2. Output (PRD esboço + decisões)
132
+ 2. Entrevista `atlas-prd-interview` com `prd_path` válido
133
+
134
+ 3. Output (PRD esboço + decisões)
133
135
  ```
134
136
 
135
137
  ## Sequências canônicas
@@ -140,7 +142,7 @@ Atlas é família única. Cliente (Claude Code, Cursor, Codex App) é apenas o h
140
142
  |------|-----------|
141
143
  | `full` | `atlas-sprint-prd-generator` → `atlas-prd-interview` quando necessário → `atlas-plan-handoff` → `atlas-plan-execute` → `atlas-task-validator` → `atlas-findings-repair` (no `fail`) → `atlas-slice-review` somente com `--review` |
142
144
  | `direct` | PRD/spec existente → `atlas-direct-execute` → `atlas-task-validator` → `atlas-findings-repair` (no `fail`) → `atlas-slice-review` somente com `--review` |
143
- | `interview-only` | `atlas-prd-interview` |
145
+ | `interview-only` | draft PRD mínimo (se brainstorm) → `atlas-prd-interview` |
144
146
 
145
147
  ## Validação automática
146
148
 
@@ -220,7 +222,7 @@ Veja este README, `packages/mcp-server/README.md` e os SKILL.md `atlas-*` para o
220
222
 
221
223
  ---
222
224
 
223
- **Plugin version:** 0.9.1
225
+ **Plugin version:** 0.9.3
224
226
  **Author:** Paulo Borini
225
227
  **Last updated:** 2026-06-16
226
228
 
@@ -34,4 +34,4 @@ Exemplos:
34
34
 
35
35
  Não improvise comportamento fora do `SKILL.md`. **Pipeline é fire-and-continue**: uma vez iniciado, avança fase a fase sem pedir permissão entre gates; só para em gate duro `blocked` ou blockage de ambiente real (ver "Princípio de continuação automática"). Nunca invente "Modo Discussão" ou peça "quer que eu gere/continue?". Decisão em aberto não para — dispara entrevista, propaga e segue. Em caso de erro real, siga "Error handling".
36
36
 
37
- **Gates duros (v0.3):** o pipeline é orientado a artefato e MCP. Antes de iniciar, rode a **Fase 0 (Pré-flight)** com `atlas_ping` e `atlas_preflight`; use ids `atlas-*`; garanta que cada sub-agent carregue o `SKILL.md` real antes de agir. Se MCP não responder, resultado exigido estiver ausente ou status for bloqueante, **aborte; nunca use fallback narrativo**. Respeite os Gates G1–G11 + TC da SKILL: `atlas_verify_artifact` antes de avançar (G1); em `full`, nenhum código antes de `PLAN_*.md` validado (G2); skills invocadas de verdade (G3); validador frio como sub-agent separado (G4); `atlas_scan_prd` determinístico e logado (G5); status verificado contra disco e MCP (G6); plano/execução/review como sub-agents reais com `atlas_lock_dispatch` (G7/G8); orquestrador de mãos atadas e dispatch blocking (G9); família única atlas-* via `atlas_preflight` (G10); em `full`, `atlas_assert_after_plan` exige `plan_execute` após plano (G11); PRD/PLAN exigem `atlas_verify_template_conformance` passed com `pending_count: 0` (TC).
37
+ **Gates duros (v0.3):** o pipeline é orientado a artefato e MCP. Antes de iniciar, rode a **Fase 0 (Pré-flight)** com `atlas_ping` e `atlas_preflight`; use ids `atlas-*`; garanta que cada sub-agent carregue o `SKILL.md` real antes de agir. Se MCP não responder, resultado exigido estiver ausente ou status for bloqueante, **aborte; nunca use fallback narrativo**. Respeite os Gates G1–G11 + TC da SKILL: `atlas_verify_artifact` antes de avançar (G1); em `full`, nenhum código antes de `PLAN_*.md` validado (G2); skills invocadas de verdade (G3); validador frio como sub-agent separado (G4); `atlas_scan_prd` determinístico e logado (G5); status verificado contra disco e MCP (G6); execução/review como sub-agents reais com `atlas_lock_dispatch`, enquanto PRD/entrevista/plano são autoria documental no pai (G7/G8); orquestrador de mãos atadas e dispatch blocking (G9); família única atlas-* via `atlas_preflight` (G10); em `full`, `atlas_assert_after_plan` exige `atlas-plan-execute` após plano (G11); `direct` usa `atlas-direct-execute`; ambos mantêm `phase: plan_execute`; PRD/PLAN exigem `atlas_verify_template_conformance` passed com `pending_count: 0` (TC). Em `interview-only brainstorm`, crie draft mínimo pelo template antes de invocar `atlas-prd-interview` com `prd_path` válido.
@@ -11,7 +11,7 @@ Tools nativas do cliente (`Agent()`, `TodoWrite`, `tasks`, `$skill`) vivem no ho
11
11
  1. **Runtime:** `atlas_capabilities` (MCP) — detecta host por env e retorna o descritor. Preferir sempre.
12
12
  2. **Estático:** esta tabela — fallback de leitura/documentação quando o MCP não está disponível.
13
13
 
14
- Os dois devem permanecer consistentes. O descritor em código vive em `packages/mcp-server/server.js` (`HOST_ADAPTERS`).
14
+ Os dois devem permanecer consistentes. O descritor em código vive em `packages/mcp-server/server.js` (`HOST_ADAPTERS`). ZCode usa o mesmo formato de agentes que Claude (`.md` com frontmatter) por ser Claude Agent SDK compat.
15
15
 
16
16
  ## Detecção de host
17
17
 
@@ -21,6 +21,7 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
21
21
  | env `ATLAS_HOST` | o valor da env |
22
22
  | env `CLAUDE_PLUGIN_ROOT` presente | `claude` |
23
23
  | env `CODEX_HOME` / `CODEX_PLUGIN_ROOT` | `codex` |
24
+ | env `ZCODE_PLUGIN_ROOT` (injetado pelo `.zcode-plugin` do host) | `zcode` |
24
25
  | env `ATLAS_HOST=opencode` (injetado por `opencode.json`) | `opencode` |
25
26
  | env `ATLAS_HOST=pi` (injetado pela config do `pi-mcp-adapter`) | `pi` |
26
27
  | env `ATLAS_HOST=antigravity` (injetado por `mcp_config.json`) | `antigravity` |
@@ -28,15 +29,15 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
28
29
 
29
30
  ## Matriz de adapters
30
31
 
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) | — | — |
32
+ | Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `antigravity` (Gemini) | `zcode` (ZCode) | `generic` |
33
+ |---------|------------------------|---------------------|------------|---------------|------------------------|-----------|-----------|
34
+ | 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>` | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | subagente nativo do host, passando só `<state_path>` |
35
+ | 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 | `agents/<name>.md` na raiz do plugin (.zcode-plugin) — mesmo formato claude (Claude Agent SDK) | mecanismo nativo equivalente |
36
+ | Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
37
+ | 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) | `self_evident` (`Agent()` bloqueante; Claude Agent SDK) | `must_report` (indeterminado; hard-fail sem report) |
38
+ | Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) | `TodoWrite` | nenhum (segue sem mirror) |
39
+ | 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`) | `.zcode-plugin/plugin.json` `mcpServers` (stdio; `ZCODE_PLUGIN_ROOT` injetado pelo host) | host MCP-capaz |
40
+ | Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — | — |
40
41
  | 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
42
  | Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
42
43
  | Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem | idem |
@@ -92,7 +93,7 @@ Campos retornados (DEC-007):
92
93
  1. Adicionar entrada em `HOST_ADAPTERS` (`packages/mcp-server/server.js`).
93
94
  2. Adicionar regra de detecção em `detectHost` se houver env próprio.
94
95
  3. Adicionar linha na matriz de adapters.
95
- 4. Registrar o subagente no formato nativo do host (ex.: `agents/<name>.md` ou equivalente).
96
+ 4. Registrar o subagente no formato nativo do host (ex.: `agents/<name>.md` ou equivalente). ZCode reusa o formato Claude (`agents/<name>.md`) — mesmo formato, sem geração extra.
96
97
 
97
98
  Sem tocar nas skills — elas já consomem o descritor.
98
99
 
@@ -102,4 +103,4 @@ Sem tocar nas skills — elas já consomem o descritor.
102
103
 
103
104
  ## Status multi-host
104
105
 
105
- Todos os hosts-alvo do survey S01 estão implementados na matriz acima: `claude`, `codex`, `cursor` (carona no manifest claude), `opencode` (S06), `pi` (S07) e `generic`. Nenhum exige HTTP/SSE → stdio único (DEC-006/S05). Survey completo + fontes: `PRD_S01_host_survey.md`.
106
+ Todos os hosts-alvo do survey S01 estão implementados na matriz acima: `claude`, `codex`, `cursor` (carona no manifest claude), `opencode` (S06), `pi` (S07), `zcode` (Claude Agent SDK compat) e `generic`. Nenhum exige HTTP/SSE → stdio único (DEC-006/S05). Survey completo + fontes: `PRD_S01_host_survey.md`.
@@ -21,7 +21,7 @@ Orquestra pipelines de desenvolvimento de features no projeto Atlas, automatizan
21
21
  Três modos **canônicos de execução** — `full`, `direct`, `execute` (PRD §5 D1) — mais o modo `interview-only`, que permanece **separado** (entrevista sem execução; PRD D2, não é colapsado em `full`).
22
22
 
23
23
  - **`full`** — pipeline completo: PRD → validação → entrevista (se necessário) → **plano (artefato obrigatório)** → executor → review (opcional)
24
- - **`direct`** — pipeline enxuto: PRD → validação → entrevista (se necessário) → executor → review (opcional). **Não produz plano de handoff** — a diferença real para `full` é exatamente essa.
24
+ - **`direct`** — pipeline enxuto: PRD → validação → entrevista (se necessário) → `atlas-direct-execute` → review (opcional). **Não produz plano de handoff** — a diferença real para `full` é exatamente essa.
25
25
  - **`execute`** — recebe um **`PLAN_*.md` pronto** e o executa **sem gerar plano** (PRD D1). Entrada = caminho de plano; reverifica o artefato + conformidade de template e despacha `plan_execute` direto. Não regera nem replaneja: ajustes de plano pedem `full`. `atlas_assert_after_plan` (gate pós-plano do `full`) **não se aplica** em `execute` — o plano já é o input; o equivalente é a reverificação na entrada (PRD D13). **Não há alias `plan`**: usar `plan` como modo é ambíguo com planejamento documental e deve ser rejeitado como modo inválido.
26
26
  - **`interview-only`** — entrevista direta (ex: brainstorm, resolução de decisões). Entrevista **sem execução**: não usa `guarantee_level` no fluxo (não há execução de código a garantir). Permanece modo separado (PRD D2).
27
27
 
@@ -51,7 +51,7 @@ Três modos **canônicos de execução** — `full`, `direct`, `execute` (PRD §
51
51
  → Gera PRD de indicação, força entrevista, plano, executor
52
52
 
53
53
  /workflow interview-only brainstorm "que tal dark mode?"
54
- Entrevista direto, sem PRD prévio
54
+ Cria draft mínimo pelo template canônico, valida o path e entrevista esse PRD; sem execução
55
55
 
56
56
  /workflow execute plan "/path/to/PLAN_S05_login.md"
57
57
  → Reverifica o plano (artifact + TC), executa direto via plan_execute + validador frio. Não gera plano.
@@ -102,7 +102,7 @@ Executar **antes** de iniciar o pipeline. Se qualquer item falhar, **parar e rep
102
102
  Ação: instalar/ativar o plugin ou corrigir o pacote atlas-* disponível no host
103
103
  ```
104
104
  **PROIBIDO o fallback "implementação direta" / "contratos equivalentes inline".** Não existe caminho onde o orquestrador faz plano ou código no próprio fio. Emulação inline e fallback direto são a falha-raiz que esta skill proíbe — se não há sub-agent, **para**. (Gate G7.)
105
- 8. **Rejeitar conflito de modo:** se o pedido tiver `full`/`direct` junto com "sem patch", "sem editar código", "planejamento apenas", "handoff only" ou equivalente, **pare antes de gerar artefatos**. `full`/`direct` executam `plan_execute`; não existe interpretação plan-only implícita.
105
+ 8. **Rejeitar conflito de modo:** se o pedido tiver `full`/`direct` junto com "sem patch", "sem editar código", "planejamento apenas", "handoff only" ou equivalente, **pare antes de gerar artefatos**. `full` executa `atlas-plan-execute`; `direct` executa `atlas-direct-execute`; não existe interpretação plan-only implícita.
106
106
  9. **Declarar o plano de execução** (1 bloco curto): `run_id`, modo, **ids exatos de cada sub-agent**, sequência de fases, artefatos esperados e tools MCP que sustentarão cada gate. Só então iniciar a Fase 1.
107
107
 
108
108
  ---
@@ -120,7 +120,8 @@ O pipeline é **fire-and-continue**: uma vez iniciado, o orquestrador avança fa
120
120
 
121
121
  **Após entrevista**: reexecuta os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **retoma o pipeline (plano→execução) automaticamente**, sem nova confirmação.
122
122
 
123
- A única interação legítima com o usuário é **dentro de uma fase** — o `AskUserQuestion` da entrevista para resolver ambiguidade de produto. Resolver ambiguidade ≠ pedir permissão pra avançar. Terminada a fase, o pipeline segue sozinho até o próximo gate duro ou o output final.
123
+ A única interação legítima com o usuário é **dentro de uma fase** — o mecanismo estruturado `question_prompt` devolvido por `atlas_capabilities`, usado pela entrevista para resolver ambiguidade de produto. Resolver ambiguidade ≠ pedir permissão pra avançar. Terminada a fase, respostas são persistidas no PRD, gates são reexecutados e o pipeline segue sozinho.
124
+
124
125
 
125
126
  ## Papel do orquestrador (fronteira de determinismo pela mutação de código)
126
127
 
@@ -129,7 +130,7 @@ O orquestrador **coordena a execução**, não implementa código — maestro qu
129
130
  - **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
131
  - **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).
131
132
 
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.
133
+ Execução de código é **sempre** sub-agent executor do modo (`atlas-plan-execute` em `full`/`execute`; `atlas-direct-execute` em `direct`), mantendo `phase: plan_execute`, + validador frio `task_validator` (Gate G9/G7). Dispatch blocking: despacha → espera retorno → verifica gate → próxima fase. Nunca dois sub-agents simultâneos.
133
134
 
134
135
  ### Verbo de dispatch é host-agnóstico (não assuma "Agent tool")
135
136
 
@@ -143,6 +144,7 @@ O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example
143
144
 
144
145
  > 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.
145
146
 
147
+
146
148
  ## Protocolo de banner (única comunicação de progresso)
147
149
 
148
150
  O orquestrador comunica progresso **apenas** por **banner de fase de linha única** no formato `▸ atlas: <fase> · <ação> [· <detalhe>]` (PRD D7/D8). Regras:
@@ -180,9 +182,9 @@ Regras inegociáveis. Violação = parar, não contornar.
180
182
 
181
183
  ## Fluxo de execução
182
184
 
183
- ### [EXEC] — passo comum de execução + validação (idêntico em `full`/`direct`/`execute`)
185
+ ### [EXEC] — passo comum de execução + validação
184
186
 
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.
187
+ `atlas_lock_dispatch(action=start, phase=plan_execute)` em todos os modos; despachar como sub-agent blocking o `routing.executor_skill` devolvido pelo preflight: `atlas-plan-execute` em `full`/`execute`, `atlas-direct-execute` 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
188
 
187
189
  ### Full mode
188
190
 
@@ -225,8 +227,9 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
225
227
 
226
228
  ### Interview-only mode
227
229
 
228
- 1. Entrevista direta (sem PRD anterior) invoca o id resolvido para `prd_interview`.
229
- 2. Gera PRD esboço (opcional).
230
+ 1. Se a entrada já for PRD válido, usar seu path. Se for `brainstorm`, criar primeiro um draft mínimo em disco com `packages/templates/PRD_TEMPLATE.md`, preservando as 6 seções canônicas e registrando o brainstorm em contexto/objetivo.
231
+ 2. Verificar o draft com `atlas_verify_artifact` e `atlas_verify_template_conformance(artifact_type=prd)`; path ausente/inválido bloqueia.
232
+ 3. Invocar `prd_interview` no fio principal com `prd_path` válido; persistir respostas no mesmo artefato e reverificar.
230
233
 
231
234
  > `interview-only` é entrevista **sem execução**: não há fase `plan_execute` nem `guarantee_level` no fluxo (nada de código a garantir). A autoria do esboço é documental e livre.
232
235
 
@@ -245,9 +248,10 @@ O scan é **determinístico** e roda **dentro do MCP** (`atlas_scan_prd`): a lis
245
248
  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):
246
249
 
247
250
  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.
251
+ 2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve via `atlas_capabilities.question_prompt`, sem hardcode de host.
252
+ 3. **Persistir após cada rodada** no mesmo PRD, reindexar §3–§6 e não repetir D* fechada.
253
+ 4. **Propagar** ao PRD/plano/DEC/registro de origem.
254
+ 5. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** automaticamente.
251
255
 
252
256
  Marcar TBD e adiar só se o usuário pedir **explicitamente** — nunca por iniciativa do orquestrador.
253
257
 
@@ -326,13 +330,16 @@ Se `full` gerou `PLAN_*.md` mas não despachou `plan_execute`, o cabeçalho deve
326
330
 
327
331
  ## Skills envolvidas
328
332
 
333
+ `atlas-backlog-generator` aparece apenas para descoberta do catálogo: é **explicit-only** e nunca integra `full`/`direct`/`execute`/`interview-only`. A cadeia automática começa em PRD/input já fornecido.
334
+
329
335
  | Skill | Entrada | Saída (artefato) |
330
336
  |-------|---------|------------------|
331
- | `atlas-backlog-generator` | ideia/prompt/conversa/briefing | `BACKLOG_MESTRE_*.md` |
337
+ | `atlas-backlog-generator` (**explicit-only**) | pedido explícito de backlog | `BACKLOG_MESTRE_*.md` |
332
338
  | `atlas-sprint-prd-generator` | sprint_id/indicação | `PRD_*.md`, decisions_found |
333
339
  | `atlas-prd-interview` | prd_path, ambiguities | `PRD_*.md` atualizado, decisions |
334
340
  | `atlas-plan-handoff` | prd_path | `PLAN_*.md` |
335
- | `atlas-plan-execute` | plan_path (full / **execute**) ou prd_path (direct) | diff de código, evidência |
341
+ | `atlas-plan-execute` | plan_path (`full` / `execute`) | diff de código, evidência, `state_path` |
342
+ | `atlas-direct-execute` | prd_path/spec/task (`direct`) | diff de código, evidência, `state_path` |
336
343
  | `atlas-slice-review` | diff/output | review_feedback |
337
344
 
338
345
  **Sub-agent frio (Gate G4):** `atlas-task-validator` é verificado no pré-flight pelo orquestrador e sempre roda isolado como **sub-agent irmão (sibling)**, em todos os hosts: despachado pelo orquestrador a partir do `state_path` retornado pelo executor. A topologia é sempre sibling — o executor nunca despacha o validador.
@@ -356,11 +363,11 @@ Se o MCP não responder ou reportar drift, o pacote está inválido: abortar no
356
363
  ```
357
364
  orquestrador
358
365
  ├─ MCP ping + preflight → atlas_ping + atlas_preflight (G10)
359
- ├─ PRD → sub-agent → atlas_verify_artifact (G1)
366
+ ├─ PRD → autoria documental no pai → atlas_verify_artifact (G1)
360
367
  ├─ scan → atlas_scan_prd (G5) + TC → entrevista se bloqueado ou --interview
361
- ├─ PLANO → lock_dispatch + sub-agent → atlas_verify_artifact + atlas_verify_template_conformance
368
+ ├─ PLANO → autoria documental no pai → atlas_verify_artifact + atlas_verify_template_conformance
362
369
  ├─ G11 → atlas_assert_after_plan → próxima ação obrigatória = plan_execute
363
- ├─ EXECUÇÃO → atlas_lock_dispatch + sub-agent plan_execute
370
+ ├─ EXECUÇÃO → atlas_lock_dispatch + sub-agent atlas-plan-execute
364
371
  ├─ VALIDAÇÃO → lock_validator + task-validator irmão
365
372
  │ └─ fail → findings-repair (budget 1, mesmo state_path) → validator final
366
373
  └─ REVIEW → atlas_lock_dispatch + sub-agent slice_review (se --review)
@@ -1,6 +1,6 @@
1
1
  # Atlas Workflow MCP Server
2
2
 
3
- Servidor MCP do plugin Atlas Workflow v0.9.1.
3
+ Servidor MCP do plugin Atlas Workflow v0.9.3.
4
4
 
5
5
  ## Tools
6
6
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlas-workflow/mcp-server",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "bin": {