atlas-workflow 0.9.2 → 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 (84) 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/hosts/opencode/.opencode/atlas/VERSION +1 -1
  6. package/hosts/opencode/.opencode/atlas/orchestrator/README.md +1 -1
  7. package/hosts/opencode/.opencode/atlas/orchestrator/references/host-adapters.md +13 -12
  8. package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
  9. package/hosts/opencode/.opencode/atlas/packages/mcp-server/README.md +1 -1
  10. package/hosts/opencode/.opencode/atlas/packages/mcp-server/package.json +1 -1
  11. package/hosts/opencode/.opencode/atlas/packages/mcp-server/server.js +69 -7
  12. package/hosts/opencode/.opencode/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
  13. package/hosts/pi/atlas/VERSION +1 -1
  14. package/hosts/pi/atlas/orchestrator/README.md +1 -1
  15. package/hosts/pi/atlas/orchestrator/references/host-adapters.md +13 -12
  16. package/hosts/pi/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
  17. package/hosts/pi/atlas/packages/mcp-server/README.md +1 -1
  18. package/hosts/pi/atlas/packages/mcp-server/package.json +1 -1
  19. package/hosts/pi/atlas/packages/mcp-server/server.js +69 -7
  20. package/hosts/pi/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
  21. package/hosts/zcode/.zcode-plugin/plugin.json +27 -0
  22. package/hosts/zcode/agents/atlas-direct-execute.md +31 -0
  23. package/hosts/zcode/agents/atlas-findings-repair.md +39 -0
  24. package/hosts/zcode/agents/atlas-plan-execute.md +33 -0
  25. package/hosts/zcode/agents/atlas-slice-review.md +27 -0
  26. package/hosts/zcode/agents/atlas-task-validator.md +138 -0
  27. package/hosts/zcode/packages/mcp-server/README.md +29 -0
  28. package/hosts/zcode/packages/mcp-server/VERSION +1 -0
  29. package/hosts/zcode/packages/mcp-server/package.json +15 -0
  30. package/hosts/zcode/packages/mcp-server/server.js +3897 -0
  31. package/hosts/zcode/packages/orchestrator/README.md +270 -0
  32. package/hosts/zcode/packages/orchestrator/commands/workflow.md +37 -0
  33. package/hosts/zcode/packages/orchestrator/defaults/paths.md +21 -0
  34. package/hosts/zcode/packages/orchestrator/references/host-adapters.md +106 -0
  35. package/hosts/zcode/packages/orchestrator/references/qa_s13_matrix.md +141 -0
  36. package/hosts/zcode/packages/orchestrator/references/subagent_dispatch.md +42 -0
  37. package/hosts/zcode/packages/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +391 -0
  38. package/hosts/zcode/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +855 -0
  39. package/hosts/zcode/packages/templates/BOUNDARY_PRD_PLAN.md +93 -0
  40. package/hosts/zcode/packages/templates/PERGUNTAS_EM_ABERTO_TEMPLATE.md +139 -0
  41. package/hosts/zcode/packages/templates/PLAN_TEMPLATE.md +146 -0
  42. package/hosts/zcode/packages/templates/PRD_TEMPLATE.md +150 -0
  43. package/hosts/zcode/packages/templates/STATE_FILE_SCHEMA.md +56 -0
  44. package/hosts/zcode/skills/_shared/references/stack-profiles.md +36 -0
  45. package/hosts/zcode/skills/_shared/scripts/document_quality.mjs +252 -0
  46. package/hosts/zcode/skills/atlas-backlog-generator/SKILL.md +93 -0
  47. package/hosts/zcode/skills/atlas-backlog-generator/agents/openai.yaml +4 -0
  48. package/hosts/zcode/skills/atlas-direct-execute/SKILL.md +221 -0
  49. package/hosts/zcode/skills/atlas-direct-execute/agents/openai.yaml +7 -0
  50. package/hosts/zcode/skills/atlas-findings-repair/SKILL.md +158 -0
  51. package/hosts/zcode/skills/atlas-findings-repair/agents/openai.yaml +7 -0
  52. package/hosts/zcode/skills/atlas-plan-execute/SKILL.md +175 -0
  53. package/hosts/zcode/skills/atlas-plan-execute/agents/openai.yaml +7 -0
  54. package/hosts/zcode/skills/atlas-plan-execute/references/plan-contract.md +88 -0
  55. package/hosts/zcode/skills/atlas-plan-execute/references/quality-gates.md +60 -0
  56. package/hosts/zcode/skills/atlas-plan-execute/scripts/check_budget_state.py +96 -0
  57. package/hosts/zcode/skills/atlas-plan-execute/scripts/extract_plan_contract.py +191 -0
  58. package/hosts/zcode/skills/atlas-plan-execute/scripts/validate_gate_result.py +56 -0
  59. package/hosts/zcode/skills/atlas-plan-handoff/SKILL.md +183 -0
  60. package/hosts/zcode/skills/atlas-plan-handoff/agents/openai.yaml +7 -0
  61. package/hosts/zcode/skills/atlas-prd-interview/SKILL.md +82 -0
  62. package/hosts/zcode/skills/atlas-prd-interview/agents/openai.yaml +7 -0
  63. package/hosts/zcode/skills/atlas-slice-review/SKILL.md +156 -0
  64. package/hosts/zcode/skills/atlas-slice-review/agents/openai.yaml +4 -0
  65. package/hosts/zcode/skills/atlas-slice-review/references/review-contract.md +58 -0
  66. package/hosts/zcode/skills/atlas-slice-review/references/scenario-lenses.md +57 -0
  67. package/hosts/zcode/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
  68. package/hosts/zcode/skills/atlas-slice-review/scripts/classify_findings.py +24 -0
  69. package/hosts/zcode/skills/atlas-slice-review/scripts/extract_review_slice.py +158 -0
  70. package/hosts/zcode/skills/atlas-sprint-prd-generator/SKILL.md +77 -0
  71. package/hosts/zcode/skills/atlas-sprint-prd-generator/agents/openai.yaml +7 -0
  72. package/hosts/zcode/skills/atlas-task-validator/SKILL.md +173 -0
  73. package/hosts/zcode/skills/atlas-task-validator/agents/openai.yaml +7 -0
  74. package/hosts/zcode/skills/atlas-workflow-orchestrator/SKILL.md +391 -0
  75. package/package.json +1 -1
  76. package/plugins/atlas-workflow-orchestrator/.codex-plugin/plugin.json +1 -1
  77. package/plugins/atlas-workflow-orchestrator/VERSION +1 -1
  78. package/plugins/atlas-workflow-orchestrator/orchestrator/README.md +1 -1
  79. package/plugins/atlas-workflow-orchestrator/orchestrator/references/host-adapters.md +13 -12
  80. package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
  81. package/plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md +1 -1
  82. package/plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json +1 -1
  83. package/plugins/atlas-workflow-orchestrator/packages/mcp-server/server.js +69 -7
  84. package/plugins/atlas-workflow-orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env python3
2
+ """Extract execution-relevant sections from a atlas-plan-handoff markdown artifact."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import pathlib
9
+ import re
10
+ import sys
11
+ from typing import Any
12
+
13
+ HEADING_RE = re.compile(r"^(#{1,4})\s+(.*\S)\s*$")
14
+ TASK_RE = re.compile(r"^T\d{2}\.\s+")
15
+
16
+
17
+ def normalize_heading(text: str) -> str:
18
+ text = re.sub(r"^\d+\.\s*", "", text.strip())
19
+ text = re.sub(r"\(§\d+\)", "", text, flags=re.IGNORECASE)
20
+ return re.sub(r"[^a-z0-9]+", "_", text.lower()).strip("_")
21
+
22
+
23
+ def has_any(summary: dict[str, list[str]], keys: list[str]) -> bool:
24
+ return any(key in summary for key in keys)
25
+
26
+
27
+ def first_section(summary: dict[str, list[str]], keys: list[str]) -> list[str]:
28
+ for key in keys:
29
+ if key in summary:
30
+ return summary[key]
31
+ return []
32
+
33
+
34
+ def parse_plan(text: str) -> dict[str, Any]:
35
+ sections: list[dict[str, Any]] = []
36
+ current: dict[str, Any] | None = None
37
+
38
+ for raw_line in text.splitlines():
39
+ line = raw_line.rstrip()
40
+ match = HEADING_RE.match(line)
41
+ if match:
42
+ level = len(match.group(1))
43
+ title = match.group(2).strip()
44
+ current = {
45
+ "level": level,
46
+ "title": title,
47
+ "key": normalize_heading(title),
48
+ "lines": [],
49
+ }
50
+ sections.append(current)
51
+ continue
52
+ if current is not None:
53
+ current["lines"].append(line)
54
+
55
+ tasks = []
56
+ for section in sections:
57
+ if section["level"] == 4 and TASK_RE.match(section["title"]):
58
+ tasks.append(
59
+ {
60
+ "id": section["title"].split(".", 1)[0],
61
+ "title": section["title"],
62
+ "body": [line for line in section["lines"] if line.strip()],
63
+ }
64
+ )
65
+
66
+ summary = {section["key"]: [line for line in section["lines"] if line.strip()] for section in sections}
67
+ metadata = {
68
+ "plan_prefix": "",
69
+ "execution_mode": "",
70
+ "executor_skill": "",
71
+ "internal_validator": "",
72
+ "external_review": "",
73
+ }
74
+
75
+ metadata_section = first_section(
76
+ summary,
77
+ ["execution_metadata", "metadados_de_execu_o", "metadados_execu_o"],
78
+ )
79
+ for line in metadata_section:
80
+ lowered = line.lower()
81
+ if "plan prefix" in lowered:
82
+ metadata["plan_prefix"] = line.split(":", 1)[-1].strip().strip("`")
83
+ elif "execution mode" in lowered:
84
+ metadata["execution_mode"] = line.split(":", 1)[-1].strip().strip("`")
85
+ elif "executor skill" in lowered:
86
+ metadata["executor_skill"] = line.split(":", 1)[-1].strip().strip("`")
87
+ elif "internal validator" in lowered:
88
+ metadata["internal_validator"] = line.split(":", 1)[-1].strip().strip("`")
89
+ elif "external review" in lowered:
90
+ metadata["external_review"] = line.split(":", 1)[-1].strip().strip("`")
91
+
92
+ # Compact PLAN_TEMPLATE (sections 1–8); legacy aliases kept for older artifacts.
93
+ required_groups = {
94
+ "execution_metadata": ["execution_metadata", "metadados_de_execu_o", "metadados_execu_o"],
95
+ "executive_translation": [
96
+ "tradu_o_executiva",
97
+ "executive_summary",
98
+ "executive_translation",
99
+ "resumo_executivo",
100
+ ],
101
+ "execution_invariants": [
102
+ "invariantes_de_execu_o",
103
+ "invariantes_de_execu_o_derivados_do_prd",
104
+ "execution_invariants",
105
+ ],
106
+ "pitfalls": ["pitfalls"],
107
+ "sprint_opening_state": [
108
+ "estado_na_abertura_da_sprint",
109
+ "estado_na_abertura_da_sprint_pr_implementa_o",
110
+ "current_state_relevant_to_execution",
111
+ "estado_atual_relevante_para_execu_o",
112
+ ],
113
+ "execution_tasks": ["tarefas_de_execu_o", "execution_tasks", "tarefas"],
114
+ "technical_contracts": [
115
+ "contratos_t_cnicos",
116
+ "contratos_t_cnicos_s_ambiguidade_prd_c_digo",
117
+ "technical_contracts",
118
+ ],
119
+ "validation_checklist": [
120
+ "valida_o_e_checklist",
121
+ "valida_o_e_checklist_validator",
122
+ "validation_and_checklist",
123
+ "validation",
124
+ "valida_o",
125
+ "valida_o_final",
126
+ ],
127
+ }
128
+
129
+ optional_groups = {
130
+ "slices": ["slices", "slices_somente_se_execution_mode_orchestrated_per_slice"],
131
+ "open_questions_blockers": [
132
+ "perguntas_em_aberto_e_bloqueios_reais",
133
+ "open_questions_and_real_blockers",
134
+ "open_questions",
135
+ "real_blockers",
136
+ ],
137
+ # Legacy sections — extracted if present, never required.
138
+ "handoff_prompt": ["handoff_prompt", "executor_guidance"],
139
+ "legacy_scope": ["scope", "escopo"],
140
+ "legacy_architecture": [
141
+ "solution_design_and_architecture",
142
+ "design_e_arquitetura_da_solu_o",
143
+ ],
144
+ }
145
+
146
+ missing = [name for name, aliases in required_groups.items() if not has_any(summary, aliases)]
147
+
148
+ execution_mode = metadata.get("execution_mode", "").lower()
149
+ if "orchestrated" in execution_mode and not has_any(summary, optional_groups["slices"]):
150
+ missing.append("slices")
151
+
152
+ return {
153
+ "sections": [
154
+ {"title": section["title"], "key": section["key"], "level": section["level"]}
155
+ for section in sections
156
+ ],
157
+ "tasks": tasks,
158
+ "missing_required_sections": missing,
159
+ "execution_metadata": metadata,
160
+ "summary": {
161
+ "execution_metadata": metadata_section,
162
+ "executive_translation": first_section(summary, required_groups["executive_translation"]),
163
+ "execution_invariants": first_section(summary, required_groups["execution_invariants"]),
164
+ "pitfalls": first_section(summary, required_groups["pitfalls"]),
165
+ "sprint_opening_state": first_section(summary, required_groups["sprint_opening_state"]),
166
+ "execution_tasks": first_section(summary, required_groups["execution_tasks"]),
167
+ "technical_contracts": first_section(summary, required_groups["technical_contracts"]),
168
+ "validation_checklist": first_section(summary, required_groups["validation_checklist"]),
169
+ "slices": first_section(summary, optional_groups["slices"]),
170
+ "open_questions_blockers": first_section(
171
+ summary, optional_groups["open_questions_blockers"]
172
+ ),
173
+ "handoff_prompt": first_section(summary, optional_groups["handoff_prompt"]),
174
+ },
175
+ }
176
+
177
+
178
+ def main() -> int:
179
+ parser = argparse.ArgumentParser(description=__doc__)
180
+ parser.add_argument("plan", help="Path to a markdown plan artifact")
181
+ args = parser.parse_args()
182
+
183
+ plan_path = pathlib.Path(args.plan)
184
+ payload = parse_plan(plan_path.read_text(encoding="utf-8"))
185
+ json.dump(payload, sys.stdout, indent=2)
186
+ sys.stdout.write("\n")
187
+ return 0
188
+
189
+
190
+ if __name__ == "__main__":
191
+ raise SystemExit(main())
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python3
2
+ """Classify a gate outcome into pass, fixable, or blocked."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import pathlib
9
+ import sys
10
+ from typing import Any
11
+
12
+
13
+ def load_json(path: pathlib.Path) -> dict[str, Any]:
14
+ if not path.exists():
15
+ raise FileNotFoundError(f"JSON file not found: {path}")
16
+ return json.loads(path.read_text(encoding="utf-8"))
17
+
18
+
19
+ def main() -> int:
20
+ parser = argparse.ArgumentParser(description=__doc__)
21
+ parser.add_argument("gate_result", help="JSON file describing the gate outcome")
22
+ parser.add_argument("--budget-state", help="Optional budget state JSON file")
23
+ args = parser.parse_args()
24
+
25
+ try:
26
+ payload = load_json(pathlib.Path(args.gate_result))
27
+ budget = load_json(pathlib.Path(args.budget_state)) if args.budget_state else {}
28
+ except FileNotFoundError as exc:
29
+ sys.stderr.write(f"{exc}\n")
30
+ return 1
31
+
32
+ failed_checks = payload.get("failed_checks", [])
33
+ invariant_breaks = payload.get("invariant_breaks", [])
34
+ external_blockers = payload.get("external_blockers", [])
35
+ diff_attributed = payload.get("diff_attributed", True)
36
+
37
+ if external_blockers or budget.get("blocked"):
38
+ status = "blocked"
39
+ elif failed_checks or invariant_breaks:
40
+ status = "fixable" if diff_attributed else "blocked"
41
+ else:
42
+ status = "pass"
43
+
44
+ result = {
45
+ "status": status,
46
+ "failed_checks": failed_checks,
47
+ "invariant_breaks": invariant_breaks,
48
+ "external_blockers": external_blockers,
49
+ "diff_attributed": diff_attributed,
50
+ }
51
+ print(json.dumps(result, indent=2))
52
+ return 0
53
+
54
+
55
+ if __name__ == "__main__":
56
+ raise SystemExit(main())
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: atlas-plan-handoff
3
+ description: Skill `atlas-plan-handoff`. Produz um handoff executável da família Atlas, fechando prefixo, modo de execução e gates no próprio artefato para consumo por `atlas-plan-execute` e `atlas-slice-review`.
4
+ ---
5
+
6
+ # Atlas Plan Handoff
7
+
8
+ Use esta skill quando o usuário pedir um plano executável da cadeia `atlas-*`.
9
+
10
+ O artefato segue `PLAN_TEMPLATE.md` e `BOUNDARY_PRD_PLAN.md` — **localize ambos em `<raiz-do-plugin>/packages/templates/`**. O plano **não** depende de memória do chat para prefixo, modo ou executor.
11
+
12
+ ## Resolução Canônica de Templates
13
+
14
+ * Fonte única: `packages/templates/` empacotado no plugin Atlas Workflow.
15
+ * Resolver `PLAN_TEMPLATE.md` e `BOUNDARY_PRD_PLAN.md` a partir da raiz do plugin/bundle, antes de olhar qualquer arquivo do repo consumidor.
16
+ * Template local do repo consumidor nunca sobrepõe o template empacotado.
17
+ * Se `packages/templates/PLAN_TEMPLATE.md` ou `packages/templates/BOUNDARY_PRD_PLAN.md` não existir, abortar com erro claro: `Template canônico ausente: <nome-do-template>`.
18
+ * Não usar fallback silencioso para cópias antigas, vault local ou templates globais.
19
+
20
+ ## State persistence
21
+
22
+ Use `atlas_run_state` como fonte primária de estado da run. Não leia/escreva estado por file IO direto. Se o MCP estiver indisponível, avise que o gate não pode ser comprovado e aborte a fase em vez de seguir por fallback narrativo.
23
+
24
+ ## Plan path resolution
25
+
26
+ Os paths são fornecidos pelo adapter de host: consultar `atlas_capabilities` e ler `plan_paths` (`write` + `read_order`). Referência canônica: `packages/orchestrator/references/host-adapters.md`. Valores atuais (iguais em todo host):
27
+
28
+ Escrita de novos planos: somente `.atlas/plans/`.
29
+
30
+ Leitura/migração por 1 release (ordem de `plan_paths.read_order`):
31
+
32
+ 1. `.atlas/plans/`
33
+ 2. `.cursor/plans/` com warning de depreciação
34
+ 3. `.codex/plans/` com warning de depreciação
35
+
36
+ Se um plano legado for lido, o próximo artefato gerado deve ser salvo em `.atlas/plans/`.
37
+
38
+ ## Cadeia de execução
39
+
40
+ ```text
41
+ atlas-plan-handoff → atlas-plan-execute → atlas-task-validator → atlas-slice-review (opcional, via `--review`)
42
+ ```
43
+
44
+ No workflow `full`, `atlas-plan-handoff` é autoria documental do agente principal/orquestrador. O primeiro sub-agent da cadeia só nasce em `atlas-plan-execute`.
45
+
46
+ ---
47
+
48
+ ## Fluxo obrigatório
49
+
50
+ 1. **Classificação da tarefa:** feature, ui, contract, navigation, shared, security, diagnostic, refactoring, testing. Leia instruções reais aplicáveis do repo; `project-rules/` é apenas um formato possível, nunca requisito universal.
51
+ 2. **Grounding no código:** confirme padrões, contratos, manifests e comandos reais antes de inferir. Resolva baseline/perfis via `../_shared/references/stack-profiles.md` + `detectStackProfiles(project_root, declared_commands, boundary_paths)`; não presuma Flutter nem aplique perfil fora do package correspondente.
52
+ 3. **Decisões estáveis:** sanar bloqueios com perguntas ao usuário; registrar no plano (não recopiar tabela D* do PRD — referenciar `PRD §3`).
53
+ 4. **Escrita:** artefato markdown no path canônico `.atlas/plans/`. Teto orientativo ~250–350 linhas (até ~450 com slices).
54
+
55
+ ---
56
+
57
+ ## Metadados obrigatórios (topo do artefato)
58
+
59
+ ```md
60
+ ## Metadados de execução
61
+ - Plan prefix: `atlas`
62
+ - Execution mode: `sequencial (T01→TN)` | `orchestrated-per-slice`
63
+ - Executor skill: `atlas-plan-execute`
64
+ - Internal validator: `atlas-task-validator`
65
+ - External review: `atlas-slice-review` (optional)
66
+ ```
67
+
68
+ Regras:
69
+
70
+ - `Plan prefix` é sempre `atlas`.
71
+ - Se o modo não estiver decidido, o plano **não** está pronto para execução.
72
+ - Deixe explícito por que o modo escolhido é adequado, checks por task vs fechamento de slice e quando parar em `blocked`.
73
+
74
+ ---
75
+
76
+ ## Estrutura do plano (seções 1 a 8)
77
+
78
+ ### 1. Tradução executiva
79
+
80
+ - O que será implementado e o resultado observável técnico.
81
+ - Padrão de referência no monorepo e tabela **referência vs esta entrega** (ligar a `PRD §3` D*, não recopiar a tabela).
82
+ - Link ao PRD: `PRD §2` escopo, `PRD §3` decisões.
83
+
84
+ ### 2. Invariantes de execução (derivados do PRD)
85
+
86
+ - Invariantes técnicos inegociáveis (ex.: sem refetch ao filtrar).
87
+ - Referenciar IDs: `PRD §3 D12` — não colar a tabela D* inteira.
88
+
89
+ ### 3. Pitfalls
90
+
91
+ - `anti-padrão observado` → `padrão canônico correto` (ancorado no repo).
92
+
93
+ ### 4. Estado na abertura da sprint (pré-implementação)
94
+
95
+ - 3–6 bullets sobre o código hoje (comportamento/ausência — não inventário global de arquivos).
96
+ - Se já implementado: tratar como checklist de verificação.
97
+
98
+ ### 5. Tarefas de execução
99
+
100
+ Tarefas `#### T01.` … `#### TNN.` com schema de `BOUNDARY_PRD_PLAN.md` canônico empacotado:
101
+
102
+ - **Objetivo**
103
+ - **Referência** (módulo/padrão no monorepo — evite listas longas de paths; o executor descobre no repo)
104
+ - **Pré-condições**
105
+ - **Mudança esperada**
106
+ - **Invariantes preservados**
107
+ - **Não mudar** / **Não fazer**
108
+ - **Dependências**
109
+ - **Riscos** (se não óbvio)
110
+ - **Critério de done**
111
+ - **Validação local** (comando com path do package)
112
+ - **Quality gates** (opcional em tasks críticas)
113
+ - **Casos mínimos** (somente em tasks de teste)
114
+
115
+ **Regra de minimalismo estrutural (autoria de task):** ao redigir `Mudança esperada`, prefira a forma mínima viável que cumpre o `Critério de done` — reusar módulo/símbolo já existente no repo antes de introduzir nova abstração; usar stdlib/feature nativa antes de dependência nova; evitar indireção, factory, wrapper, camada ou opção de config não exigida por PRD/invariante. A regra recai **somente** sobre abstração/indireção/arquivo/dependência nova. **Nunca** reduz: validação de trust-boundary, error-handling, data-loss, invariantes §2, cobertura de cenário/teste e negative paths. Em dúvida entre enxuto e seguro, escolha seguro.
116
+
117
+ Última task típica: **Validação final** (checks reais da stack ativa e passos manuais alinhados a **PRD §4–6**). Flutter usa `flutter analyze/test`; Node e Python usam somente scripts/ferramentas declarados no repo/plano.
118
+
119
+ ### 6. Contratos técnicos (só ambiguidade PRD → código)
120
+
121
+ - Assinaturas, shapes e mapeamentos onde o PRD §5 não fecha implementação.
122
+
123
+ ### 7. Slices (somente se `execution_mode: orchestrated-per-slice`)
124
+
125
+ - Tabela: slice, tasks, objetivo, boundary de diff esperado.
126
+
127
+ ### 8. Validação e checklist (validator)
128
+
129
+ - Critérios derivados de **PRD §6** + invariantes **§2** deste plano.
130
+ - Título recomendado: `## 8. Validação e checklist (validator)`.
131
+ - Comandos globais aplicáveis ao package, derivados de manifests/scripts reais; nunca inventar `flutter`, `npm` ou `pytest`.
132
+
133
+ ---
134
+
135
+ ## Seção opcional
136
+
137
+ ### 9. Perguntas em aberto e bloqueios reais
138
+
139
+ - Só bloqueios que impedem execução segura. O executor **para** se houver itens ativos aqui.
140
+ - **Não** confundir com PRD §7 Apêndice (Referências).
141
+
142
+ ---
143
+
144
+ ## O que NÃO incluir (propositalmente)
145
+
146
+ - Handoff prompt final no artefato (o executor lê o arquivo; ver `BOUNDARY_PRD_PLAN.md` no repo ativo).
147
+ - Gate de prontidão do autor do plano.
148
+ - Lista integral de rules do `project-rules` (o executor carrega via `AGENTS.md`).
149
+ - Cópia integral do escopo/fora de escopo do PRD.
150
+ - Inventário global de todos os arquivos tocados.
151
+
152
+ ---
153
+
154
+ ## Uso standalone vs protocolo interno no workflow (PRD D10/D11)
155
+
156
+ Esta skill é de **autoria documental** (redigir um `PLAN_*.md`). A fronteira de determinismo do Atlas é a **mutação de código** (PRD D10): como redigir um plano não muta código, **autoria é livre, execução é gateada**.
157
+
158
+ ### (a) Uso standalone permitido
159
+
160
+ Você pode invocar `atlas-plan-handoff` diretamente, fora do pipeline, para escrever um plano. Não há restrição: autoria documental não muta o produto. O `PLAN_*.md` resultante é livre para existir e ser editado.
161
+
162
+ ### (b) O artefato NÃO é confiável só por existir
163
+
164
+ Um plano escrito standalone **não vale como gate aprovado** só porque existe — nem mesmo com nome `PLAN_*.md`. Ao entrar em execução (modos `full`/`direct`/`execute`), o plano é **re-gateado obrigatoriamente** por `atlas_verify_artifact` + `atlas_verify_template_conformance` (TC); no modo `execute`, essa reverificação na entrada é o equivalente ao gate pós-plano (PRD D13). Plano velho, manual, renomeado ou fora de conformidade **trava na entrada da execução**, não na autoria. Esta skill não declara o plano "executável de forma determinística" só por tê-lo escrito.
165
+
166
+ ### (c) Standalone vs protocolo interno no workflow
167
+
168
+ - **Standalone:** o usuário conduz a skill diretamente; o produto é o `PLAN_*.md`, sujeito a re-validação na entrada de execução.
169
+ - **No workflow:** quem conduz a fase de plano é o **orquestrador principal** (agente principal), que despacha/autora o plano antes de validá-lo e roda os gates MCP. Uma vez que o plano passa `atlas_verify_artifact` + TC, o orquestrador fica de mãos atadas (não edita mais o plano). A skill é a mesma; o que muda é quem orquestra e os gates que cercam a fase.
170
+
171
+ > **Invariante:** autoria é livre, execução é gateada. Um plano só vira confiável para execução após `atlas_verify_artifact` + TC na entrada (PRD D11).
172
+
173
+ ---
174
+
175
+ ## Consistência da cadeia
176
+
177
+ O próximo agente, só lendo o artefato, deve saber:
178
+
179
+ - usar apenas skills `atlas-*` declaradas nos metadados;
180
+ - respeitar `execution_mode`;
181
+ - rodar `atlas-task-validator` antes de fechar a slice;
182
+ - usar `atlas-slice-review` como segunda camada fria, não substituto do validator interno;
183
+ - cruzar aceite de negócio com **PRD §4–6** quando o checklist do §8 for fino.
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Atlas Plan Handoff"
3
+ short_description: "Handoff executável da família atlas-* com prefixo e modo fechados"
4
+ default_prompt: "Use $atlas-plan-handoff para produzir um plano executável da cadeia atlas-* com prefixo fechado, execution mode explícito, executor correto, validator interno obrigatório e review externo opcional."
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: atlas-prd-interview
3
+ description: Skill `atlas-prd-interview`. Use quando o usuário quer validar, interrogar ou amadurecer um PRD antes do planejamento ou implementação. Esta skill lê o PRD, cruza-o com código e contratos, detecta ambiguidades/discrepâncias, faz perguntas de múltipla escolha e para quando não restam gaps bloqueadores.
4
+ ---
5
+
6
+ # PRD Interview (Atlas)
7
+
8
+ Valide maturidade de PRD por entrevista guiada antes do planejamento ou implementação técnica. Não gere o PRD do zero. Não avance para o planejamento enquanto houver bloqueadores ativos (`❌`).
9
+
10
+ ## Resolução Canônica de Templates
11
+
12
+ * Fonte única: `packages/templates/` empacotado no plugin Atlas Workflow.
13
+ * Antes da entrevista, resolver `PRD_TEMPLATE.md` a partir da raiz do plugin/bundle.
14
+ * Template local do repo consumidor nunca sobrepõe o template empacotado.
15
+ * Se `packages/templates/PRD_TEMPLATE.md` não existir, abortar com erro claro: `Template canônico ausente: PRD_TEMPLATE.md`.
16
+ * Não usar fallback silencioso para cópias antigas, vault local ou templates globais.
17
+
18
+ ---
19
+
20
+ ## Escopo da Skill
21
+
22
+ Ataque principalmente as seguintes seções do template de PRD:
23
+ * **§3 Decisões de produto (fechadas)**
24
+ * **§4 Fluxos e cenários UX**
25
+ * **§5 Contrato funcional e invariantes** (regras de negócio + contrato de dados)
26
+ * **§6 Critérios de aceite (negócio)**
27
+
28
+ ---
29
+
30
+ ## Workflow Obrigatório
31
+
32
+ 1. **Leitura e Inspecção:** Leia o PRD e cruze com o código do repositório para verificar discrepâncias físicas reais (se componentes, rotas e APIs descritos batem com a codebase).
33
+ 2. **Mapeamento de Gaps:** Classifique cada lacuna como:
34
+ * `✅` **Completo:** Decisão suficiente e verificável.
35
+ * `⚠️` **Pendente:** Falta detalhe de negócio que pode ser resolvido depois (não-bloqueante).
36
+ * `❌` **Bloqueador:** Ambiguidade, conflito com o código ou falta de fluxo de UX crítico que impede o planejamento de engenharia.
37
+
38
+ **Mapeamento por Seções (Novo Template):**
39
+ * **§3 Decisões de produto (fechadas):** `❌` se faltar decisão que altere fluxo principal, mappers, roteamento ou comportamento crítico.
40
+ * **§4 Fluxos e cenários UX:** `❌` se impactar o fluxo principal e faltarem os caminhos de loading, erro, vazio ou permissões.
41
+ * **§5 Contrato funcional e invariantes:** `❌` se campos críticos não possuírem regras de formato (ex: decimais) ou se a regra de negócio for ambígua/impossível de verificar na codebase.
42
+ * **§6 Critérios de aceite (negócio):** `❌` se o critério for subjetivo, não observável ou não testável.
43
+
44
+ 3. **Resolver mecanismo estruturado:** chame `atlas_capabilities`, leia `question_prompt` e use seu `mechanism`/shape. Nunca hardcode nome de ferramenta de host. Se o descriptor estiver ausente ou indisponível, bloqueie a rodada; não degrade para pergunta livre sem correlação.
45
+ 4. **Perguntas por rodada:** formule no máximo 4 perguntas concisas, exatamente 3 opções, recomendada explícita e `decision_id` D* estável. Antes de perguntar, use `pendingInterviewQuestions` de `../_shared/scripts/document_quality.mjs` para excluir decisões já fechadas.
46
+ 5. **Persistência imediata:** ao receber respostas, grave-as no mesmo PRD antes de qualquer nova pergunta, preservando IDs/anchors e acrescentando histórico. Use `persistInterviewRound(prd_path, answers)`, que escreve via arquivo temporário + rename e valida readback; falha bloqueia. Nunca acumule respostas apenas no chat.
47
+ 6. **Reindexação:** releia o PRD salvo, reexecute o índice §3–§6 e recalcule perguntas pendentes. Decisão fechada não pode reaparecer em rodada posterior.
48
+ 7. **Veredito Final:** só emita `Pronto para planejamento` quando zerar todos os `❌`; no workflow, devolva controle ao orquestrador para reexecutar artifact/scan/TC.
49
+
50
+ ---
51
+
52
+ ## Índice Provisório (fim de cada rodada)
53
+
54
+ ```text
55
+ §3 Decisões: ✅/⚠️/❌
56
+ §4 Experiência: ✅/⚠️/❌
57
+ §5 Contrato+inv: ✅/⚠️/❌
58
+ §6 Aceite: ✅/⚠️/❌
59
+ ```
60
+
61
+ O índice é materializado novamente após cada persistência; não reutilize índice anterior à resposta.
62
+
63
+ ---
64
+
65
+ ## Uso standalone vs protocolo interno no workflow (PRD D10/D11)
66
+
67
+ Esta skill é de **autoria documental** (maturar um PRD). A fronteira de determinismo do Atlas é a **mutação de código** (PRD D10): como esta skill não muta código, **autoria é livre, execução é gateada**.
68
+
69
+ ### (a) Uso standalone permitido
70
+
71
+ Você pode invocar `atlas-prd-interview` diretamente, fora do pipeline, para amadurecer um PRD. Não há restrição: autoria documental não muta o produto. O artefato resultante (`PRD_*.md`) é livre para existir e ser editado.
72
+
73
+ ### (b) O artefato NÃO é confiável só por existir
74
+
75
+ Um PRD amadurecido standalone **não vale como gate aprovado** pelo simples fato de existir. Ao entrar em execução (modos `full`/`direct`/`execute`), ele é **re-gateado obrigatoriamente** por `atlas_verify_artifact` + `atlas_verify_template_conformance` (TC). PRD velho, manual ou inválido **trava na entrada da execução**, não na autoria. Esta skill não emite veredito de execução nem declara o PRD "pronto para implementar de forma determinística".
76
+
77
+ ### (c) Standalone vs protocolo interno no workflow
78
+
79
+ - **Standalone:** o usuário conduz a skill diretamente; o produto é o PRD maturado, sujeito a re-validação posterior.
80
+ - **No workflow:** quem conduz a fase de PRD é o **orquestrador principal** (agente principal), que decide quando entrevistar (scan de ambiguidade / `--interview`) e roda os gates MCP do pipeline. A skill é a mesma; o que muda é quem orquestra e os gates que cercam a fase.
81
+
82
+ > **Invariante:** autoria é livre, execução é gateada. Um PRD só vira confiável para execução após `atlas_verify_artifact` + TC na entrada (PRD D11).
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Atlas PRD Interview"
3
+ short_description: "Entrevista e saneia ambiguidades de PRD"
4
+ default_prompt: "Use $atlas-prd-interview para validar este PRD, cruzar com o código e fechar ambiguidades críticas em rodadas curtas de múltipla escolha."
5
+
6
+ policy:
7
+ allow_implicit_invocation: true